diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000000..325bfc036d --- /dev/null +++ b/.dockerignore @@ -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* diff --git a/.env.example b/.env.example new file mode 100644 index 0000000000..8463db78b3 --- /dev/null +++ b/.env.example @@ -0,0 +1,30 @@ +# ============================================ +# CAMAAR - Email Configuration +# ============================================ +# Copy this file to .env and fill in the values: +# cp .env.example .env +# +# GMAIL SETUP (Recommended): +# 1. Enable 2-Step Verification on your Google account: +# https://myaccount.google.com/security +# 2. Generate an App Password: +# https://myaccount.google.com/apppasswords +# 3. Use that App Password below (NOT your regular Gmail password) +# +# For other providers, change SMTP_ADDRESS, SMTP_PORT, SMTP_DOMAIN accordingly. +# ============================================ + +# Sender email address (shown as "From" in sent emails) +MAILER_FROM_ADDRESS=camaar@gmail.com + +# SMTP Configuration (Gmail defaults shown) +SMTP_ADDRESS=smtp.gmail.com +SMTP_PORT=587 +SMTP_USERNAME=your_email@gmail.com +SMTP_PASSWORD=your_16_digit_app_password +SMTP_DOMAIN=gmail.com + +# Application URL (used in email links for production) +# In development, this defaults to http://localhost:3000 +APP_HOST=localhost:3000 +APP_PROTOCOL=http \ No newline at end of file diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000000..8dc4323435 --- /dev/null +++ b/.gitattributes @@ -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. +db/schema.rb linguist-generated + +# Mark any vendored files as having been vendored. +vendor/* linguist-vendored +config/credentials/*.yml.enc diff=rails_credentials +config/credentials.yml.enc diff=rails_credentials diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000000..83610cfa4c --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,12 @@ +version: 2 +updates: +- package-ecosystem: bundler + directory: "/" + schedule: + interval: weekly + open-pull-requests-limit: 10 +- package-ecosystem: github-actions + directory: "/" + schedule: + interval: weekly + open-pull-requests-limit: 10 diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000000..48f6abf003 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,150 @@ +name: CI + +on: + pull_request: + push: + branches: [ main ] + +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 + + - 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 + + - 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 + + - name: Prepare RuboCop cache + uses: actions/cache@v4 + env: + DEPENDENCIES_HASH: ${{ hashFiles('.ruby-version', '**/.rubocop.yml', '**/.rubocop_todo.yml', 'Gemfile.lock') }} + with: + path: ${{ 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: + mysql: + image: mysql + env: + MYSQL_ALLOW_EMPTY_PASSWORD: true + ports: + - 3306:3306 + options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3 + + # 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: Install packages + run: sudo apt-get update && sudo apt-get install --no-install-recommends -y default-libmysqlclient-dev libvips + + - name: Checkout code + uses: actions/checkout@v6 + + - name: Set up Ruby + uses: ruby/setup-ruby@v1 + with: + bundler-cache: true + + - name: Run tests + env: + RAILS_ENV: test + DATABASE_URL: mysql2://127.0.0.1:3306 + # RAILS_MASTER_KEY: ${{ secrets.RAILS_MASTER_KEY }} + # REDIS_URL: redis://localhost:6379/0 + run: bin/rails db:test:prepare test + + system-test: + runs-on: ubuntu-latest + + services: + mysql: + image: mysql + env: + MYSQL_ALLOW_EMPTY_PASSWORD: true + ports: + - 3306:3306 + options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3 + + # 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: Install packages + run: sudo apt-get update && sudo apt-get install --no-install-recommends -y default-libmysqlclient-dev libvips + + - name: Checkout code + uses: actions/checkout@v6 + + - name: Set up Ruby + uses: ruby/setup-ruby@v1 + with: + bundler-cache: true + + - name: Run System Tests + env: + RAILS_ENV: test + DATABASE_URL: mysql2://127.0.0.1:3306 + # RAILS_MASTER_KEY: ${{ secrets.RAILS_MASTER_KEY }} + # REDIS_URL: redis://localhost:6379/0 + run: bin/rails db:test:prepare test:system + + - name: Keep screenshots from failed system tests + uses: actions/upload-artifact@v4 + if: failure() + with: + name: screenshots + path: ${{ github.workspace }}/tmp/screenshots + if-no-files-found: ignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000..bdd864e054 --- /dev/null +++ b/.gitignore @@ -0,0 +1,43 @@ +# 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 system/IDE folders +.idea/ + +# Ignore bundler config. +/.bundle + +# Ignore coverage +coverage/ + +# Ignore all environment files (but keep .env.example in the repo). +/.env* +!/.env.example + +# Ignore all logfiles and tempfiles. +/log/* +/tmp/* +!/log/.keep +!/tmp/.keep + +# Ignore pidfiles, but keep the directory. +/tmp/pids/* +!/tmp/pids/ +!/tmp/pids/.keep + +# Ignore storage (uploaded files in development and any SQLite databases). +/storage/* +!/storage/.keep +/tmp/storage/* +!/tmp/storage/ +!/tmp/storage/.keep + +/public/assets + +# Ignore key files for decrypting credentials and more. +/config/*.key + +/vendor/bundle diff --git a/.kamal/hooks/docker-setup.sample b/.kamal/hooks/docker-setup.sample new file mode 100755 index 0000000000..2fb07d7d7a --- /dev/null +++ b/.kamal/hooks/docker-setup.sample @@ -0,0 +1,3 @@ +#!/bin/sh + +echo "Docker set up on $KAMAL_HOSTS..." diff --git a/.kamal/hooks/post-app-boot.sample b/.kamal/hooks/post-app-boot.sample new file mode 100755 index 0000000000..70f9c4bc95 --- /dev/null +++ b/.kamal/hooks/post-app-boot.sample @@ -0,0 +1,3 @@ +#!/bin/sh + +echo "Booted app version $KAMAL_VERSION on $KAMAL_HOSTS..." diff --git a/.kamal/hooks/post-deploy.sample b/.kamal/hooks/post-deploy.sample new file mode 100755 index 0000000000..fd364c2a77 --- /dev/null +++ b/.kamal/hooks/post-deploy.sample @@ -0,0 +1,14 @@ +#!/bin/sh + +# A sample post-deploy hook +# +# These environment variables are available: +# KAMAL_RECORDED_AT +# KAMAL_PERFORMER +# KAMAL_VERSION +# KAMAL_HOSTS +# KAMAL_ROLES (if set) +# KAMAL_DESTINATION (if set) +# KAMAL_RUNTIME + +echo "$KAMAL_PERFORMER deployed $KAMAL_VERSION to $KAMAL_DESTINATION in $KAMAL_RUNTIME seconds" diff --git a/.kamal/hooks/post-proxy-reboot.sample b/.kamal/hooks/post-proxy-reboot.sample new file mode 100755 index 0000000000..1435a677f2 --- /dev/null +++ b/.kamal/hooks/post-proxy-reboot.sample @@ -0,0 +1,3 @@ +#!/bin/sh + +echo "Rebooted kamal-proxy on $KAMAL_HOSTS" diff --git a/.kamal/hooks/pre-app-boot.sample b/.kamal/hooks/pre-app-boot.sample new file mode 100755 index 0000000000..45f7355045 --- /dev/null +++ b/.kamal/hooks/pre-app-boot.sample @@ -0,0 +1,3 @@ +#!/bin/sh + +echo "Booting app version $KAMAL_VERSION on $KAMAL_HOSTS..." diff --git a/.kamal/hooks/pre-build.sample b/.kamal/hooks/pre-build.sample new file mode 100755 index 0000000000..c5a55678b2 --- /dev/null +++ b/.kamal/hooks/pre-build.sample @@ -0,0 +1,51 @@ +#!/bin/sh + +# A sample pre-build hook +# +# Checks: +# 1. We have a clean checkout +# 2. A remote is configured +# 3. The branch has been pushed to the remote +# 4. The version we are deploying matches the remote +# +# These environment variables are available: +# KAMAL_RECORDED_AT +# KAMAL_PERFORMER +# KAMAL_VERSION +# KAMAL_HOSTS +# KAMAL_ROLES (if set) +# KAMAL_DESTINATION (if set) + +if [ -n "$(git status --porcelain)" ]; then + echo "Git checkout is not clean, aborting..." >&2 + git status --porcelain >&2 + exit 1 +fi + +first_remote=$(git remote) + +if [ -z "$first_remote" ]; then + echo "No git remote set, aborting..." >&2 + exit 1 +fi + +current_branch=$(git branch --show-current) + +if [ -z "$current_branch" ]; then + echo "Not on a git branch, aborting..." >&2 + exit 1 +fi + +remote_head=$(git ls-remote $first_remote --tags $current_branch | cut -f1) + +if [ -z "$remote_head" ]; then + echo "Branch not pushed to remote, aborting..." >&2 + exit 1 +fi + +if [ "$KAMAL_VERSION" != "$remote_head" ]; then + echo "Version ($KAMAL_VERSION) does not match remote HEAD ($remote_head), aborting..." >&2 + exit 1 +fi + +exit 0 diff --git a/.kamal/hooks/pre-connect.sample b/.kamal/hooks/pre-connect.sample new file mode 100755 index 0000000000..77744bdca8 --- /dev/null +++ b/.kamal/hooks/pre-connect.sample @@ -0,0 +1,47 @@ +#!/usr/bin/env ruby + +# A sample pre-connect check +# +# Warms DNS before connecting to hosts in parallel +# +# These environment variables are available: +# KAMAL_RECORDED_AT +# KAMAL_PERFORMER +# KAMAL_VERSION +# KAMAL_HOSTS +# KAMAL_ROLES (if set) +# KAMAL_DESTINATION (if set) +# KAMAL_RUNTIME + +hosts = ENV["KAMAL_HOSTS"].split(",") +results = nil +max = 3 + +elapsed = Benchmark.realtime do + results = hosts.map do |host| + Thread.new do + tries = 1 + + begin + Socket.getaddrinfo(host, 0, Socket::AF_UNSPEC, Socket::SOCK_STREAM, nil, Socket::AI_CANONNAME) + rescue SocketError + if tries < max + puts "Retrying DNS warmup: #{host}" + tries += 1 + sleep rand + retry + else + puts "DNS warmup failed: #{host}" + host + end + end + + tries + end + end.map(&:value) +end + +retries = results.sum - hosts.size +nopes = results.count { |r| r == max } + +puts "Prewarmed %d DNS lookups in %.2f sec: %d retries, %d failures" % [ hosts.size, elapsed, retries, nopes ] diff --git a/.kamal/hooks/pre-deploy.sample b/.kamal/hooks/pre-deploy.sample new file mode 100755 index 0000000000..05b3055b72 --- /dev/null +++ b/.kamal/hooks/pre-deploy.sample @@ -0,0 +1,122 @@ +#!/usr/bin/env ruby + +# A sample pre-deploy hook +# +# Checks the Github status of the build, waiting for a pending build to complete for up to 720 seconds. +# +# Fails unless the combined status is "success" +# +# These environment variables are available: +# KAMAL_RECORDED_AT +# KAMAL_PERFORMER +# KAMAL_VERSION +# KAMAL_HOSTS +# KAMAL_COMMAND +# KAMAL_SUBCOMMAND +# KAMAL_ROLES (if set) +# KAMAL_DESTINATION (if set) + +# Only check the build status for production deployments +if ENV["KAMAL_COMMAND"] == "rollback" || ENV["KAMAL_DESTINATION"] != "production" + exit 0 +end + +require "bundler/inline" + +# true = install gems so this is fast on repeat invocations +gemfile(true, quiet: true) do + source "https://rubygems.org" + + gem "octokit" + gem "faraday-retry" +end + +MAX_ATTEMPTS = 72 +ATTEMPTS_GAP = 10 + +def exit_with_error(message) + $stderr.puts message + exit 1 +end + +class GithubStatusChecks + attr_reader :remote_url, :git_sha, :github_client, :combined_status + + def initialize + @remote_url = github_repo_from_remote_url + @git_sha = `git rev-parse HEAD`.strip + @github_client = Octokit::Client.new(access_token: ENV["GITHUB_TOKEN"]) + refresh! + end + + def refresh! + @combined_status = github_client.combined_status(remote_url, git_sha) + end + + def state + combined_status[:state] + end + + def first_status_url + first_status = combined_status[:statuses].find { |status| status[:state] == state } + first_status && first_status[:target_url] + end + + def complete_count + combined_status[:statuses].count { |status| status[:state] != "pending"} + end + + def total_count + combined_status[:statuses].count + end + + def current_status + if total_count > 0 + "Completed #{complete_count}/#{total_count} checks, see #{first_status_url} ..." + else + "Build not started..." + end + end + + private + def github_repo_from_remote_url + url = `git config --get remote.origin.url`.strip.delete_suffix(".git") + if url.start_with?("https://github.com/") + url.delete_prefix("https://github.com/") + elsif url.start_with?("git@github.com:") + url.delete_prefix("git@github.com:") + else + url + end + end +end + + +$stdout.sync = true + +begin + puts "Checking build status..." + + attempts = 0 + checks = GithubStatusChecks.new + + loop do + case checks.state + when "success" + puts "Checks passed, see #{checks.first_status_url}" + exit 0 + when "failure" + exit_with_error "Checks failed, see #{checks.first_status_url}" + when "pending" + attempts += 1 + end + + exit_with_error "Checks are still pending, gave up after #{MAX_ATTEMPTS * ATTEMPTS_GAP} seconds" if attempts == MAX_ATTEMPTS + + puts checks.current_status + sleep(ATTEMPTS_GAP) + checks.refresh! + end +rescue Octokit::NotFound + exit_with_error "Build status could not be found" +end diff --git a/.kamal/hooks/pre-proxy-reboot.sample b/.kamal/hooks/pre-proxy-reboot.sample new file mode 100755 index 0000000000..061f8059e6 --- /dev/null +++ b/.kamal/hooks/pre-proxy-reboot.sample @@ -0,0 +1,3 @@ +#!/bin/sh + +echo "Rebooting kamal-proxy on $KAMAL_HOSTS..." diff --git a/.kamal/secrets b/.kamal/secrets new file mode 100644 index 0000000000..b3089d6f5a --- /dev/null +++ b/.kamal/secrets @@ -0,0 +1,20 @@ +# Secrets defined here are available for reference under registry/password, env/secret, builder/secrets, +# and accessories/*/env/secret in config/deploy.yml. All secrets should be pulled from either +# password manager, ENV, or a file. DO NOT ENTER RAW CREDENTIALS HERE! This file needs to be safe for git. + +# Example of extracting secrets from 1password (or another compatible pw manager) +# SECRETS=$(kamal secrets fetch --adapter 1password --account your-account --from Vault/Item KAMAL_REGISTRY_PASSWORD RAILS_MASTER_KEY) +# KAMAL_REGISTRY_PASSWORD=$(kamal secrets extract KAMAL_REGISTRY_PASSWORD ${SECRETS}) +# RAILS_MASTER_KEY=$(kamal secrets extract RAILS_MASTER_KEY ${SECRETS}) + +# Example of extracting secrets from Rails credentials +# KAMAL_REGISTRY_PASSWORD=$(rails credentials:fetch kamal.registry_password) + +# Use a GITHUB_TOKEN if private repositories are needed for the image +# GITHUB_TOKEN=$(gh config get -h github.com oauth_token) + +# Grab the registry password from ENV +# KAMAL_REGISTRY_PASSWORD=$KAMAL_REGISTRY_PASSWORD + +# Improve security by using a password manager. Never check config/master.key into git! +RAILS_MASTER_KEY=$(cat config/master.key) diff --git a/.rspec b/.rspec new file mode 100644 index 0000000000..c99d2e7396 --- /dev/null +++ b/.rspec @@ -0,0 +1 @@ +--require spec_helper diff --git a/.rubocop.yml b/.rubocop.yml new file mode 100644 index 0000000000..f9d86d4a54 --- /dev/null +++ b/.rubocop.yml @@ -0,0 +1,8 @@ +# Omakase Ruby styling for Rails +inherit_gem: { rubocop-rails-omakase: rubocop.yml } + +# Overwrite or add rules to create your own house style +# +# # Use `[a, [b, c]]` not `[ a, [ b, c ] ]` +# Layout/SpaceInsideArrayLiteralBrackets: +# Enabled: false diff --git a/.ruby-version b/.ruby-version new file mode 100644 index 0000000000..4d54daddb6 --- /dev/null +++ b/.ruby-version @@ -0,0 +1 @@ +4.0.2 diff --git a/.rubycritic.yml b/.rubycritic.yml new file mode 100644 index 0000000000..72f3d13228 --- /dev/null +++ b/.rubycritic.yml @@ -0,0 +1,12 @@ +paths: + - app/ +exclude_paths: + - spec/ + - test/ + - features/ + - vendor/ + - db/ + - config/ + - bin/ + - lib/ + - doc/ \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000000..c625035af4 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,77 @@ +# syntax=docker/dockerfile:1 +# check=error=true + +# This Dockerfile is designed for production, not development. Use with Kamal or build'n'run by hand: +# docker build -t camaar . +# docker run -d -p 80:80 -e RAILS_MASTER_KEY= --name camaar camaar + +# For a containerized dev environment, see Dev Containers: https://guides.rubyonrails.org/getting_started_with_devcontainer.html + +# Make sure RUBY_VERSION matches the Ruby version in .ruby-version +ARG RUBY_VERSION=4.0.2 +FROM docker.io/library/ruby:$RUBY_VERSION-slim AS base + +# Rails app lives here +WORKDIR /rails + +# Install base packages +RUN apt-get update -qq && \ + apt-get install --no-install-recommends -y curl default-mysql-client libjemalloc2 libvips && \ + ln -s /usr/lib/$(uname -m)-linux-gnu/libjemalloc.so.2 /usr/local/lib/libjemalloc.so && \ + rm -rf /var/lib/apt/lists /var/cache/apt/archives + +# Set production environment variables and enable jemalloc for reduced memory usage and latency. +ENV RAILS_ENV="production" \ + BUNDLE_DEPLOYMENT="1" \ + BUNDLE_PATH="/usr/local/bundle" \ + BUNDLE_WITHOUT="development" \ + LD_PRELOAD="/usr/local/lib/libjemalloc.so" + +# Throw-away build stage to reduce size of final image +FROM base AS build + +# Install packages needed to build gems +RUN apt-get update -qq && \ + apt-get install --no-install-recommends -y build-essential default-libmysqlclient-dev git libvips libyaml-dev pkg-config && \ + rm -rf /var/lib/apt/lists /var/cache/apt/archives + +# Install application gems +COPY vendor/* ./vendor/ +COPY Gemfile Gemfile.lock ./ + +RUN bundle install && \ + rm -rf ~/.bundle/ "${BUNDLE_PATH}"/ruby/*/cache "${BUNDLE_PATH}"/ruby/*/bundler/gems/*/.git && \ + # -j 1 disable parallel compilation to avoid a QEMU bug: https://github.com/rails/bootsnap/issues/495 + bundle exec bootsnap precompile -j 1 --gemfile + +# Copy application code +COPY . . + +# Precompile bootsnap code for faster boot times. +# -j 1 disable parallel compilation to avoid a QEMU bug: https://github.com/rails/bootsnap/issues/495 +RUN bundle exec bootsnap precompile -j 1 app/ lib/ + +# Precompiling assets for production without requiring secret RAILS_MASTER_KEY +RUN SECRET_KEY_BASE_DUMMY=1 ./bin/rails assets:precompile + + + + +# Final stage for app image +FROM base + +# Run and own only the runtime files as a non-root user for security +RUN groupadd --system --gid 1000 rails && \ + useradd rails --uid 1000 --gid 1000 --create-home --shell /bin/bash +USER 1000:1000 + +# Copy built artifacts: gems, application +COPY --chown=rails:rails --from=build "${BUNDLE_PATH}" "${BUNDLE_PATH}" +COPY --chown=rails:rails --from=build /rails /rails + +# Entrypoint prepares the database. +ENTRYPOINT ["/rails/bin/docker-entrypoint"] + +# Start server via Thruster by default, this can be overwritten at runtime +EXPOSE 80 +CMD ["./bin/thrust", "./bin/rails", "server"] diff --git a/Gemfile b/Gemfile new file mode 100644 index 0000000000..fc8a540333 --- /dev/null +++ b/Gemfile @@ -0,0 +1,81 @@ +source "https://rubygems.org" + +# Bundle edge Rails instead: gem "rails", github: "rails/rails", branch: "main" +gem "rails", "~> 8.1.3" +# The modern asset pipeline for Rails [https://github.com/rails/propshaft] +gem "propshaft" +# Use mysql as the database for Active Record +gem "mysql2", "~> 0.5" +# Use the Puma web server [https://github.com/puma/puma] +gem "puma", ">= 5.0" +# Use JavaScript with ESM import maps [https://github.com/rails/importmap-rails] +gem "importmap-rails" +# Hotwire's SPA-like page accelerator [https://turbo.hotwired.dev] +gem "turbo-rails" +# Hotwire's modest JavaScript framework [https://stimulus.hotwired.dev] +gem "stimulus-rails" +# Build JSON APIs with ease [https://github.com/rails/jbuilder] +gem "jbuilder" + +gem "rdoc", ">= 6.3.1" + + +# Use Active Model has_secure_password [https://guides.rubyonrails.org/active_model_basics.html#securepassword] +gem "bcrypt", "~> 3.1.7" + +# Windows does not include zoneinfo files, so bundle the tzinfo-data gem +gem "tzinfo-data", platforms: %i[ windows jruby ] + +# Use the database-backed adapters for Rails.cache, Active Job, and Action Cable +gem "solid_cache" +gem "solid_queue" +gem "solid_cable" + +# Reduces boot times through caching; required in config/boot.rb +gem "bootsnap", require: false + +gem "csv" + +# Deploy this application anywhere as a Docker container [https://kamal-deploy.org] +gem "kamal", require: false + +# Add HTTP asset caching/compression and X-Sendfile acceleration to Puma [https://github.com/basecamp/thruster/] +gem "thruster", require: false + +# Use Active Storage variants [https://guides.rubyonrails.org/active_storage_overview.html#transforming-images] +gem "image_processing", "~> 1.2" + +group :development, :test do + # See https://guides.rubyonrails.org/debugging_rails_applications.html#debugging-with-the-debug-gem + gem "debug", platforms: %i[ mri windows ], require: "debug/prelude" + + # Load environment variables from .env file + gem "dotenv-rails" + + # Audits gems for known security defects (use config/bundler-audit.yml to ignore issues) + gem "bundler-audit", require: false + + # Static analysis for security vulnerabilities [https://brakemanscanner.org/] + gem "brakeman", require: false + + # Omakase Ruby styling [https://github.com/rails/rubocop-rails-omakase/] + gem "rubocop-rails-omakase", require: false + + gem "rspec-rails" + + gem "rubycritic", require: false +end + +group :development do + # Use console on exceptions pages [https://github.com/rails/web-console] + gem "web-console" +end + +group :test do + # Use system testing [https://guides.rubyonrails.org/testing.html#system-testing] + gem "capybara" + gem "selenium-webdriver" + gem "cucumber-rails", require: false + gem "database_cleaner" + gem "simplecov", require: false +end diff --git a/Gemfile.lock b/Gemfile.lock new file mode 100644 index 0000000000..9b1d001679 --- /dev/null +++ b/Gemfile.lock @@ -0,0 +1,783 @@ +GEM + remote: https://rubygems.org/ + specs: + action_text-trix (2.1.19) + railties + actioncable (8.1.3) + actionpack (= 8.1.3) + activesupport (= 8.1.3) + nio4r (~> 2.0) + websocket-driver (>= 0.6.1) + zeitwerk (~> 2.6) + actionmailbox (8.1.3) + actionpack (= 8.1.3) + activejob (= 8.1.3) + activerecord (= 8.1.3) + activestorage (= 8.1.3) + activesupport (= 8.1.3) + mail (>= 2.8.0) + actionmailer (8.1.3) + actionpack (= 8.1.3) + actionview (= 8.1.3) + activejob (= 8.1.3) + activesupport (= 8.1.3) + mail (>= 2.8.0) + rails-dom-testing (~> 2.2) + actionpack (8.1.3) + actionview (= 8.1.3) + activesupport (= 8.1.3) + nokogiri (>= 1.8.5) + rack (>= 2.2.4) + rack-session (>= 1.0.1) + rack-test (>= 0.6.3) + rails-dom-testing (~> 2.2) + rails-html-sanitizer (~> 1.6) + useragent (~> 0.16) + actiontext (8.1.3) + action_text-trix (~> 2.1.15) + actionpack (= 8.1.3) + activerecord (= 8.1.3) + activestorage (= 8.1.3) + activesupport (= 8.1.3) + globalid (>= 0.6.0) + nokogiri (>= 1.8.5) + actionview (8.1.3) + activesupport (= 8.1.3) + builder (~> 3.1) + erubi (~> 1.11) + rails-dom-testing (~> 2.2) + rails-html-sanitizer (~> 1.6) + activejob (8.1.3) + activesupport (= 8.1.3) + globalid (>= 0.3.6) + activemodel (8.1.3) + activesupport (= 8.1.3) + activerecord (8.1.3) + activemodel (= 8.1.3) + activesupport (= 8.1.3) + timeout (>= 0.4.0) + activestorage (8.1.3) + actionpack (= 8.1.3) + activejob (= 8.1.3) + activerecord (= 8.1.3) + activesupport (= 8.1.3) + marcel (~> 1.0) + activesupport (8.1.3) + base64 + bigdecimal + concurrent-ruby (~> 1.0, >= 1.3.1) + connection_pool (>= 2.2.5) + drb + i18n (>= 1.6, < 2) + json + logger (>= 1.4.2) + minitest (>= 5.1) + securerandom (>= 0.3) + tzinfo (~> 2.0, >= 2.0.5) + uri (>= 0.13.1) + addressable (2.9.0) + public_suffix (>= 2.0.2, < 8.0) + ast (2.4.3) + axiom-types (0.1.1) + descendants_tracker (~> 0.0.4) + ice_nine (~> 0.11.0) + thread_safe (~> 0.3, >= 0.3.1) + base64 (0.3.0) + bcrypt (3.1.22) + bcrypt_pbkdf (1.1.2) + bigdecimal (4.1.2) + bindex (0.8.1) + bootsnap (1.24.6) + msgpack (~> 1.2) + brakeman (8.0.5) + racc + builder (3.3.0) + bundler-audit (0.9.3) + bundler (>= 1.2.0) + thor (~> 1.0) + capybara (3.40.0) + addressable + matrix + mini_mime (>= 0.1.3) + nokogiri (~> 1.11) + rack (>= 1.6.0) + rack-test (>= 0.6.3) + regexp_parser (>= 1.5, < 3.0) + xpath (~> 3.2) + childprocess (5.1.0) + logger (~> 1.5) + coercible (1.0.0) + descendants_tracker (~> 0.0.1) + concurrent-ruby (1.3.7) + connection_pool (3.0.2) + crass (1.0.6) + csv (3.3.5) + cucumber (10.2.0) + base64 (~> 0.2) + builder (~> 3.2) + cucumber-ci-environment (> 9, < 12) + cucumber-core (> 15, < 17) + cucumber-cucumber-expressions (> 17, < 20) + cucumber-html-formatter (> 21, < 23) + diff-lcs (~> 1.5) + logger (~> 1.6) + mini_mime (~> 1.1) + multi_test (~> 1.1) + sys-uname (~> 1.3) + cucumber-ci-environment (11.0.0) + cucumber-core (16.2.0) + cucumber-gherkin (> 36, < 40) + cucumber-messages (> 31, < 33) + cucumber-tag-expressions (> 6, < 9) + cucumber-cucumber-expressions (19.0.1) + bigdecimal + cucumber-gherkin (39.1.0) + cucumber-messages (>= 31, < 33) + cucumber-html-formatter (22.3.0) + cucumber-messages (> 23, < 33) + cucumber-messages (32.3.1) + cucumber-rails (4.0.1) + capybara (>= 3.25, < 4) + cucumber (>= 7, < 11) + railties (>= 6.1, < 9) + cucumber-tag-expressions (8.1.0) + database_cleaner (2.1.0) + database_cleaner-active_record (>= 2, < 3) + database_cleaner-active_record (2.2.2) + activerecord (>= 5.a) + database_cleaner-core (~> 2.0) + database_cleaner-core (2.1.0) + date (3.5.1) + debug (1.11.1) + irb (~> 1.10) + reline (>= 0.3.8) + descendants_tracker (0.0.4) + thread_safe (~> 0.3, >= 0.3.1) + diff-lcs (1.6.2) + docile (1.4.1) + dotenv (3.2.0) + dotenv-rails (3.2.0) + dotenv (= 3.2.0) + railties (>= 6.1) + drb (2.2.3) + dry-configurable (1.3.0) + dry-core (~> 1.1) + zeitwerk (~> 2.6) + dry-core (1.2.0) + concurrent-ruby (~> 1.0) + logger + zeitwerk (~> 2.6) + dry-inflector (1.3.1) + dry-initializer (3.2.0) + dry-logic (1.6.0) + bigdecimal + concurrent-ruby (~> 1.0) + dry-core (~> 1.1) + zeitwerk (~> 2.6) + dry-schema (1.16.0) + concurrent-ruby (~> 1.0) + dry-configurable (~> 1.0, >= 1.0.1) + dry-core (~> 1.1) + dry-initializer (~> 3.2) + dry-logic (~> 1.6) + dry-types (~> 1.9, >= 1.9.1) + zeitwerk (~> 2.6) + dry-types (1.9.1) + bigdecimal (>= 3.0) + concurrent-ruby (~> 1.0) + dry-core (~> 1.0) + dry-inflector (~> 1.0) + dry-logic (~> 1.4) + zeitwerk (~> 2.6) + ed25519 (1.4.0) + erb (6.0.4) + erubi (1.13.1) + et-orbi (1.4.0) + tzinfo + ffi (1.17.4-aarch64-linux-gnu) + ffi (1.17.4-aarch64-linux-musl) + ffi (1.17.4-arm-linux-gnu) + ffi (1.17.4-arm-linux-musl) + ffi (1.17.4-arm64-darwin) + ffi (1.17.4-x64-mingw-ucrt) + ffi (1.17.4-x86_64-linux-gnu) + ffi (1.17.4-x86_64-linux-musl) + flay (2.14.4) + erubi (~> 1.10) + path_expander (~> 2.0) + prism (~> 1.7) + sexp_processor (~> 4.0) + flog (4.9.4) + path_expander (~> 2.0) + prism (~> 1.7) + sexp_processor (~> 4.8) + fugit (1.12.2) + et-orbi (~> 1.4) + raabro (~> 1.4) + globalid (1.3.0) + activesupport (>= 6.1) + i18n (1.15.0) + concurrent-ruby (~> 1.0) + ice_nine (0.11.2) + image_processing (1.14.0) + mini_magick (>= 4.9.5, < 6) + ruby-vips (>= 2.0.17, < 3) + importmap-rails (2.2.3) + actionpack (>= 6.0.0) + activesupport (>= 6.0.0) + railties (>= 6.0.0) + io-console (0.8.2) + irb (1.18.0) + pp (>= 0.6.0) + prism (>= 1.3.0) + rdoc (>= 4.0.0) + reline (>= 0.4.2) + jbuilder (2.15.1) + actionview (>= 7.0.0) + activesupport (>= 7.0.0) + json (2.19.9) + kamal (2.11.0) + activesupport (>= 7.0) + base64 (~> 0.2) + bcrypt_pbkdf (~> 1.0) + concurrent-ruby (~> 1.2) + dotenv (~> 3.1) + ed25519 (~> 1.4) + net-ssh (~> 7.3) + sshkit (>= 1.23.0, < 2.0) + thor (~> 1.3) + zeitwerk (>= 2.6.18, < 3.0) + language_server-protocol (3.17.0.5) + launchy (3.1.1) + addressable (~> 2.8) + childprocess (~> 5.0) + logger (~> 1.6) + lint_roller (1.1.0) + logger (1.7.0) + loofah (2.25.1) + crass (~> 1.0.2) + nokogiri (>= 1.12.0) + mail (2.9.0) + logger + mini_mime (>= 0.1.1) + net-imap + net-pop + net-smtp + marcel (1.2.1) + matrix (0.4.3) + memoist3 (1.0.0) + mini_magick (5.3.1) + logger + mini_mime (1.1.5) + minitest (6.0.6) + drb (~> 2.0) + prism (~> 1.5) + msgpack (1.8.3) + multi_test (1.1.0) + mysql2 (0.5.7) + bigdecimal + net-imap (0.6.4.1) + date + net-protocol + net-pop (0.1.2) + net-protocol + net-protocol (0.2.2) + timeout + net-scp (4.1.0) + net-ssh (>= 2.6.5, < 8.0.0) + net-sftp (4.0.0) + net-ssh (>= 5.0.0, < 8.0.0) + net-smtp (0.5.1) + net-protocol + net-ssh (7.3.2) + nio4r (2.7.5) + nokogiri (1.19.3-aarch64-linux-gnu) + racc (~> 1.4) + nokogiri (1.19.3-aarch64-linux-musl) + racc (~> 1.4) + nokogiri (1.19.3-arm-linux-gnu) + racc (~> 1.4) + nokogiri (1.19.3-arm-linux-musl) + racc (~> 1.4) + nokogiri (1.19.3-arm64-darwin) + racc (~> 1.4) + nokogiri (1.19.3-x64-mingw-ucrt) + racc (~> 1.4) + nokogiri (1.19.3-x86_64-linux-gnu) + racc (~> 1.4) + nokogiri (1.19.3-x86_64-linux-musl) + racc (~> 1.4) + ostruct (0.6.3) + parallel (1.28.0) + parser (3.3.11.1) + ast (~> 2.4.1) + racc + path_expander (2.0.1) + pp (0.6.3) + prettyprint + prettyprint (0.2.0) + prism (1.9.0) + propshaft (1.3.2) + actionpack (>= 7.0.0) + activesupport (>= 7.0.0) + rack + psych (5.4.0) + date + stringio + public_suffix (7.0.5) + puma (8.0.2) + nio4r (~> 2.0) + raabro (1.4.0) + racc (1.8.1) + rack (3.2.6) + rack-session (2.1.2) + base64 (>= 0.1.0) + rack (>= 3.0.0) + rack-test (2.2.0) + rack (>= 1.3) + rackup (2.3.1) + rack (>= 3) + rails (8.1.3) + actioncable (= 8.1.3) + actionmailbox (= 8.1.3) + actionmailer (= 8.1.3) + actionpack (= 8.1.3) + actiontext (= 8.1.3) + actionview (= 8.1.3) + activejob (= 8.1.3) + activemodel (= 8.1.3) + activerecord (= 8.1.3) + activestorage (= 8.1.3) + activesupport (= 8.1.3) + bundler (>= 1.15.0) + railties (= 8.1.3) + rails-dom-testing (2.3.0) + activesupport (>= 5.0.0) + minitest + nokogiri (>= 1.6) + rails-html-sanitizer (1.7.0) + loofah (~> 2.25) + nokogiri (>= 1.15.7, != 1.16.7, != 1.16.6, != 1.16.5, != 1.16.4, != 1.16.3, != 1.16.2, != 1.16.1, != 1.16.0.rc1, != 1.16.0) + railties (8.1.3) + actionpack (= 8.1.3) + activesupport (= 8.1.3) + irb (~> 1.13) + rackup (>= 1.0.0) + rake (>= 12.2) + thor (~> 1.0, >= 1.2.2) + tsort (>= 0.2) + zeitwerk (~> 2.6) + rainbow (3.1.1) + rake (13.4.2) + rdoc (7.2.0) + erb + psych (>= 4.0.0) + tsort + reek (6.5.0) + dry-schema (~> 1.13) + logger (~> 1.6) + parser (~> 3.3.0) + rainbow (>= 2.0, < 4.0) + rexml (~> 3.1) + regexp_parser (2.12.0) + reline (0.6.3) + io-console (~> 0.5) + rexml (3.4.4) + rspec-core (3.13.6) + rspec-support (~> 3.13.0) + rspec-expectations (3.13.5) + diff-lcs (>= 1.2.0, < 2.0) + rspec-support (~> 3.13.0) + rspec-mocks (3.13.8) + diff-lcs (>= 1.2.0, < 2.0) + rspec-support (~> 3.13.0) + rspec-rails (8.0.4) + actionpack (>= 7.2) + activesupport (>= 7.2) + railties (>= 7.2) + rspec-core (>= 3.13.0, < 5.0.0) + rspec-expectations (>= 3.13.0, < 5.0.0) + rspec-mocks (>= 3.13.0, < 5.0.0) + rspec-support (>= 3.13.0, < 5.0.0) + rspec-support (3.13.7) + rubocop (1.88.0) + json (~> 2.3) + language_server-protocol (~> 3.17.0.2) + lint_roller (~> 1.1.0) + parallel (>= 1.10) + parser (>= 3.3.0.2) + rainbow (>= 2.2.2, < 4.0) + regexp_parser (>= 2.9.3, < 3.0) + rubocop-ast (>= 1.49.0, < 2.0) + ruby-progressbar (~> 1.7) + unicode-display_width (>= 2.4.0, < 4.0) + rubocop-ast (1.49.1) + parser (>= 3.3.7.2) + prism (~> 1.7) + rubocop-performance (1.26.1) + lint_roller (~> 1.1) + rubocop (>= 1.75.0, < 2.0) + rubocop-ast (>= 1.47.1, < 2.0) + rubocop-rails (2.35.4) + activesupport (>= 4.2.0) + lint_roller (~> 1.1) + rack (>= 1.1) + rubocop (>= 1.75.0, < 2.0) + rubocop-ast (>= 1.44.0, < 2.0) + rubocop-rails-omakase (1.1.0) + rubocop (>= 1.72) + rubocop-performance (>= 1.24) + rubocop-rails (>= 2.30) + ruby-progressbar (1.13.0) + ruby-vips (2.3.0) + ffi (~> 1.12) + logger + ruby_parser (3.22.0) + racc (~> 1.5) + sexp_processor (~> 4.16) + rubycritic (5.0.0) + flay (~> 2.13) + flog (~> 4.7) + launchy (>= 2.5.2) + ostruct + parser (>= 3.3.0.5) + prism (>= 1.6.0) + rainbow (~> 3.1.1) + reek (~> 6.5.0, < 7.0) + rexml + ruby_parser (~> 3.21) + simplecov (>= 0.22.0) + tty-which (~> 0.5.0) + virtus (~> 2.0) + rubyzip (3.4.0) + securerandom (0.4.1) + selenium-webdriver (4.44.0) + base64 (~> 0.2) + logger (~> 1.4) + rexml (~> 3.2, >= 3.2.5) + rubyzip (>= 1.2.2, < 4.0) + websocket (~> 1.0) + sexp_processor (4.17.5) + simplecov (0.22.0) + docile (~> 1.1) + simplecov-html (~> 0.11) + simplecov_json_formatter (~> 0.1) + simplecov-html (0.13.2) + simplecov_json_formatter (0.1.4) + solid_cable (3.0.12) + actioncable (>= 7.2) + activejob (>= 7.2) + activerecord (>= 7.2) + railties (>= 7.2) + solid_cache (1.0.10) + activejob (>= 7.2) + activerecord (>= 7.2) + railties (>= 7.2) + solid_queue (1.4.0) + activejob (>= 7.1) + activerecord (>= 7.1) + concurrent-ruby (>= 1.3.1) + fugit (~> 1.11) + railties (>= 7.1) + thor (>= 1.3.1) + sshkit (1.25.0) + base64 + logger + net-scp (>= 1.1.2) + net-sftp (>= 2.1.2) + net-ssh (>= 2.8.0) + ostruct + stimulus-rails (1.3.4) + railties (>= 6.0.0) + stringio (3.2.0) + sys-uname (1.5.1) + ffi (~> 1.1) + memoist3 (~> 1.0.0) + sys-uname (1.5.1-universal-mingw32) + ffi (~> 1.1) + memoist3 (~> 1.0.0) + win32ole + thor (1.5.0) + thread_safe (0.3.6) + thruster (0.1.21) + thruster (0.1.21-aarch64-linux) + thruster (0.1.21-arm64-darwin) + thruster (0.1.21-x86_64-linux) + timeout (0.6.1) + tsort (0.2.0) + tty-which (0.5.0) + turbo-rails (2.0.23) + actionpack (>= 7.1.0) + railties (>= 7.1.0) + tzinfo (2.0.6) + concurrent-ruby (~> 1.0) + tzinfo-data (1.2026.2) + tzinfo (>= 1.0.0) + unicode-display_width (3.2.0) + unicode-emoji (~> 4.1) + unicode-emoji (4.2.0) + uri (1.1.1) + useragent (0.16.11) + virtus (2.0.0) + axiom-types (~> 0.1) + coercible (~> 1.0) + descendants_tracker (~> 0.0, >= 0.0.3) + web-console (4.3.0) + actionview (>= 8.0.0) + bindex (>= 0.4.0) + railties (>= 8.0.0) + websocket (1.2.11) + websocket-driver (0.8.1) + base64 + websocket-extensions (>= 0.1.0) + websocket-extensions (0.1.5) + win32ole (1.9.3) + xpath (3.2.0) + nokogiri (~> 1.8) + zeitwerk (2.8.2) + +PLATFORMS + aarch64-linux + aarch64-linux-gnu + aarch64-linux-musl + arm-linux-gnu + arm-linux-musl + arm64-darwin-25 + x64-mingw-ucrt + x86_64-linux + x86_64-linux-gnu + x86_64-linux-musl + +DEPENDENCIES + bcrypt (~> 3.1.7) + bootsnap + brakeman + bundler-audit + capybara + csv + cucumber-rails + database_cleaner + debug + dotenv-rails + image_processing (~> 1.2) + importmap-rails + jbuilder + kamal + mysql2 (~> 0.5) + propshaft + puma (>= 5.0) + rails (~> 8.1.3) + rdoc (>= 6.3.1) + rspec-rails + rubocop-rails-omakase + rubycritic + selenium-webdriver + simplecov + solid_cable + solid_cache + solid_queue + stimulus-rails + thruster + turbo-rails + tzinfo-data + web-console + +CHECKSUMS + action_text-trix (2.1.19) sha256=7012f59421009cf284aa651294896414d653a61a2417c9b8714c8476d2f74009 + actioncable (8.1.3) sha256=e5bc7f75e44e6a22de29c4f43176927c3a9ce4824464b74ed18d8226e75a80f0 + actionmailbox (8.1.3) sha256=df7da474eaa0e70df4ed5a6fef66eb3b3b0f2dbf7f14518deee8d77f1b4aae59 + actionmailer (8.1.3) sha256=831f724891bb70d0aaa4d76581a6321124b6a752cb655c9346aae5479318448d + actionpack (8.1.3) sha256=af998cae4d47c5d581a2cc363b5c77eb718b7c4b45748d81b1887b25621c29a3 + actiontext (8.1.3) sha256=d291019c00e1ea9e6463011fa214f6081a56d7b9a1d224e7d3f6384c1dafc7d2 + actionview (8.1.3) sha256=1347c88c7f3edb38100c5ce0e9fb5e62d7755f3edc1b61cce2eb0b2c6ea2fd5d + activejob (8.1.3) sha256=a149b1766aa8204c3c3da7309e4becd40fcd5529c348cffbf6c9b16b565fe8d3 + activemodel (8.1.3) sha256=90c05cbe4cef3649b8f79f13016191ea94c4525ce4a5c0fb7ef909c4b91c8219 + activerecord (8.1.3) sha256=8003be7b2466ba0a2a670e603eeb0a61dd66058fccecfc49901e775260ac70ab + activestorage (8.1.3) sha256=0564ce9309143951a67615e1bb4e090ee54b8befed417133cae614479b46384d + activesupport (8.1.3) sha256=21a5e0dfbd4c3ddd9e1317ec6a4d782fa226e7867dc70b0743acda81a1dca20e + addressable (2.9.0) sha256=7fdf6ac3660f7f4e867a0838be3f6cf722ace541dd97767fa42bc6cfa980c7af + ast (2.4.3) sha256=954615157c1d6a382bc27d690d973195e79db7f55e9765ac7c481c60bdb4d383 + axiom-types (0.1.1) sha256=c1ff113f3de516fa195b2db7e0a9a95fd1b08475a502ff660d04507a09980383 + base64 (0.3.0) sha256=27337aeabad6ffae05c265c450490628ef3ebd4b67be58257393227588f5a97b + bcrypt (3.1.22) sha256=1f0072e88c2d705d94aff7f2c5cb02eb3f1ec4b8368671e19112527489f29032 + bcrypt_pbkdf (1.1.2) sha256=c2414c23ce66869b3eb9f643d6a3374d8322dfb5078125c82792304c10b94cf6 + bigdecimal (4.1.2) sha256=53d217666027eab4280346fba98e7d5b66baaae1b9c3c1c0ffe89d48188a3fbd + bindex (0.8.1) sha256=7b1ecc9dc539ed8bccfc8cb4d2732046227b09d6f37582ff12e50a5047ceb17e + bootsnap (1.24.6) sha256=c60bab88c70332290f0a2636a288f675299eb4f804a02a3c085b42eca9da164a + brakeman (8.0.5) sha256=03735f9690d3fd4b32d66aacbf0a6d15a84266bdd06b32c05c8ecc8f6021d2be + builder (3.3.0) sha256=497918d2f9dca528fdca4b88d84e4ef4387256d984b8154e9d5d3fe5a9c8835f + bundler-audit (0.9.3) sha256=81c8766c71e47d0d28a0f98c7eed028539f21a6ea3cd8f685eb6f42333c9b4e9 + capybara (3.40.0) sha256=42dba720578ea1ca65fd7a41d163dd368502c191804558f6e0f71b391054aeef + childprocess (5.1.0) sha256=9a8d484be2fd4096a0e90a0cd3e449a05bc3aa33f8ac9e4d6dcef6ac1455b6ec + coercible (1.0.0) sha256=5081ad24352cc8435ce5472bc2faa30260c7ea7f2102cc6a9f167c4d9bffaadc + concurrent-ruby (1.3.7) sha256=4412caec3a5ea2e5fdc52076724c071a81f2c0593d83b2ac8cbb8ca63b3151b0 + connection_pool (3.0.2) sha256=33fff5ba71a12d2aa26cb72b1db8bba2a1a01823559fb01d29eb74c286e62e0a + crass (1.0.6) sha256=dc516022a56e7b3b156099abc81b6d2b08ea1ed12676ac7a5657617f012bd45d + csv (3.3.5) sha256=6e5134ac3383ef728b7f02725d9872934f523cb40b961479f69cf3afa6c8e73f + cucumber (10.2.0) sha256=fdedbd31ecf40858b60f04853f2aa15c44f5c30bbac29c6a227fa1e7005a8158 + cucumber-ci-environment (11.0.0) sha256=0df79a9e1d0b015b3d9def680f989200d96fef206f4d19ccf86a338c4f71d1e2 + cucumber-core (16.2.0) sha256=592b58a95cf42feef8e5a349f68e363784ba3b6568ffbcf6776e38e136cf970b + cucumber-cucumber-expressions (19.0.1) sha256=648ec09045190d818fb797af46e1648148599fd67a086a34a7f0e647d9e36c8c + cucumber-gherkin (39.1.0) sha256=aed12a0c955d8563d80a012633c1a72075525f4d64d4cc983001df2181b379ed + cucumber-html-formatter (22.3.0) sha256=f9768ed05588dbd73a5f3824c2cc648bd86b00206e6972d743af8051281d0729 + cucumber-messages (32.3.1) sha256=ddc88e4c1cf7afb96c06005b92a4a6f221a2fa435a8b4ca04677d215fd82771c + cucumber-rails (4.0.1) sha256=bd3513ec47dc06188cc05703648cbc3560fb115f3f5cfb8b616065b4d6e8024d + cucumber-tag-expressions (8.1.0) sha256=9bd8c4b6654f8e5bf2a9c99329b6f32136a75e50cd39d4cfb3927d0fa9f52e21 + database_cleaner (2.1.0) sha256=1dcba26e3b1576da692fc6bac10136a4744da5bcc293d248aae19640c65d89cd + database_cleaner-active_record (2.2.2) sha256=88296b9f3088c31f7c0d4fcec10f68e4b71c96698043916de59b04debec10388 + database_cleaner-core (2.1.0) sha256=b2875266d9b26b716e8b669c883e01c5250839f6f2ec56422b5e79aa97fb6927 + date (3.5.1) sha256=750d06384d7b9c15d562c76291407d89e368dda4d4fff957eb94962d325a0dc0 + debug (1.11.1) sha256=2e0b0ac6119f2207a6f8ac7d4a73ca8eb4e440f64da0a3136c30343146e952b6 + descendants_tracker (0.0.4) sha256=e9c41dd4cfbb85829a9301ea7e7c48c2a03b26f09319db230e6479ccdc780897 + diff-lcs (1.6.2) sha256=9ae0d2cba7d4df3075fe8cd8602a8604993efc0dfa934cff568969efb1909962 + docile (1.4.1) sha256=96159be799bfa73cdb721b840e9802126e4e03dfc26863db73647204c727f21e + dotenv (3.2.0) sha256=e375b83121ea7ca4ce20f214740076129ab8514cd81378161f11c03853fe619d + dotenv-rails (3.2.0) sha256=657e25554ba622ffc95d8c4f1670286510f47f2edda9f68293c3f661b303beab + drb (2.2.3) sha256=0b00d6fdb50995fe4a45dea13663493c841112e4068656854646f418fda13373 + dry-configurable (1.3.0) sha256=882d862858567fc1210d2549d4c090f34370fc1bb7c5c1933de3fe792e18afa8 + dry-core (1.2.0) sha256=0cc5a7da88df397f153947eeeae42e876e999c1e30900f3c536fb173854e96a1 + dry-inflector (1.3.1) sha256=7fb0c2bb04f67638f25c52e7ba39ab435d922a3a5c3cd196120f63accb682dcc + dry-initializer (3.2.0) sha256=37d59798f912dc0a1efe14a4db4a9306989007b302dcd5f25d0a2a20c166c4e3 + dry-logic (1.6.0) sha256=da6fedbc0f90fc41f9b0cc7e6f05f5d529d1efaef6c8dcc8e0733f685745cea2 + dry-schema (1.16.0) sha256=cd3aaeabc0f1af66ec82a29096d4c4fb92a0a58b9dae29a22b1bbceb78985727 + dry-types (1.9.1) sha256=baebeecdb9f8395d6c9d227b62011279440943e3ef2468fe8ccc1ba11467f178 + ed25519 (1.4.0) sha256=16e97f5198689a154247169f3453ef4cfd3f7a47481fde0ae33206cdfdcac506 + erb (6.0.4) sha256=38e3803694be357fe2bfe312487c74beaf9fb4e5beb3e22498952fe1645b95d9 + erubi (1.13.1) sha256=a082103b0885dbc5ecf1172fede897f9ebdb745a4b97a5e8dc63953db1ee4ad9 + et-orbi (1.4.0) sha256=6c7e3c90779821f9e3b324c5e96fda9767f72995d6ae435b96678a4f3e2de8bc + ffi (1.17.4-aarch64-linux-gnu) sha256=b208f06f91ffd8f5e1193da3cae3d2ccfc27fc36fba577baf698d26d91c080df + ffi (1.17.4-aarch64-linux-musl) sha256=9286b7a615f2676245283aef0a0a3b475ae3aae2bb5448baace630bb77b91f39 + ffi (1.17.4-arm-linux-gnu) sha256=d6dbddf7cb77bf955411af5f187a65b8cd378cb003c15c05697f5feee1cb1564 + ffi (1.17.4-arm-linux-musl) sha256=9d4838ded0465bef6e2426935f6bcc93134b6616785a84ffd2a3d82bc3cf6f95 + ffi (1.17.4-arm64-darwin) sha256=19071aaf1419251b0a46852abf960e77330a3b334d13a4ab51d58b31a937001b + ffi (1.17.4-x64-mingw-ucrt) sha256=f6ff9618cfccc494138bddade27aa06c74c6c7bc367a1ea1103d80c2fcb9ed35 + ffi (1.17.4-x86_64-linux-gnu) sha256=9d3db14c2eae074b382fa9c083fe95aec6e0a1451da249eab096c34002bc752d + ffi (1.17.4-x86_64-linux-musl) sha256=3fdf9888483de005f8ef8d1cf2d3b20d86626af206cbf780f6a6a12439a9c49e + flay (2.14.4) sha256=a62d96a51d1da185aa41ba95b696966df9f7d1d91a457709277f24515895de77 + flog (4.9.4) sha256=12cc054fab7a2cbd2a906514397c4d7788954d530564782d6f14939dc2dfbcbb + fugit (1.12.2) sha256=643f2bf28db263bd400cbf8e0dd8b76b2c9b94bdb130e12d2394de04d9c20e5e + globalid (1.3.0) sha256=05c639ad6eb4594522a0b07983022f04aa7254626ab69445a0e493aa3786ff11 + i18n (1.15.0) sha256=ed20037ed7ca75dd36ec486b5fb9696e8e0cfe48f4f80980017932d93e70527f + ice_nine (0.11.2) sha256=5d506a7d2723d5592dc121b9928e4931742730131f22a1a37649df1c1e2e63db + image_processing (1.14.0) sha256=754cc169c9c262980889bec6bfd325ed1dafad34f85242b5a07b60af004742fb + importmap-rails (2.2.3) sha256=7101be2a4dc97cf1558fb8f573a718404c5f6bcfe94f304bf1f39e444feeb16a + io-console (0.8.2) sha256=d6e3ae7a7cc7574f4b8893b4fca2162e57a825b223a177b7afa236c5ef9814cc + irb (1.18.0) sha256=de9454a0703a54704b9811a5ef31a60c86949fbf4013fcf244fabc7c775248e3 + jbuilder (2.15.1) sha256=2430bec28fb0cebacb5875b1009cf9d8bc3c303ccb810c4c8b062a4b51457637 + json (2.19.9) sha256=9b9025b7cdddafa38d316eca0b2358488e42d417045c1b90d216a9fefe46b79a + kamal (2.11.0) sha256=1408864425e0dec7e0a14d712a3b13f614e9f3a425b7661d3f9d287a51d7dd75 + language_server-protocol (3.17.0.5) sha256=fd1e39a51a28bf3eec959379985a72e296e9f9acfce46f6a79d31ca8760803cc + launchy (3.1.1) sha256=72b847b5cc961589dde2c395af0108c86ff0119f42d4648d25b5440ebb10059e + lint_roller (1.1.0) sha256=2c0c845b632a7d172cb849cc90c1bce937a28c5c8ccccb50dfd46a485003cc87 + logger (1.7.0) sha256=196edec7cc44b66cfb40f9755ce11b392f21f7967696af15d274dde7edff0203 + loofah (2.25.1) sha256=d436c73dbd0c1147b16c4a41db097942d217303e1f7728704b37e4df9f6d2e04 + mail (2.9.0) sha256=6fa6673ecd71c60c2d996260f9ee3dd387d4673b8169b502134659ece6d34941 + marcel (1.2.1) sha256=1678e9360e32f9eafa917c80029e2f6d10b2715c66a4b87b6d0da9b9cd1f859f + matrix (0.4.3) sha256=a0d5ab7ddcc1973ff690ab361b67f359acbb16958d1dc072b8b956a286564c5b + memoist3 (1.0.0) sha256=686e42402cf150a362050c23143dc57b0ef88f8c344943ff8b7845792b50d56f + mini_magick (5.3.1) sha256=29395dfd76badcabb6403ee5aff6f681e867074f8f28ce08d78661e9e4a351c4 + mini_mime (1.1.5) sha256=8681b7e2e4215f2a159f9400b5816d85e9d8c6c6b491e96a12797e798f8bccef + minitest (6.0.6) sha256=153ea36d1d987a62942382b61075745042a2b3123b1cd48f4c3675af9cc7d6f1 + msgpack (1.8.3) sha256=8bda4a6428d3244e50d6bd55854d354edbada88a4e1f4f5731a39a0f86bee6a1 + multi_test (1.1.0) sha256=e9e550cdd863fb72becfe344aefdcd4cbd26ebf307847f4a6c039a4082324d10 + mysql2 (0.5.7) sha256=ba09ede515a0ae8a7192040a1b778c0fb0f025fa5877e9be895cd325fa5e9d7b + net-imap (0.6.4.1) sha256=29f0360d75a7efd3539f16ac1957dea5c0a51ddeceb348db4553c3120914ea0d + net-pop (0.1.2) sha256=848b4e982013c15b2f0382792268763b748cce91c9e91e36b0f27ed26420dff3 + net-protocol (0.2.2) sha256=aa73e0cba6a125369de9837b8d8ef82a61849360eba0521900e2c3713aa162a8 + net-scp (4.1.0) sha256=a99b0b92a1e5d360b0de4ffbf2dc0c91531502d3d4f56c28b0139a7c093d1a5d + net-sftp (4.0.0) sha256=65bb91c859c2f93b09826757af11b69af931a3a9155050f50d1b06d384526364 + net-smtp (0.5.1) sha256=ed96a0af63c524fceb4b29b0d352195c30d82dd916a42f03c62a3a70e5b70736 + net-ssh (7.3.2) sha256=65029e213c380e20e5fd92ece663934ab0a0fe888e0cd7cc6a5b664074362dd4 + nio4r (2.7.5) sha256=6c90168e48fb5f8e768419c93abb94ba2b892a1d0602cb06eef16d8b7df1dca1 + nokogiri (1.19.3-aarch64-linux-gnu) sha256=46b89e5d7b9e844c2ee360794240c6ea2a4e6fa0c5892a4ed487db621224b639 + nokogiri (1.19.3-aarch64-linux-musl) sha256=8392dfdcd21be7a94dbbe9ccc138dea01b97b24cb2dc02a114ca98bfb1d9a0b7 + nokogiri (1.19.3-arm-linux-gnu) sha256=3919d5ffc334ad778a4a9eb88fda7dcb8b1fb58c8a52ac640c6dcd2f038e774f + nokogiri (1.19.3-arm-linux-musl) sha256=9ce1cb6346bb9c67b1550eb537aa183ead91e4b6eadb2f36ade02d8dd2a79fb6 + nokogiri (1.19.3-arm64-darwin) sha256=71b9bd424b1b7abc18b05052a1a3cfd3627abdca62be280854cc411791357e42 + nokogiri (1.19.3-x64-mingw-ucrt) sha256=8bb7132cad356c879a1286eaabcb5e68326cb2490317984280fbc62f456d506a + nokogiri (1.19.3-x86_64-linux-gnu) sha256=2f5078620fe12e83669b5b17311b32532a8153d02eee7ad06948b926d6080976 + nokogiri (1.19.3-x86_64-linux-musl) sha256=248c906d2166eca5efb56d52fdee5f9a1f51d69a72e2b64fdac647b4ce39ea3f + ostruct (0.6.3) sha256=95a2ed4a4bd1d190784e666b47b2d3f078e4a9efda2fccf18f84ddc6538ed912 + parallel (1.28.0) sha256=33e6de1484baf2524792d178b0913fc8eb94c628d6cfe45599ad4458c638c970 + parser (3.3.11.1) sha256=d17ace7aabe3e72c3cc94043714be27cc6f852f104d81aa284c2281aecc65d54 + path_expander (2.0.1) sha256=2de201164bff4719cc4d0b3767286e9977cc832a59c4d70abab571ec86cb41e4 + pp (0.6.3) sha256=2951d514450b93ccfeb1df7d021cae0da16e0a7f95ee1e2273719669d0ab9df6 + prettyprint (0.2.0) sha256=2bc9e15581a94742064a3cc8b0fb9d45aae3d03a1baa6ef80922627a0766f193 + prism (1.9.0) sha256=7b530c6a9f92c24300014919c9dcbc055bf4cdf51ec30aed099b06cd6674ef85 + propshaft (1.3.2) sha256=1d56a3e56a92c21bfc29caf07406b5386b00d4c47ddf357cf989a5a234b1389e + psych (5.4.0) sha256=14f72d69a611af663d7d70e4a7b67d9eb1f3ae9f8d916b478961d5a0075ba5b7 + public_suffix (7.0.5) sha256=1a8bb08f1bbea19228d3bed6e5ed908d1cb4f7c2726d18bd9cadf60bc676f623 + puma (8.0.2) sha256=c8ed871dfbbe66448ea9ffd46692342d9804d4071522b52b5331b7b6e7b686fb + raabro (1.4.0) sha256=d4fa9ff5172391edb92b242eed8be802d1934b1464061ae5e70d80962c5da882 + racc (1.8.1) sha256=4a7f6929691dbec8b5209a0b373bc2614882b55fc5d2e447a21aaa691303d62f + rack (3.2.6) sha256=5ed78e1f73b2e25679bec7d45ee2d4483cc4146eb1be0264fc4d94cb5ef212c2 + rack-session (2.1.2) sha256=595434f8c0c3473ae7d7ac56ecda6cc6dfd9d37c0b2b5255330aa1576967ffe8 + rack-test (2.2.0) sha256=005a36692c306ac0b4a9350355ee080fd09ddef1148a5f8b2ac636c720f5c463 + rackup (2.3.1) sha256=6c79c26753778e90983761d677a48937ee3192b3ffef6bc963c0950f94688868 + rails (8.1.3) sha256=6d017ba5348c98fc909753a8169b21d44de14d2a0b92d140d1a966834c3c9cd3 + rails-dom-testing (2.3.0) sha256=8acc7953a7b911ca44588bf08737bc16719f431a1cc3091a292bca7317925c1d + rails-html-sanitizer (1.7.0) sha256=28b145cceaf9cc214a9874feaa183c3acba036c9592b19886e0e45efc62b1e89 + railties (8.1.3) sha256=913eb0e0cb520aac687ffd74916bd726d48fa21f47833c6292576ef6a286de22 + rainbow (3.1.1) sha256=039491aa3a89f42efa1d6dec2fc4e62ede96eb6acd95e52f1ad581182b79bc6a + rake (13.4.2) sha256=cb825b2bd5f1f8e91ca37bddb4b9aaf345551b4731da62949be002fa89283701 + rdoc (7.2.0) sha256=8650f76cd4009c3b54955eb5d7e3a075c60a57276766ebf36f9085e8c9f23192 + reek (6.5.0) sha256=d26d3a492773b2bbc228888067a21afe33ac07954a17dbd64cdeae42c4c69be1 + regexp_parser (2.12.0) sha256=35a916a1d63190ab5c9009457136ae5f3c0c7512d60291d0d1378ba18ce08ebb + reline (0.6.3) sha256=1198b04973565b36ec0f11542ab3f5cfeeec34823f4e54cebde90968092b1835 + rexml (3.4.4) sha256=19e0a2c3425dfbf2d4fc1189747bdb2f849b6c5e74180401b15734bc97b5d142 + rspec-core (3.13.6) sha256=a8823c6411667b60a8bca135364351dda34cd55e44ff94c4be4633b37d828b2d + rspec-expectations (3.13.5) sha256=33a4d3a1d95060aea4c94e9f237030a8f9eae5615e9bd85718fe3a09e4b58836 + rspec-mocks (3.13.8) sha256=086ad3d3d17533f4237643de0b5c42f04b66348c28bf6b9c2d3f4a3b01af1d47 + rspec-rails (8.0.4) sha256=06235692fc0892683d3d34977e081db867434b3a24ae0dd0c6f3516bad4e22df + rspec-support (3.13.7) sha256=0640e5570872aafefd79867901deeeeb40b0c9875a36b983d85f54fb7381c47c + rubocop (1.88.0) sha256=e420ddf1662d0ef34bc8a2910ac4b396a7ddda0b51a708264405241734b08e0b + rubocop-ast (1.49.1) sha256=4412f3ee70f6fe4546cc489548e0f6fcf76cafcfa80fa03af67098ffed755035 + rubocop-performance (1.26.1) sha256=cd19b936ff196df85829d264b522fd4f98b6c89ad271fa52744a8c11b8f71834 + rubocop-rails (2.35.4) sha256=3aeaa325439c89950e8327565682ea794065d08e2ecbbfe95032bfa295a35df5 + rubocop-rails-omakase (1.1.0) sha256=2af73ac8ee5852de2919abbd2618af9c15c19b512c4cfc1f9a5d3b6ef009109d + ruby-progressbar (1.13.0) sha256=80fc9c47a9b640d6834e0dc7b3c94c9df37f08cb072b7761e4a71e22cff29b33 + ruby-vips (2.3.0) sha256=e685ec02c13969912debbd98019e50492e12989282da5f37d05f5471442f5374 + ruby_parser (3.22.0) sha256=1eb4937cd9eb220aa2d194e352a24dba90aef00751e24c8dfffdb14000f15d23 + rubycritic (5.0.0) sha256=7f3877556d7f52bf0980496b7c907a827a9592ba690b80a593403a60bd6cfb42 + rubyzip (3.4.0) sha256=6de39bc9eba302b635a476d16c9e16b0872ad24517c2f98f2b3a7ea23caff57b + securerandom (0.4.1) sha256=cc5193d414a4341b6e225f0cb4446aceca8e50d5e1888743fac16987638ea0b1 + selenium-webdriver (4.44.0) sha256=6f1df072529af369589c46f0e01132952aabb250cfd683c274d74dc1eb5d8477 + sexp_processor (4.17.5) sha256=ae2b48ba98353d5d465ce8759836b7a05f2e12c5879fcd14d7815b026de32f0e + simplecov (0.22.0) sha256=fe2622c7834ff23b98066bb0a854284b2729a569ac659f82621fc22ef36213a5 + simplecov-html (0.13.2) sha256=bd0b8e54e7c2d7685927e8d6286466359b6f16b18cb0df47b508e8d73c777246 + simplecov_json_formatter (0.1.4) sha256=529418fbe8de1713ac2b2d612aa3daa56d316975d307244399fa4838c601b428 + solid_cable (3.0.12) sha256=a168a54731a455d5627af48d8441ea3b554b8c1f6e6cd6074109de493e6b0460 + solid_cache (1.0.10) sha256=bc05a2fb3ac78a6f43cbb5946679cf9db67dd30d22939ededc385cb93e120d41 + solid_queue (1.4.0) sha256=e6a18d196f0b27cb6e3c77c5b31258b05fb634f8ed64fb1866ed164047216c2a + sshkit (1.25.0) sha256=c8c6543cdb60f91f1d277306d585dd11b6a064cb44eab0972827e4311ff96744 + stimulus-rails (1.3.4) sha256=765676ffa1f33af64ce026d26b48e8ffb2e0b94e0f50e9119e11d6107d67cb06 + stringio (3.2.0) sha256=c37cb2e58b4ffbd33fe5cd948c05934af997b36e0b6ca6fdf43afa234cf222e1 + sys-uname (1.5.1) sha256=784d7e6491b0393c25cbbe5ac38324ac7be9fda083a6094832648af669386d7b + sys-uname (1.5.1-universal-mingw32) sha256=aceb618e3276da5eae0ce368e9f6fae8c1f3e9ef23a0595cb88db7b6ecd45f62 + thor (1.5.0) sha256=e3a9e55fe857e44859ce104a84675ab6e8cd59c650a49106a05f55f136425e73 + thread_safe (0.3.6) sha256=9ed7072821b51c57e8d6b7011a8e282e25aeea3a4065eab326e43f66f063b05a + thruster (0.1.21) sha256=dc67928f36e5894844579a95e45637a5091db7a7ea05468ee8c2c6eb0a3f77cf + thruster (0.1.21-aarch64-linux) sha256=f5aff78fb7a6431ed3d6ab4bde03a89c461e9a73981dbc97d6990d85c3db235c + thruster (0.1.21-arm64-darwin) sha256=bd8db9f57fae2cbb3fe08ebab49cb47fe49608122dac23daf0ce709adfb9bfc8 + thruster (0.1.21-x86_64-linux) sha256=6e2fbcf826540a72d3710ae4db072c2333287ac2ee57e7e52f35bc10900d74a7 + timeout (0.6.1) sha256=78f57368a7e7bbadec56971f78a3f5ecbcfb59b7fcbb0a3ed6ddc08a5094accb + tsort (0.2.0) sha256=9650a793f6859a43b6641671278f79cfead60ac714148aabe4e3f0060480089f + tty-which (0.5.0) sha256=5824055f0d6744c97e7c4426544f01d519c40d1806ef2ef47d9854477993f466 + turbo-rails (2.0.23) sha256=ee0d90733aafff056cf51ff11e803d65e43cae258cc55f6492020ec1f9f9315f + tzinfo (2.0.6) sha256=8daf828cc77bcf7d63b0e3bdb6caa47e2272dcfaf4fbfe46f8c3a9df087a829b + tzinfo-data (1.2026.2) sha256=7db0d3d3d53b8d7601fc183fccc8c6d056a3004e14eb59ea995bf6aec4ae10bc + unicode-display_width (3.2.0) sha256=0cdd96b5681a5949cdbc2c55e7b420facae74c4aaf9a9815eee1087cb1853c42 + unicode-emoji (4.2.0) sha256=519e69150f75652e40bf736106cfbc8f0f73aa3fb6a65afe62fefa7f80b0f80f + uri (1.1.1) sha256=379fa58d27ffb1387eaada68c749d1426738bd0f654d812fcc07e7568f5c57c6 + useragent (0.16.11) sha256=700e6413ad4bb954bb63547fa098dddf7b0ebe75b40cc6f93b8d54255b173844 + virtus (2.0.0) sha256=8841dae4eb7fcc097320ba5ea516bf1839e5d056c61ee27138aa4bddd6e3d1c2 + web-console (4.3.0) sha256=e13b71301cdfc2093f155b5aa3a622db80b4672d1f2f713119cc7ec7ac6a6da4 + websocket (1.2.11) sha256=b7e7a74e2410b5e85c25858b26b3322f29161e300935f70a0e0d3c35e0462737 + websocket-driver (0.8.1) sha256=5ab238238ce230e5d4b262d2be39624c867914eab99171dc4952b58b577c2d96 + websocket-extensions (0.1.5) sha256=1c6ba63092cda343eb53fc657110c71c754c56484aad42578495227d717a8241 + win32ole (1.9.3) sha256=01f43dc5dc13806e6e58204f538b4a28f3d85968ea89074abc9a3cd118e94d96 + xpath (3.2.0) sha256=6dfda79d91bb3b949b947ecc5919f042ef2f399b904013eb3ef6d20dd3a4082e + zeitwerk (2.8.2) sha256=7212a61311083c604184b1ea2574b9aa05cd14f855a0841c06985cabe9181d12 + +BUNDLED WITH + 4.0.10 diff --git a/Rakefile b/Rakefile new file mode 100644 index 0000000000..9a5ea7383a --- /dev/null +++ b/Rakefile @@ -0,0 +1,6 @@ +# Add your own tasks in files placed in lib/tasks ending in .rake, +# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake. + +require_relative "config/application" + +Rails.application.load_tasks diff --git a/app/assets/images/.keep b/app/assets/images/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/app/assets/images/icons/create.svg b/app/assets/images/icons/create.svg new file mode 100644 index 0000000000..117c7630c8 --- /dev/null +++ b/app/assets/images/icons/create.svg @@ -0,0 +1,3 @@ + + + diff --git a/app/assets/images/icons/edit.svg b/app/assets/images/icons/edit.svg new file mode 100644 index 0000000000..275fa03b2b --- /dev/null +++ b/app/assets/images/icons/edit.svg @@ -0,0 +1,3 @@ + + + diff --git a/app/assets/images/icons/trash.svg b/app/assets/images/icons/trash.svg new file mode 100644 index 0000000000..28e3f31b34 --- /dev/null +++ b/app/assets/images/icons/trash.svg @@ -0,0 +1,3 @@ + + + diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css new file mode 100644 index 0000000000..fe93333c0f --- /dev/null +++ b/app/assets/stylesheets/application.css @@ -0,0 +1,10 @@ +/* + * This is a manifest file that'll be compiled into application.css. + * + * With Propshaft, assets are served efficiently without preprocessing steps. You can still include + * application-wide styles in this file, but keep in mind that CSS precedence will follow the standard + * cascading order, meaning styles declared later in the document or manifest will override earlier ones, + * depending on specificity. + * + * Consider organizing styles into separate files for maintainability. + */ diff --git a/app/assets/stylesheets/gerenciamento.css b/app/assets/stylesheets/gerenciamento.css new file mode 100644 index 0000000000..62a43f3997 --- /dev/null +++ b/app/assets/stylesheets/gerenciamento.css @@ -0,0 +1,435 @@ + +body, html { + margin: 0; + padding: 0; + height: 100vh; + font-family: 'Roboto', 'Poppins', sans-serif; + background: #DBDBDB; +} + +.admin-container { + display: flex; + flex-direction: column; + height: 100vh; + overflow: hidden; +} + +.admin-header { + height: 60px; + min-height: 60px; + background: #FFFFFF; + box-shadow: 0px 11px 10.7px rgba(0, 0, 0, 0.05); + display: flex; + justify-content: space-between; + align-items: center; + padding: 0 20px; + z-index: 10; +} + +.header-left, .header-right { + display: flex; + align-items: center; + gap: 24px; +} + +.tab-name { + font-size: 24px; + font-weight: 400; + color: #000000; + margin: 0; +} + +.search-container { + width: 271px; + height: 40px; + border: 1px solid #8E8E8E; + border-radius: 47px; + display: flex; + align-items: center; + padding: 0 15px; + box-sizing: border-box; +} + +.search-input { + border: none; + background: transparent; + outline: none; + width: 100%; + font-family: 'Roboto', sans-serif; + font-size: 14px; +} + +.user-avatar { + width: 44px; + height: 44px; + background: #6C2365; + border-radius: 50%; + display: flex; + justify-content: center; + align-items: center; + color: #FFFFFF; + font-size: 24px; + font-weight: 500; +} + +.admin-body { + display: flex; + flex: 1; + overflow: hidden; +} + +.admin-sidebar { + width: 257px; + min-width: 257px; + background: #FFFFFF; + display: flex; + flex-direction: column; + border-right: 1px solid #D9D9D9; + padding-top: 10px; +} + +.menu-item { + height: 46px; + display: flex; + justify-content: center; + align-items: center; + border-bottom: 1px solid #D9D9D9; + text-decoration: none; + color: #000000; + font-size: 16px; +} + +.menu-item.active { + background: #6C2365; + color: #FFFFFF; +} + +.admin-content { + flex: 1; + background: #DBDBDB; + padding: 25px 43px; + display: flex; + flex-direction: column; + align-items: center; + gap: 50px; + overflow-y: auto; +} + +.figma-card { + width: 462px; + height: 655px; + background: #FFFFFF; + border-radius: 8px; + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: center; + padding-top: 40px; + gap: 15px; +} + +.btn-figma { + width: 302px; + height: 43px; + display: flex; + justify-content: center; + align-items: center; + border-radius: 6px; + font-family: 'Poppins', sans-serif; + font-weight: 500; + font-size: 16px; + text-decoration: none; + border: none; + cursor: pointer; + box-shadow: 0px 1px 2px rgba(105, 81, 255, 0.05); + background: #86EFAC; + color: #1e1e1e; + transition: background-color 0.2s ease-in-out, color 0.2s ease-in-out; +} + +.btn-figma:hover { + background: #22C55E; + color: #F0FDF4; +} + +.flash-message.notice { + background-color: #d1fae5; + color: #065f46; + border: 1px solid #10b981; +} + +.flash-message.alert { + background-color: #fee2e2; + color: #991b1b; + border: 1px solid #ef4444; +} + +.templates-grid { + display: grid; + grid-template-columns: repeat(auto-fill, 278px); + gap: 50px; + padding: 25px 43px; + width: 100%; + justify-content: flex-start; +} + +.card { + width: 278px; + height: 82px; + background: #FFFFFF; + border-radius: 8px; + padding: 24px; + display: flex; + justify-content: space-between; + align-items: center; + box-sizing: border-box; +} + +.template-title { + font-family: 'Roboto', sans-serif; + font-size: 24px; + font-weight: 500; + margin: 0; + color: #000000; +} + +.template-semester { + font-family: 'Roboto', sans-serif; + font-size: 16px; + font-weight: 400; + margin: 5px 0 0 0; + color: #000000; +} + +.card-actions { + display: flex; + gap: 10px; +} + +.action-btn { + background: none; + border: none; + cursor: pointer; + font-size: 16px; +} + +.card-create-new { + width: 278px; + height: 82px; + background: #FFFFFF; + border-radius: 8px; + display: flex; + justify-content: center; + align-items: center; + text-decoration: none; + color: #000; + border: 2px dashed #000000; + box-sizing: border-box; +} + +.plus-icon { + font-size: 30px; + font-weight: bold; +} + +.icon-wrapper svg { + width: 14px; + height: 14px; + fill: #000000; + transition: fill 0.2s; +} + +.action-btn:hover .icon-wrapper svg { + fill: #6C2365; +} + +.template-modal { + width: 453px; + background: #FFFFFF; + box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.5); + padding: 20px; + margin: 85px auto; + border-radius: 8px; +} + +.form-group { + display: flex; + align-items: center; + gap: 10px; + margin-bottom: 20px; +} + +input[type="text"], .dropdown { + border: none; + border-bottom: 1px solid #000; + width: 280px; + padding: 5px; +} + +.btn-save { + background: #22C55E; + color: #F0FDF4; + border: none; + padding: 12px 18px; + border-radius: 6px; + width: 125px; + margin: 0 auto; + display: block; + cursor: pointer; +} + +.modal-overlay { + position: fixed; + top: 0; + left: 0; + width: 100vw; + height: 100vh; + background: rgba(0, 0, 0, 0.3); + display: flex; + justify-content: center; + align-items: center; + z-index: 1000; +} + +.figma-form-card { + width: 453px; + background: #FFFFFF; + box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.5); + border-radius: 8px; + padding: 20px 24px; + display: flex; + flex-direction: column; + gap: 20px; +} + +.figma-form-content { + display: flex; + flex-direction: column; + gap: 20px; +} + +/* Nome do template */ +.form-header-group { + display: flex; + align-items: center; + gap: 15px; +} + +.figma-label { + font-family: 'Inter', sans-serif; + font-size: 14px; + color: #000000; + white-space: nowrap; +} + +.figma-input-line { + border: none; + border-bottom: 1px solid #000000; + width: 100%; + font-family: 'Roboto', sans-serif; + font-size: 13px; + padding: 5px 0; + outline: none; + background: transparent; +} + +.figma-input-line::placeholder { + color: #8E8E8E; +} + +/* Blocos de Questão */ +.question-block { + display: flex; + flex-direction: column; + gap: 14px; +} + +.question-title { + font-family: 'Roboto', sans-serif; + font-size: 16px; + font-weight: 500; + color: #000000; + margin: 0; +} + +.question-row { + display: flex; + align-items: center; + gap: 15px; +} + +.figma-label-small { + font-family: 'Inter', sans-serif; + font-size: 12px; + color: #000000; + width: 50px; +} + +.figma-dropdown { + background: #FFFFFF; + border: 1px solid #E0E0E0; + border-radius: 8px; + padding: 6px 12px; + font-family: 'Inter', sans-serif; + font-size: 12px; + color: #828282; + width: 163px; + outline: none; +} + +.figma-input-line-full { + border: none; + border-bottom: 1px solid #000000; + flex-grow: 1; + font-family: 'Roboto', sans-serif; + font-size: 13px; + padding: 5px 0; + outline: none; +} + +/* Botão roxo de adicionar (+) */ +.add-question-btn { + width: 34px; + height: 34px; + background: #6C2365; + color: #FFF; + display: flex; + justify-content: center; + align-items: center; + font-size: 20px; + font-weight: bold; + border-radius: 4px; + cursor: pointer; + margin: 0 auto; +} + +.submit-row { + display: flex; + justify-content: center; + margin-top: 10px; +} + +.btn-figma-success { + background: #22C55E; + color: #F0FDF4; + font-family: 'Poppins', sans-serif; + font-weight: 500; + font-size: 16px; + border: none; + border-radius: 6px; + padding: 10px 30px; + cursor: pointer; + box-shadow: 0px 1px 2px rgba(105, 81, 255, 0.05); +} + +.cancel-row { + display: flex; + justify-content: center; +} + +.btn-cancel { + font-family: 'Inter', sans-serif; + font-size: 12px; + color: #828282; + text-decoration: underline; +} \ No newline at end of file diff --git a/app/assets/stylesheets/login.css b/app/assets/stylesheets/login.css new file mode 100644 index 0000000000..a22f4ec6bf --- /dev/null +++ b/app/assets/stylesheets/login.css @@ -0,0 +1,94 @@ +body { + background: #efefef; + margin: 0; + font-family: Arial, sans-serif; +} + +.login-container { + width: 90%; + max-width: 1100px; + height: 500px; + + margin: 40px auto; + + display: flex; + + background: white; + border-radius: 10px; + + overflow: hidden; +} + +.login-form { + flex: 1; + + display: flex; + flex-direction: column; + justify-content: center; + + padding: 50px; +} + +.login-form h1 { + text-align: center; + margin-bottom: 40px; +} + +.field { + margin-bottom: 20px; +} + +.field label { + display: block; + margin-bottom: 8px; +} + +.field input { + width: 100%; + box-sizing: border-box; + + padding: 12px; + + border: 1px solid #ccc; + border-radius: 6px; +} + +.btn-login { + width: 100%; + + padding: 12px; + + border: none; + border-radius: 6px; + + background: #2ecc71; + color: white; + + cursor: pointer; + + font-size: 16px; +} + +.btn-login:hover { + opacity: 0.9; +} + +.btn-forgot { + margin-top: 15px; +} + +.login-banner { + flex: 1; + + background: #6d1f6d; + + display: flex; + justify-content: center; + align-items: center; +} + +.login-banner h2 { + color: white; + text-align: center; + font-size: 4rem; +} \ No newline at end of file diff --git a/app/assets/stylesheets/redefinir_senha.css b/app/assets/stylesheets/redefinir_senha.css new file mode 100644 index 0000000000..893bc54580 --- /dev/null +++ b/app/assets/stylesheets/redefinir_senha.css @@ -0,0 +1,83 @@ +html, +body { + margin: 0; + padding: 0; + height: 100%; + font-family: Arial, Helvetica, sans-serif; + background-color: #f5f5f5; +} + +.password-reset-container { + height: 100vh; + + display: flex; + justify-content: center; + align-items: center; +} + +.password-reset-box { + width: 100%; + max-width: 450px; + + background: white; + + padding: 40px; + + border-radius: 10px; + + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); + + box-sizing: border-box; +} + +.password-reset-box h1 { + text-align: center; + + margin-top: 0; + margin-bottom: 30px; + + font-size: 2rem; + font-weight: normal; +} + +.field { + display: flex; + flex-direction: column; + + margin-bottom: 20px; +} + +.field label { + margin-bottom: 8px; +} + +.field input { + padding: 12px; + + border: 1px solid #d0d0d0; + border-radius: 6px; + + font-size: 1rem; + box-sizing: border-box; +} + +.btn-submit { + width: 100%; + + padding: 12px; + + border: none; + border-radius: 6px; + + background-color: #6e1f69; + color: white; + + font-size: 1rem; + font-weight: bold; + + cursor: pointer; +} + +.btn-submit:hover { + opacity: 0.9; +} \ No newline at end of file diff --git a/app/controllers/admin_controller.rb b/app/controllers/admin_controller.rb new file mode 100644 index 0000000000..c3946fadce --- /dev/null +++ b/app/controllers/admin_controller.rb @@ -0,0 +1,220 @@ +# Gerencia as funcionalidades exclusivas do administrador do sistema. +# +# Agrupa as ações restritas ao perfil +Administrador+: visualização e exportação +# de avaliações, envio de formulários a turmas a partir de templates, tela de +# gerenciamento geral e sincronização de dados com o SIGAA (importação e +# atualização via arquivos JSON). Utiliza o layout "gerenciamento" e valida +# que o administrador autenticado acessa apenas as suas próprias páginas. +class AdminController < ApplicationController + layout "gerenciamento" + + before_action :require_login + before_action :require_admin + before_action :set_admin + + include AdminAutenticavel + + SINCRONIZACAO_HANDLERS = { + "importar" => ->(cp, cm) { SigaaImporter.import_from_files(cp, cm) }, + "atualizar" => ->(cp, cm) { SigaaImporter.update_from_files(cp, cm) } + }.freeze + + MENSAGENS_SINCRONIZACAO = { + "importar" => { + parcial: "alguns dados já foram importados e não serão importados novamente, mas os dados restantes serão importados com sucesso", + sucesso: "As turmas, matérias e participantes do SIGAA estão presentes no sistema.", + nome_acao: "importação" + }, + "atualizar" => { + parcial: "alguns dados já estão atualizados e não serão atualizados novamente, mas os dados restantes serão atualizados com sucesso", + sucesso: "As turmas, matérias e participantes do SIGAA estão atualizados no sistema com os dados atuais do SIGAA.", + nome_acao: "atualização" + } + }.freeze + + # Lista todos os formulários com suas turmas, disciplinas, departamentos e docentes. + # + # @return [void] + def avaliacoes + @avaliacoes = Formulario + .joins(:turma) + .includes(turma: { disciplina: :departamento, docentes: [] }) + end + + # Exibe a página de gerenciamento do administrador. + # + # @return [void] + def gerenciamento + end + + # Exibe o formulário de envio de avaliações (GET) ou cria formulários a partir de um + # template para as turmas selecionadas (POST). + # + # @return [void] + # @note GET: popula +@templates+ e +@turmas+ para exibição do formulário de seleção. + # POST: delega a criação dos formulários para +processar_envio_formularios+. + def enviar_formularios + if request.get? + @templates = Template.where(usuario_id: @admin.id) + @turmas = Turma.joins(:disciplina).includes(:disciplina).order("disciplinas.nome, turmas.semestre") + elsif request.post? + processar_envio_formularios + end + end + + # Lista os formulários pertencentes às disciplinas do departamento do administrador. + # + # @return [void] + def resultados + @formularios = Formulario.joins(turma: :disciplina).where(disciplinas: { departamento_id: @admin.departamento_id }).includes(turma: :disciplina) + end + + # Exporta as respostas de um formulário como arquivo CSV para download. + # + # @return [void] + # @note Lê o parâmetro +:id+ da rota. Redireciona com alerta se o formulário não for + # encontrado ou não possuir respostas. Em caso de sucesso, força o download do CSV. + def exportar_csv + @formulario = Formulario.find_by(id: params[:id]) + + unless @formulario + redirect_to admin_resultados_path(@admin), alert: "Formulário não encontrado" + return + end + + @respostas = RespostaForm.where(formulario_id: @formulario.id).includes(:usuario, resposta_elems: :elemento_form) + + if @formulario.resposta_forms.empty? + redirect_to admin_resultados_path(@admin), alert: "Falha na exportação: Este formulário ainda não possui respostas registradas." + return + end + + respond_to do |format| + format.csv { definir_headers_csv } + end + end + + # Exibe a página de sincronização com o SIGAA (GET) ou processa a sincronização (POST). + # + # @return [void] + def sincronizar_sigaa + if request.get? + render :sincronizar_sigaa + elsif request.post? + processar_sincronizacao + end + end + + private + + # Valida os parâmetros e cria formulários a partir de um template para as turmas selecionadas. + # + # @return [void] + def processar_envio_formularios + template_id = params[:template_id] + turma_ids = params[:turma_ids] + envio_path = admin_enviar_formularios_path(@admin) + + if template_id.blank? + redirect_to envio_path, alert: "Selecione um template para criar o formulário" + return + end + + if turma_ids.blank? + redirect_to envio_path, alert: "Selecione pelo menos uma turma" + return + end + + template = Template.includes(elementos: :campos).find(template_id) + Turma.where(id: turma_ids).each { |turma| criar_formulario_para_turma(template, turma) } + + msg = turma_ids.size == 1 ? "Formulário criado com sucesso" : "Formulários criados com sucesso" + flash[:notice] = msg + redirect_to admin_gerenciamento_path(@admin) + end + + # Cria um formulário para uma turma a partir de um template, copiando seus elementos. + # + # @param template [Template] template de origem + # @param turma [Turma] turma destinatária + # @return [void] + def criar_formulario_para_turma(template, turma) + formulario = Formulario.create!( + turma: turma, + titulo: "#{turma.disciplina.nome} - #{turma.semestre}" + ) + template.elementos.each { |elemento| copiar_elemento(elemento, formulario) } + end + + # Copia um elemento de template para um formulário, incluindo seus campos se não for texto livre. + # + # @param elemento [Elemento] elemento do template de origem + # @param formulario [Formulario] formulário de destino + # @return [void] + def copiar_elemento(elemento, formulario) + campos = elemento.campos + tipo = campos.first&.tipo_elemento || "Texto" + ef = formulario.elemento_forms.create!( + enunciado: elemento.enunciado, + ordem: elemento.ordem, + tipo: tipo + ) + return if tipo == "Texto" + + campos.each do |campo| + ef.campo_forms.create!(enunciado: campo.enunciado, ordem: campo.ordem) + end + end + + # Define os cabeçalhos HTTP para o download do CSV do formulário. + # + # @return [void] + def definir_headers_csv + turma = @formulario.turma + num_turma = turma&.numero_da_turma&.parameterize(separator: "_") || "sem_turma" + nome_materia = turma&.disciplina&.nome&.parameterize(separator: "_") || "sem_materia" + nome_arquivo = "formulario_#{@formulario.id}_turma_#{num_turma}_#{nome_materia}.csv" + response.headers["Content-Disposition"] = "attachment; filename=\"#{nome_arquivo}\"" + end + + # Lê os arquivos enviados via POST e delega ao handler adequado do SigaaImporter. + # + # @return [void] + def processar_sincronizacao + arquivo_classes = params[:arquivo_classes] + arquivo_membros = params[:arquivo_membros] + + unless arquivo_classes.present? && arquivo_membros.present? + redirect_to admin_gerenciamento_path, alert: "Por favor, selecione os dois arquivos JSON" + return + end + + acao = params[:acao] + handler = SINCRONIZACAO_HANDLERS[acao] + resultado = handler ? handler.call(arquivo_classes.path, arquivo_membros.path) : "ação inválida" + processar_resultado(resultado, acao) + end + + # Redireciona para a página de gerenciamento com mensagem apropriada ao resultado da sincronização. + # + # @param resultado [String] mensagem retornada pelo +SigaaImporter+ + # @param acao [String] "importar" ou "atualizar" + # @return [void] + def processar_resultado(resultado, acao) + msgs = MENSAGENS_SINCRONIZACAO.fetch(acao, { parcial: "", sucesso: "", nome_acao: acao.to_s }) + gerenciamento = admin_gerenciamento_path(@admin) + + case resultado + when /alguns dados/i + redirect_to gerenciamento, notice: msgs[:parcial] + when /sucesso/i + redirect_to gerenciamento, notice: msgs[:sucesso] + when /já existem/i + redirect_to gerenciamento, alert: "os dados do SIGAA já existem na base de dados do sistema e não serão importados novamente" + when /já estão atualizados/i + redirect_to gerenciamento, alert: "os dados do SIGAA já estão atualizados e não serão atualizados novamente" + else + redirect_to gerenciamento, alert: "erro informando que a #{msgs[:nome_acao]} falhou" + end + end +end diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb new file mode 100644 index 0000000000..286a939445 --- /dev/null +++ b/app/controllers/application_controller.rb @@ -0,0 +1,41 @@ +# Controller base da aplicação do qual todos os demais controllers herdam. +# +# Define os helpers e filtros de autenticação e autorização compartilhados: +# +current_user+ (disponível nas views via +helper_method+), +require_login+ +# (exige sessão ativa) e +require_admin+ (exige perfil de administrador). +class ApplicationController < ActionController::Base + # Only allow modern browsers supporting webp images, web push, badges, import maps, CSS nesting, and CSS :has. + allow_browser versions: :modern + + # Changes to the importmap will invalidate the etag for HTML responses + stale_when_importmap_changes + + helper_method :current_user + + # Retorna o usuário atualmente autenticado na sessão. + # + # @return [Usuario, nil] instância do usuário logado, ou +nil+ se não houver sessão ativa + def current_user + @current_user ||= Usuario.find_by(id: session[:usuario_id]) + end + + # Exige que o usuário esteja autenticado para acessar a ação. + # + # @return [void] + # @note Redireciona para a página raiz com alerta caso o usuário não esteja logado. + def require_login + unless current_user + redirect_to root_path, alert: "Você precisa estar logado para acessar esta página." + end + end + + # Exige que o usuário autenticado seja um administrador. + # + # @return [void] + # @note Redireciona para a página inicial com alerta caso o usuário não seja um +Administrador+. + def require_admin + unless current_user.is_a?(Administrador) + redirect_to inicio_path, alert: "Acesso negado." + end + end +end diff --git a/app/controllers/campo_forms_controller.rb b/app/controllers/campo_forms_controller.rb new file mode 100644 index 0000000000..3a8c40b1d0 --- /dev/null +++ b/app/controllers/campo_forms_controller.rb @@ -0,0 +1,101 @@ +# Gerencia o CRUD de campos instanciados em elementos de formulários de avaliação. +# +# +CampoForm+ é a representação de uma opção de resposta dentro de um +# +ElementoForm+ concreto, criada a partir de um +Campo+ de template no momento +# do envio da avaliação. Este controller expõe as operações individuais de CRUD +# sobre essas instâncias. +class CampoFormsController < ApplicationController + before_action :require_login + before_action :set_campo_form, only: %i[ show edit update destroy ] + + # Lista todos os campos de formulário cadastrados. + # + # @return [void] + def index + @campo_forms = CampoForm.all + end + + # Exibe os detalhes de um campo de formulário específico. + # + # @return [void] + def show + end + + # Exibe o formulário de criação de novo campo de formulário. + # + # @return [void] + def new + @campo_form = CampoForm.new + end + + # Exibe o formulário de edição de um campo de formulário existente. + # + # @return [void] + def edit + end + + # Cria um novo campo de formulário com os parâmetros permitidos. + # + # @return [void] + # @note Persiste o campo de formulário no banco de dados. Em caso de sucesso, + # redireciona para a sua página; em caso de falha, re-renderiza o formulário de criação. + def create + @campo_form = CampoForm.new(campo_form_params) + + respond_to do |format| + if @campo_form.save + format.html { redirect_to @campo_form, notice: "Campo form was successfully created." } + format.json { render :show, status: :created, location: @campo_form } + else + format.html { render :new, status: :unprocessable_content } + format.json { render json: @campo_form.errors, status: :unprocessable_content } + end + end + end + + # Atualiza os dados de um campo de formulário existente. + # + # @return [void] + # @note Persiste as alterações no banco de dados. Em caso de sucesso, redireciona para + # a página do campo de formulário; em caso de falha, re-renderiza o formulário de edição. + def update + respond_to do |format| + if @campo_form.update(campo_form_params) + format.html { redirect_to @campo_form, notice: "Campo form was successfully updated.", status: :see_other } + format.json { render :show, status: :ok, location: @campo_form } + else + format.html { render :edit, status: :unprocessable_content } + format.json { render json: @campo_form.errors, status: :unprocessable_content } + end + end + end + + # Remove permanentemente um campo de formulário do banco de dados. + # + # @return [void] + # @note Redireciona para a lista de campos de formulário após a exclusão. + def destroy + @campo_form.destroy! + + respond_to do |format| + format.html { redirect_to campo_forms_path, notice: "Campo form was successfully destroyed.", status: :see_other } + format.json { head :no_content } + end + end + + private + + # Busca o campo de formulário pelo +:id+ da rota e o atribui a +@campo_form+. + # + # @return [void] + def set_campo_form + @campo_form = CampoForm.find(params.expect(:id)) + end + + # Filtra os parâmetros permitidos para criação/atualização de campo de formulário. + # + # @return [ActionController::Parameters] parâmetros filtrados do campo de formulário + def campo_form_params + params.expect(campo_form: [ :ordem, :enunciado, :elemento_form_id ]) + end +end diff --git a/app/controllers/campos_controller.rb b/app/controllers/campos_controller.rb new file mode 100644 index 0000000000..83e474d7af --- /dev/null +++ b/app/controllers/campos_controller.rb @@ -0,0 +1,101 @@ +# Gerencia o CRUD de campos (opções de resposta) de elementos de template. +# +# Campos definem as opções disponíveis para resposta em um elemento, bem como o +# tipo da questão (texto livre, múltipla escolha etc.). Normalmente são gerenciados +# via nested attributes no +TemplatesController+; este controller expõe as operações +# individuais de CRUD. +class CamposController < ApplicationController + before_action :require_login + before_action :set_campo, only: %i[ show edit update destroy ] + + # Lista todos os campos cadastrados. + # + # @return [void] + def index + @campos = Campo.all + end + + # Exibe os detalhes de um campo específico. + # + # @return [void] + def show + end + + # Exibe o formulário de criação de novo campo. + # + # @return [void] + def new + @campo = Campo.new + end + + # Exibe o formulário de edição de um campo existente. + # + # @return [void] + def edit + end + + # Cria um novo campo com os parâmetros permitidos. + # + # @return [void] + # @note Persiste o campo no banco de dados. Em caso de sucesso, redireciona para a + # página do campo; em caso de falha, re-renderiza o formulário de criação. + def create + @campo = Campo.new(campo_params) + + respond_to do |format| + if @campo.save + format.html { redirect_to @campo, notice: "Campo was successfully created." } + format.json { render :show, status: :created, location: @campo } + else + format.html { render :new, status: :unprocessable_content } + format.json { render json: @campo.errors, status: :unprocessable_content } + end + end + end + + # Atualiza os dados de um campo existente. + # + # @return [void] + # @note Persiste as alterações no banco de dados. Em caso de sucesso, redireciona para + # a página do campo; em caso de falha, re-renderiza o formulário de edição. + def update + respond_to do |format| + if @campo.update(campo_params) + format.html { redirect_to @campo, notice: "Campo was successfully updated.", status: :see_other } + format.json { render :show, status: :ok, location: @campo } + else + format.html { render :edit, status: :unprocessable_content } + format.json { render json: @campo.errors, status: :unprocessable_content } + end + end + end + + # Remove permanentemente um campo do banco de dados. + # + # @return [void] + # @note Redireciona para a lista de campos após a exclusão. + def destroy + @campo.destroy! + + respond_to do |format| + format.html { redirect_to campos_path, notice: "Campo was successfully destroyed.", status: :see_other } + format.json { head :no_content } + end + end + + private + + # Busca o campo pelo +:id+ da rota e o atribui a +@campo+. + # + # @return [void] + def set_campo + @campo = Campo.find(params.expect(:id)) + end + + # Filtra os parâmetros permitidos para criação/atualização de campo. + # + # @return [ActionController::Parameters] parâmetros filtrados do campo + def campo_params + params.expect(campo: [ :ordem, :enunciado, :tipo_elemento, :elemento_id ]) + end +end diff --git a/app/controllers/concerns/.keep b/app/controllers/concerns/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/app/controllers/concerns/admin_autenticavel.rb b/app/controllers/concerns/admin_autenticavel.rb new file mode 100644 index 0000000000..31fb32eb19 --- /dev/null +++ b/app/controllers/concerns/admin_autenticavel.rb @@ -0,0 +1,20 @@ +# Verifica e disponibiliza o administrador autenticado referenciado pela rota. +# +# Redireciona para a página inicial com alerta se o administrador da rota for +# diferente do usuário autenticado na sessão. +module AdminAutenticavel + extend ActiveSupport::Concern + + private + + # Busca e valida o administrador referenciado pela rota. + # + # @return [void] + def set_admin + @admin = Administrador.find(params[:admin_id]) + + if @admin.id != session[:usuario_id] + redirect_to inicio_path, alert: "Acesso negado! Você só pode acessar as suas próprias páginas." + end + end +end diff --git a/app/controllers/cursos_controller.rb b/app/controllers/cursos_controller.rb new file mode 100644 index 0000000000..c6e0e7f775 --- /dev/null +++ b/app/controllers/cursos_controller.rb @@ -0,0 +1,100 @@ +# Gerencia o CRUD de cursos de graduação e pós-graduação. +# +# Cursos pertencem a um +Departamento+ e agrupam +Discente+s. Normalmente são +# criados automaticamente durante a sincronização com o SIGAA; este controller +# expõe as operações individuais de CRUD para manutenção manual dos registros. +class CursosController < ApplicationController + before_action :require_login + before_action :set_curso, only: %i[ show edit update destroy ] + + # Lista todos os cursos cadastrados. + # + # @return [void] + def index + @cursos = Curso.all + end + + # Exibe os detalhes de um curso específico. + # + # @return [void] + def show + end + + # Exibe o formulário de criação de novo curso. + # + # @return [void] + def new + @curso = Curso.new + end + + # Exibe o formulário de edição de um curso existente. + # + # @return [void] + def edit + end + + # Cria um novo curso com os parâmetros permitidos. + # + # @return [void] + # @note Persiste o curso no banco de dados. Em caso de sucesso, redireciona para a + # sua página; em caso de falha, re-renderiza o formulário de criação. + def create + @curso = Curso.new(curso_params) + + respond_to do |format| + if @curso.save + format.html { redirect_to @curso, notice: "Curso was successfully created." } + format.json { render :show, status: :created, location: @curso } + else + format.html { render :new, status: :unprocessable_content } + format.json { render json: @curso.errors, status: :unprocessable_content } + end + end + end + + # Atualiza os dados de um curso existente. + # + # @return [void] + # @note Persiste as alterações no banco de dados. Em caso de sucesso, redireciona para + # a página do curso; em caso de falha, re-renderiza o formulário de edição. + def update + respond_to do |format| + if @curso.update(curso_params) + format.html { redirect_to @curso, notice: "Curso was successfully updated.", status: :see_other } + format.json { render :show, status: :ok, location: @curso } + else + format.html { render :edit, status: :unprocessable_content } + format.json { render json: @curso.errors, status: :unprocessable_content } + end + end + end + + # Remove permanentemente um curso do banco de dados. + # + # @return [void] + # @note Redireciona para a lista de cursos após a exclusão. + def destroy + @curso.destroy! + + respond_to do |format| + format.html { redirect_to cursos_path, notice: "Curso was successfully destroyed.", status: :see_other } + format.json { head :no_content } + end + end + + private + + # Busca o curso pelo +:id+ da rota e o atribui a +@curso+. + # + # @return [void] + def set_curso + @curso = Curso.find(params.expect(:id)) + end + + # Filtra os parâmetros permitidos para criação/atualização de curso. + # + # @return [ActionController::Parameters] parâmetros filtrados do curso + def curso_params + params.expect(curso: [ :codigo, :nome, :departamento_id ]) + end +end diff --git a/app/controllers/definicao_senhas_controller.rb b/app/controllers/definicao_senhas_controller.rb new file mode 100644 index 0000000000..d710fd5564 --- /dev/null +++ b/app/controllers/definicao_senhas_controller.rb @@ -0,0 +1,90 @@ +# Gerencia o fluxo de definição de senha inicial para novos usuários. +# +# Novos usuários recebem um email com um link contendo um token único. Este +# controller valida o token, exibe o formulário de definição de senha e persiste +# a nova senha quando as validações são satisfeitas. Após a definição bem-sucedida, +# o token é invalidado para evitar reutilização. +class DefinicaoSenhasController < ApplicationController + # Exibe o formulário de definição de senha via token enviado por email. + # + # @return [void] + # @note Lê o parâmetro +:token+ da rota. Redireciona para a página raiz com alerta + # se o token for inválido ou não corresponder a nenhum usuário. + def edit + @usuario = Usuario.find_by(definicao_senha_token: params[:token]) + + return if @usuario.present? + + redirect_to root_path, alert: "Link de definição de senha inválido." + end + + # Persiste a nova senha para o usuário identificado pelo token. + # + # @return [void] + # @note Lê os parâmetros +:token+, +:senha+ e +:senha_confirmation+. + # Redireciona com alerta se o token for inválido, as senhas não conferirem ou a + # senha tiver menos de 6 caracteres. Em caso de sucesso, limpa o token e a data + # de envio, salva a nova senha no banco de dados e redireciona para a página raiz. + def update + @usuario = Usuario.find_by(definicao_senha_token: params[:token]) + + return redirecionar_token_invalido unless @usuario.present? + return render_erro_senha("confirmação não confere") unless senhas_iguais? + return render_erro_senha("senha inválida") unless senha_valida? + + atribuir_nova_senha + + if @usuario.save + redirect_to root_path, notice: "Senha definida com sucesso." + else + render_erro_senha("senha inválida") + end + end + + private + + # Redireciona para a página raiz com mensagem de token inválido. + # + # @return [void] + # @note Efeito colateral: redireciona para +root_path+ com alerta. + def redirecionar_token_invalido + redirect_to root_path, alert: "Link de definição de senha inválido." + end + + # Re-renderiza o formulário de edição com mensagem de erro de senha. + # + # @param mensagem [String] detalhe do erro (ex.: "confirmação não confere") + # @return [void] + # @note Efeito colateral: define +flash.now[:alert]+ e renderiza +:edit+ + # com status +422 Unprocessable Content+. + def render_erro_senha(mensagem) + flash.now[:alert] = "Falha na definição de senha: #{mensagem}" + render :edit, status: :unprocessable_content + end + + # Verifica se os parâmetros +:senha+ e +:senha_confirmation+ são idênticos. + # + # @return [Boolean] +true+ se as senhas forem iguais, +false+ caso contrário + def senhas_iguais? + params[:senha].to_s == params[:senha_confirmation].to_s + end + + # Verifica se o parâmetro +:senha+ possui ao menos 6 caracteres. + # + # @return [Boolean] +true+ se o comprimento for suficiente, +false+ caso contrário + def senha_valida? + params[:senha].to_s.length >= 6 + end + + # Atribui a nova senha e invalida o token de definição no objeto +@usuario+. + # + # @return [void] + # @note Não persiste no banco de dados — o salvamento ocorre no método +update+ + # que chama este helper. + def atribuir_nova_senha + @usuario.senha = params[:senha].to_s + @usuario.senha_confirmation = params[:senha_confirmation].to_s + @usuario.definicao_senha_token = nil + @usuario.definicao_senha_sent_at = nil + end +end diff --git a/app/controllers/departamentos_controller.rb b/app/controllers/departamentos_controller.rb new file mode 100644 index 0000000000..ca4be0e82a --- /dev/null +++ b/app/controllers/departamentos_controller.rb @@ -0,0 +1,101 @@ +# Gerencia o CRUD de departamentos acadêmicos da instituição. +# +# Departamentos agrupam +Curso+s, +Disciplina+s e +Administrador+es. Não podem +# ser excluídos enquanto possuírem cursos ou disciplinas vinculados. Normalmente +# são criados durante a sincronização com o SIGAA; este controller expõe as +# operações individuais de CRUD para manutenção manual dos registros. +class DepartamentosController < ApplicationController + before_action :require_login + before_action :set_departamento, only: %i[ show edit update destroy ] + + # Lista todos os departamentos cadastrados. + # + # @return [void] + def index + @departamentos = Departamento.all + end + + # Exibe os detalhes de um departamento específico. + # + # @return [void] + def show + end + + # Exibe o formulário de criação de novo departamento. + # + # @return [void] + def new + @departamento = Departamento.new + end + + # Exibe o formulário de edição de um departamento existente. + # + # @return [void] + def edit + end + + # Cria um novo departamento com os parâmetros permitidos. + # + # @return [void] + # @note Persiste o departamento no banco de dados. Em caso de sucesso, redireciona para + # a sua página; em caso de falha, re-renderiza o formulário de criação. + def create + @departamento = Departamento.new(departamento_params) + + respond_to do |format| + if @departamento.save + format.html { redirect_to @departamento, notice: "Departamento was successfully created." } + format.json { render :show, status: :created, location: @departamento } + else + format.html { render :new, status: :unprocessable_content } + format.json { render json: @departamento.errors, status: :unprocessable_content } + end + end + end + + # Atualiza os dados de um departamento existente. + # + # @return [void] + # @note Persiste as alterações no banco de dados. Em caso de sucesso, redireciona para + # a página do departamento; em caso de falha, re-renderiza o formulário de edição. + def update + respond_to do |format| + if @departamento.update(departamento_params) + format.html { redirect_to @departamento, notice: "Departamento was successfully updated.", status: :see_other } + format.json { render :show, status: :ok, location: @departamento } + else + format.html { render :edit, status: :unprocessable_content } + format.json { render json: @departamento.errors, status: :unprocessable_content } + end + end + end + + # Remove permanentemente um departamento do banco de dados. + # + # @return [void] + # @note Redireciona para a lista de departamentos após a exclusão. + def destroy + @departamento.destroy! + + respond_to do |format| + format.html { redirect_to departamentos_path, notice: "Departamento was successfully destroyed.", status: :see_other } + format.json { head :no_content } + end + end + + private + + # Busca o departamento pelo +:id+ da rota e o atribui a +@departamento+. + # + # @return [void] + def set_departamento + @departamento = Departamento.find(params.expect(:id)) + end + + # Filtra os parâmetros permitidos para criação/atualização de departamento. + # + # @return [ActionController::Parameters] parâmetros filtrados do departamento + def departamento_params + params.expect(departamento: [ :codigo, :nome ]) + end +end diff --git a/app/controllers/discentes_controller.rb b/app/controllers/discentes_controller.rb new file mode 100644 index 0000000000..ce04362b87 --- /dev/null +++ b/app/controllers/discentes_controller.rb @@ -0,0 +1,101 @@ +# Gerencia o CRUD de discentes (alunos) cadastrados no sistema. +# +# Discentes são usuários com perfil de aluno, vinculados a um +Curso+ e a uma +# ou mais +Turma+s. Normalmente são importados via +AdminController#sincronizar_sigaa+; +# este controller expõe as operações individuais de CRUD para manutenção manual +# dos registros. +class DiscentesController < ApplicationController + before_action :require_login + before_action :set_discente, only: %i[ show edit update destroy ] + + # Lista todos os discentes cadastrados. + # + # @return [void] + def index + @discentes = Discente.all + end + + # Exibe os detalhes de um discente específico. + # + # @return [void] + def show + end + + # Exibe o formulário de criação de novo discente. + # + # @return [void] + def new + @discente = Discente.new + end + + # Exibe o formulário de edição de um discente existente. + # + # @return [void] + def edit + end + + # Cria um novo discente com os parâmetros permitidos. + # + # @return [void] + # @note Persiste o discente no banco de dados. Em caso de sucesso, redireciona para a + # sua página; em caso de falha, re-renderiza o formulário de criação. + def create + @discente = Discente.new(discente_params) + + respond_to do |format| + if @discente.save + format.html { redirect_to @discente, notice: "Discente was successfully created." } + format.json { render :show, status: :created, location: @discente } + else + format.html { render :new, status: :unprocessable_content } + format.json { render json: @discente.errors, status: :unprocessable_content } + end + end + end + + # Atualiza os dados de um discente existente. + # + # @return [void] + # @note Persiste as alterações no banco de dados. Em caso de sucesso, redireciona para + # a página do discente; em caso de falha, re-renderiza o formulário de edição. + def update + respond_to do |format| + if @discente.update(discente_params) + format.html { redirect_to @discente, notice: "Discente was successfully updated.", status: :see_other } + format.json { render :show, status: :ok, location: @discente } + else + format.html { render :edit, status: :unprocessable_content } + format.json { render json: @discente.errors, status: :unprocessable_content } + end + end + end + + # Remove permanentemente um discente do banco de dados. + # + # @return [void] + # @note Redireciona para a lista de discentes após a exclusão. + def destroy + @discente.destroy! + + respond_to do |format| + format.html { redirect_to discentes_path, notice: "Discente was successfully destroyed.", status: :see_other } + format.json { head :no_content } + end + end + + private + + # Busca o discente pelo +:id+ da rota e o atribui a +@discente+. + # + # @return [void] + def set_discente + @discente = Discente.find(params.expect(:id)) + end + + # Filtra os parâmetros permitidos para criação/atualização de discente. + # + # @return [ActionController::Parameters] parâmetros filtrados do discente + def discente_params + params.expect(discente: [ :matricula, :email, :nome, :formacao, :curso_id ]) + end +end diff --git a/app/controllers/disciplinas_controller.rb b/app/controllers/disciplinas_controller.rb new file mode 100644 index 0000000000..d6e66516d5 --- /dev/null +++ b/app/controllers/disciplinas_controller.rb @@ -0,0 +1,101 @@ +# Gerencia o CRUD de disciplinas ofertadas pelos departamentos. +# +# Disciplinas pertencem a um +Departamento+ e possuem múltiplas +Turma+s (uma +# por semestre/oferta). Normalmente são importadas via sincronização com o SIGAA; +# este controller expõe as operações individuais de CRUD para manutenção manual +# dos registros. +class DisciplinasController < ApplicationController + before_action :require_login + before_action :set_disciplina, only: %i[ show edit update destroy ] + + # Lista todas as disciplinas cadastradas. + # + # @return [void] + def index + @disciplinas = Disciplina.all + end + + # Exibe os detalhes de uma disciplina específica. + # + # @return [void] + def show + end + + # Exibe o formulário de criação de nova disciplina. + # + # @return [void] + def new + @disciplina = Disciplina.new + end + + # Exibe o formulário de edição de uma disciplina existente. + # + # @return [void] + def edit + end + + # Cria uma nova disciplina com os parâmetros permitidos. + # + # @return [void] + # @note Persiste a disciplina no banco de dados. Em caso de sucesso, redireciona para + # a sua página; em caso de falha, re-renderiza o formulário de criação. + def create + @disciplina = Disciplina.new(disciplina_params) + + respond_to do |format| + if @disciplina.save + format.html { redirect_to @disciplina, notice: "Disciplina was successfully created." } + format.json { render :show, status: :created, location: @disciplina } + else + format.html { render :new, status: :unprocessable_content } + format.json { render json: @disciplina.errors, status: :unprocessable_content } + end + end + end + + # Atualiza os dados de uma disciplina existente. + # + # @return [void] + # @note Persiste as alterações no banco de dados. Em caso de sucesso, redireciona para + # a página da disciplina; em caso de falha, re-renderiza o formulário de edição. + def update + respond_to do |format| + if @disciplina.update(disciplina_params) + format.html { redirect_to @disciplina, notice: "Disciplina was successfully updated.", status: :see_other } + format.json { render :show, status: :ok, location: @disciplina } + else + format.html { render :edit, status: :unprocessable_content } + format.json { render json: @disciplina.errors, status: :unprocessable_content } + end + end + end + + # Remove permanentemente uma disciplina do banco de dados. + # + # @return [void] + # @note Redireciona para a lista de disciplinas após a exclusão. + def destroy + @disciplina.destroy! + + respond_to do |format| + format.html { redirect_to disciplinas_path, notice: "Disciplina was successfully destroyed.", status: :see_other } + format.json { head :no_content } + end + end + + private + + # Busca a disciplina pelo +:id+ da rota e a atribui a +@disciplina+. + # + # @return [void] + def set_disciplina + @disciplina = Disciplina.find(params.expect(:id)) + end + + # Filtra os parâmetros permitidos para criação/atualização de disciplina. + # + # @return [ActionController::Parameters] parâmetros filtrados da disciplina + def disciplina_params + params.expect(disciplina: [ :codigo, :nome, :departamento_id ]) + end +end diff --git a/app/controllers/docentes_controller.rb b/app/controllers/docentes_controller.rb new file mode 100644 index 0000000000..c1f70d7de8 --- /dev/null +++ b/app/controllers/docentes_controller.rb @@ -0,0 +1,101 @@ +# Gerencia o CRUD de docentes (professores) cadastrados no sistema. +# +# Docentes são usuários com perfil de professor, vinculados a uma ou mais +Turma+s +# e a um +Departamento+. Normalmente são importados via +AdminController#sincronizar_sigaa+; +# este controller expõe as operações individuais de CRUD para manutenção manual +# dos registros. +class DocentesController < ApplicationController + before_action :require_login + before_action :set_docente, only: %i[ show edit update destroy ] + + # Lista todos os docentes cadastrados. + # + # @return [void] + def index + @docentes = Docente.all + end + + # Exibe os detalhes de um docente específico. + # + # @return [void] + def show + end + + # Exibe o formulário de criação de novo docente. + # + # @return [void] + def new + @docente = Docente.new + end + + # Exibe o formulário de edição de um docente existente. + # + # @return [void] + def edit + end + + # Cria um novo docente com os parâmetros permitidos. + # + # @return [void] + # @note Persiste o docente no banco de dados. Em caso de sucesso, redireciona para a + # sua página; em caso de falha, re-renderiza o formulário de criação. + def create + @docente = Docente.new(docente_params) + + respond_to do |format| + if @docente.save + format.html { redirect_to @docente, notice: "Docente was successfully created." } + format.json { render :show, status: :created, location: @docente } + else + format.html { render :new, status: :unprocessable_content } + format.json { render json: @docente.errors, status: :unprocessable_content } + end + end + end + + # Atualiza os dados de um docente existente. + # + # @return [void] + # @note Persiste as alterações no banco de dados. Em caso de sucesso, redireciona para + # a página do docente; em caso de falha, re-renderiza o formulário de edição. + def update + respond_to do |format| + if @docente.update(docente_params) + format.html { redirect_to @docente, notice: "Docente was successfully updated.", status: :see_other } + format.json { render :show, status: :ok, location: @docente } + else + format.html { render :edit, status: :unprocessable_content } + format.json { render json: @docente.errors, status: :unprocessable_content } + end + end + end + + # Remove permanentemente um docente do banco de dados. + # + # @return [void] + # @note Redireciona para a lista de docentes após a exclusão. + def destroy + @docente.destroy! + + respond_to do |format| + format.html { redirect_to docentes_path, notice: "Docente was successfully destroyed.", status: :see_other } + format.json { head :no_content } + end + end + + private + + # Busca o docente pelo +:id+ da rota e o atribui a +@docente+. + # + # @return [void] + def set_docente + @docente = Docente.find(params.expect(:id)) + end + + # Filtra os parâmetros permitidos para criação/atualização de docente. + # + # @return [ActionController::Parameters] parâmetros filtrados do docente + def docente_params + params.expect(docente: [ :matricula, :email, :nome, :formacao ]) + end +end diff --git a/app/controllers/elemento_forms_controller.rb b/app/controllers/elemento_forms_controller.rb new file mode 100644 index 0000000000..ceda50f7cb --- /dev/null +++ b/app/controllers/elemento_forms_controller.rb @@ -0,0 +1,101 @@ +# Gerencia o CRUD de elementos instanciados em formulários de avaliação. +# +# +ElementoForm+ é a representação de uma questão dentro de um +Formulario+ +# concreto, criada a partir de um +Elemento+ de template no momento do envio da +# avaliação. Este controller expõe as operações individuais de CRUD sobre essas +# instâncias. +class ElementoFormsController < ApplicationController + before_action :require_login + before_action :set_elemento_form, only: %i[ show edit update destroy ] + + # Lista todos os elementos de formulário cadastrados. + # + # @return [void] + def index + @elemento_forms = ElementoForm.all + end + + # Exibe os detalhes de um elemento de formulário específico. + # + # @return [void] + def show + end + + # Exibe o formulário de criação de novo elemento de formulário. + # + # @return [void] + def new + @elemento_form = ElementoForm.new + end + + # Exibe o formulário de edição de um elemento de formulário existente. + # + # @return [void] + def edit + end + + # Cria um novo elemento de formulário com os parâmetros permitidos. + # + # @return [void] + # @note Persiste o elemento de formulário no banco de dados. Em caso de sucesso, + # redireciona para a sua página; em caso de falha, re-renderiza o formulário de criação. + def create + @elemento_form = ElementoForm.new(elemento_form_params) + + respond_to do |format| + if @elemento_form.save + format.html { redirect_to @elemento_form, notice: "Elemento form was successfully created." } + format.json { render :show, status: :created, location: @elemento_form } + else + format.html { render :new, status: :unprocessable_content } + format.json { render json: @elemento_form.errors, status: :unprocessable_content } + end + end + end + + # Atualiza os dados de um elemento de formulário existente. + # + # @return [void] + # @note Persiste as alterações no banco de dados. Em caso de sucesso, redireciona para + # a página do elemento de formulário; em caso de falha, re-renderiza o formulário de edição. + def update + respond_to do |format| + if @elemento_form.update(elemento_form_params) + format.html { redirect_to @elemento_form, notice: "Elemento form was successfully updated.", status: :see_other } + format.json { render :show, status: :ok, location: @elemento_form } + else + format.html { render :edit, status: :unprocessable_content } + format.json { render json: @elemento_form.errors, status: :unprocessable_content } + end + end + end + + # Remove permanentemente um elemento de formulário do banco de dados. + # + # @return [void] + # @note Redireciona para a lista de elementos de formulário após a exclusão. + def destroy + @elemento_form.destroy! + + respond_to do |format| + format.html { redirect_to elemento_forms_path, notice: "Elemento form was successfully destroyed.", status: :see_other } + format.json { head :no_content } + end + end + + private + + # Busca o elemento de formulário pelo +:id+ da rota e o atribui a +@elemento_form+. + # + # @return [void] + def set_elemento_form + @elemento_form = ElementoForm.find(params.expect(:id)) + end + + # Filtra os parâmetros permitidos para criação/atualização de elemento de formulário. + # + # @return [ActionController::Parameters] parâmetros filtrados do elemento de formulário + def elemento_form_params + params.expect(elemento_form: [ :ordem, :enunciado, :formulario_id ]) + end +end diff --git a/app/controllers/elementos_controller.rb b/app/controllers/elementos_controller.rb new file mode 100644 index 0000000000..3933d0a987 --- /dev/null +++ b/app/controllers/elementos_controller.rb @@ -0,0 +1,100 @@ +# Gerencia o CRUD de elementos (questões) de templates de avaliação. +# +# Elementos são as questões que compõem um template. Normalmente são criados e +# editados de forma encadeada via nested attributes no +TemplatesController+; este +# controller expõe as operações individuais de CRUD para cada elemento. +class ElementosController < ApplicationController + before_action :require_login + before_action :set_elemento, only: %i[ show edit update destroy ] + + # Lista todos os elementos cadastrados. + # + # @return [void] + def index + @elementos = Elemento.all + end + + # Exibe os detalhes de um elemento específico. + # + # @return [void] + def show + end + + # Exibe o formulário de criação de novo elemento. + # + # @return [void] + def new + @elemento = Elemento.new + end + + # Exibe o formulário de edição de um elemento existente. + # + # @return [void] + def edit + end + + # Cria um novo elemento com os parâmetros permitidos. + # + # @return [void] + # @note Persiste o elemento no banco de dados. Em caso de sucesso, redireciona para a + # página do elemento; em caso de falha, re-renderiza o formulário de criação. + def create + @elemento = Elemento.new(elemento_params) + + respond_to do |format| + if @elemento.save + format.html { redirect_to @elemento, notice: "Elemento was successfully created." } + format.json { render :show, status: :created, location: @elemento } + else + format.html { render :new, status: :unprocessable_content } + format.json { render json: @elemento.errors, status: :unprocessable_content } + end + end + end + + # Atualiza os dados de um elemento existente. + # + # @return [void] + # @note Persiste as alterações no banco de dados. Em caso de sucesso, redireciona para + # a página do elemento; em caso de falha, re-renderiza o formulário de edição. + def update + respond_to do |format| + if @elemento.update(elemento_params) + format.html { redirect_to @elemento, notice: "Elemento was successfully updated.", status: :see_other } + format.json { render :show, status: :ok, location: @elemento } + else + format.html { render :edit, status: :unprocessable_content } + format.json { render json: @elemento.errors, status: :unprocessable_content } + end + end + end + + # Remove permanentemente um elemento do banco de dados. + # + # @return [void] + # @note Redireciona para a lista de elementos após a exclusão. + def destroy + @elemento.destroy! + + respond_to do |format| + format.html { redirect_to elementos_path, notice: "Elemento was successfully destroyed.", status: :see_other } + format.json { head :no_content } + end + end + + private + + # Busca o elemento pelo +:id+ da rota e o atribui a +@elemento+. + # + # @return [void] + def set_elemento + @elemento = Elemento.find(params.expect(:id)) + end + + # Filtra os parâmetros permitidos para criação/atualização de elemento. + # + # @return [ActionController::Parameters] parâmetros filtrados do elemento + def elemento_params + params.expect(elemento: [ :ordem, :enunciado, :template_id ]) + end +end diff --git a/app/controllers/formularios_controller.rb b/app/controllers/formularios_controller.rb new file mode 100644 index 0000000000..fc79136609 --- /dev/null +++ b/app/controllers/formularios_controller.rb @@ -0,0 +1,100 @@ +# Gerencia o CRUD de formulários de avaliação. +# +# Formulários são instâncias de avaliação enviadas a turmas específicas, geradas +# a partir de templates pelo +AdminController+. Este controller oferece as operações +# básicas de listagem, visualização, criação, edição e exclusão de formulários. +class FormulariosController < ApplicationController + before_action :require_login + before_action :set_formulario, only: %i[ show edit update destroy ] + + # Lista todos os formulários cadastrados. + # + # @return [void] + def index + @formularios = Formulario.all + end + + # Exibe os detalhes de um formulário específico. + # + # @return [void] + def show + end + + # Exibe o formulário de criação de novo formulário. + # + # @return [void] + def new + @formulario = Formulario.new + end + + # Exibe o formulário de edição de um formulário existente. + # + # @return [void] + def edit + end + + # Cria um novo formulário com os parâmetros permitidos. + # + # @return [void] + # @note Persiste o formulário no banco de dados. Em caso de sucesso, redireciona para + # a página do formulário; em caso de falha, re-renderiza o formulário de criação. + def create + @formulario = Formulario.new(formulario_params) + + respond_to do |format| + if @formulario.save + format.html { redirect_to @formulario, notice: "Formulario was successfully created." } + format.json { render :show, status: :created, location: @formulario } + else + format.html { render :new, status: :unprocessable_content } + format.json { render json: @formulario.errors, status: :unprocessable_content } + end + end + end + + # Atualiza os dados de um formulário existente. + # + # @return [void] + # @note Persiste as alterações no banco de dados. Em caso de sucesso, redireciona para + # a página do formulário; em caso de falha, re-renderiza o formulário de edição. + def update + respond_to do |format| + if @formulario.update(formulario_params) + format.html { redirect_to @formulario, notice: "Formulario was successfully updated.", status: :see_other } + format.json { render :show, status: :ok, location: @formulario } + else + format.html { render :edit, status: :unprocessable_content } + format.json { render json: @formulario.errors, status: :unprocessable_content } + end + end + end + + # Remove permanentemente um formulário do banco de dados. + # + # @return [void] + # @note Redireciona para a lista de formulários após a exclusão. + def destroy + @formulario.destroy! + + respond_to do |format| + format.html { redirect_to formularios_path, notice: "Formulario was successfully destroyed.", status: :see_other } + format.json { head :no_content } + end + end + + private + + # Busca o formulário pelo +:id+ da rota e o atribui a +@formulario+. + # + # @return [void] + def set_formulario + @formulario = Formulario.find(params.expect(:id)) + end + + # Filtra os parâmetros permitidos para criação/atualização de formulário. + # + # @return [ActionController::Parameters] parâmetros filtrados do formulário + def formulario_params + params.expect(formulario: [ :turma_id ]) + end +end diff --git a/app/controllers/home_controller.rb b/app/controllers/home_controller.rb new file mode 100644 index 0000000000..fd819ca869 --- /dev/null +++ b/app/controllers/home_controller.rb @@ -0,0 +1,14 @@ +# Exibe a página inicial da aplicação após o login. +# +# Requer que o usuário esteja autenticado. Serve como ponto de entrada genérico +# após o redirecionamento pós-login, quando o perfil do usuário ainda não foi +# determinado pelo +SessionsController+. +class HomeController < ApplicationController + before_action :require_login + + # Exibe a página inicial da aplicação. + # + # @return [void] + def index + end +end diff --git a/app/controllers/redefinicao_senhas_controller.rb b/app/controllers/redefinicao_senhas_controller.rb new file mode 100644 index 0000000000..7b56196dfd --- /dev/null +++ b/app/controllers/redefinicao_senhas_controller.rb @@ -0,0 +1,93 @@ +# Gerencia o fluxo de redefinição de senha para usuários que já possuem conta ativa. +# +# O usuário informa seu email (+new+/+create+), recebe um link por email com token +# único e utiliza esse token para acessar o formulário de nova senha (+edit+/+update+). +# Após a redefinição bem-sucedida, o token é invalidado para evitar reutilização. +class RedefinicaoSenhasController < ApplicationController + # Exibe o formulário de solicitação de redefinição de senha. + # + # @return [void] + def new + end + + # Envia o email de redefinição de senha para o endereço informado. + # + # @return [void] + # @note Lê o parâmetro +:email+ do formulário. Redireciona com alerta se o email + # estiver em branco ou não corresponder a nenhum usuário. Em caso de sucesso, dispara + # o envio do email de redefinição e redireciona para a página raiz. + def create + email = params[:email].to_s.strip + + if email.blank? + redirect_to redefinir_senha_path, alert: "Falha na redefinição de senha: informe seu email" + return + end + + usuario = Usuario.find_by(email: email) + + if usuario.blank? + redirect_to redefinir_senha_path, alert: "Falha na redefinição de senha: usuário não encontrado" + return + end + + usuario.enviar_email_redefinicao_senha! + redirect_to root_path, notice: "Solicitação de redefinição de senha enviada." + end + + # Exibe o formulário de redefinição de senha via token enviado por email. + # + # @return [void] + # @note Lê o parâmetro +:token+ da rota. Redireciona para a página raiz com alerta + # se o token for inválido ou não corresponder a nenhum usuário. + def edit + @usuario = Usuario.find_by(redefinicao_senha_token: params[:token]) + + return if @usuario.present? + + redirect_to root_path, alert: "Link de redefinição de senha inválido." + end + + # Persiste a nova senha para o usuário identificado pelo token de redefinição. + # + # @return [void] + # @note Lê os parâmetros +:token+, +:senha+ e +:senha_confirmation+. + # Redireciona com alerta se o token for inválido, as senhas não conferirem ou a + # senha tiver menos de 6 caracteres. Em caso de sucesso, limpa o token e a data + # de envio, salva a nova senha no banco de dados e redireciona para a página raiz. + def update + @usuario = Usuario.find_by(redefinicao_senha_token: params[:token]) + + if @usuario.blank? + redirect_to root_path, alert: "Link de redefinição de senha inválido." + return + end + + nova_senha = params[:senha].to_s + confirmacao = params[:senha_confirmation].to_s + + if nova_senha != confirmacao + flash.now[:alert] = "Falha na redefinição de senha: confirmação não confere" + render :edit, status: :unprocessable_content + return + end + + if nova_senha.length < 6 + flash.now[:alert] = "Falha na redefinição de senha: senha inválida" + render :edit, status: :unprocessable_content + return + end + + @usuario.senha = nova_senha + @usuario.senha_confirmation = confirmacao + @usuario.redefinicao_senha_token = nil + @usuario.redefinicao_senha_sent_at = nil + + if @usuario.save + redirect_to root_path, notice: "Senha redefinida com sucesso." + else + flash.now[:alert] = "Falha na redefinição de senha: senha inválida" + render :edit, status: :unprocessable_content + end + end +end diff --git a/app/controllers/resposta_elems_controller.rb b/app/controllers/resposta_elems_controller.rb new file mode 100644 index 0000000000..f6c8bd437d --- /dev/null +++ b/app/controllers/resposta_elems_controller.rb @@ -0,0 +1,101 @@ +# Gerencia o CRUD de respostas individuais a questões de formulários de avaliação. +# +# Uma +RespostaElem+ representa a resposta de um usuário a um +ElementoForm+ +# específico, vinculada a uma +RespostaForm+. O fluxo principal de criação ocorre +# via +UsuariosController#submeter_resposta+; este controller expõe as operações +# individuais de CRUD para administração direta dos registros. +class RespostaElemsController < ApplicationController + before_action :require_login + before_action :set_resposta_elem, only: %i[ show edit update destroy ] + + # Lista todas as respostas de elemento cadastradas. + # + # @return [void] + def index + @resposta_elems = RespostaElem.all + end + + # Exibe os detalhes de uma resposta de elemento específica. + # + # @return [void] + def show + end + + # Exibe o formulário de criação de nova resposta de elemento. + # + # @return [void] + def new + @resposta_elem = RespostaElem.new + end + + # Exibe o formulário de edição de uma resposta de elemento existente. + # + # @return [void] + def edit + end + + # Cria uma nova resposta de elemento com os parâmetros permitidos. + # + # @return [void] + # @note Persiste a resposta no banco de dados. Em caso de sucesso, redireciona para a + # sua página; em caso de falha, re-renderiza o formulário de criação. + def create + @resposta_elem = RespostaElem.new(resposta_elem_params) + + respond_to do |format| + if @resposta_elem.save + format.html { redirect_to @resposta_elem, notice: "Resposta elem was successfully created." } + format.json { render :show, status: :created, location: @resposta_elem } + else + format.html { render :new, status: :unprocessable_content } + format.json { render json: @resposta_elem.errors, status: :unprocessable_content } + end + end + end + + # Atualiza os dados de uma resposta de elemento existente. + # + # @return [void] + # @note Persiste as alterações no banco de dados. Em caso de sucesso, redireciona para + # a página da resposta; em caso de falha, re-renderiza o formulário de edição. + def update + respond_to do |format| + if @resposta_elem.update(resposta_elem_params) + format.html { redirect_to @resposta_elem, notice: "Resposta elem was successfully updated.", status: :see_other } + format.json { render :show, status: :ok, location: @resposta_elem } + else + format.html { render :edit, status: :unprocessable_content } + format.json { render json: @resposta_elem.errors, status: :unprocessable_content } + end + end + end + + # Remove permanentemente uma resposta de elemento do banco de dados. + # + # @return [void] + # @note Redireciona para a lista de respostas de elemento após a exclusão. + def destroy + @resposta_elem.destroy! + + respond_to do |format| + format.html { redirect_to resposta_elems_path, notice: "Resposta elem was successfully destroyed.", status: :see_other } + format.json { head :no_content } + end + end + + private + + # Busca a resposta de elemento pelo +:id+ da rota e a atribui a +@resposta_elem+. + # + # @return [void] + def set_resposta_elem + @resposta_elem = RespostaElem.find(params.expect(:id)) + end + + # Filtra os parâmetros permitidos para criação/atualização de resposta de elemento. + # + # @return [ActionController::Parameters] parâmetros filtrados da resposta de elemento + def resposta_elem_params + params.expect(resposta_elem: [ :texto_resposta, :resposta_form_id, :elemento_form_id, :campo_form_id ]) + end +end diff --git a/app/controllers/resposta_forms_controller.rb b/app/controllers/resposta_forms_controller.rb new file mode 100644 index 0000000000..15b0fde9b4 --- /dev/null +++ b/app/controllers/resposta_forms_controller.rb @@ -0,0 +1,101 @@ +# Gerencia o CRUD de respostas completas submetidas por usuários a formulários. +# +# Uma +RespostaForm+ representa a submissão de um usuário a um +Formulario+ +# inteiro. O fluxo principal de submissão é tratado pelo +UsuariosController+; +# este controller expõe as operações individuais de CRUD para administração direta +# dos registros de resposta. +class RespostaFormsController < ApplicationController + before_action :require_login + before_action :set_resposta_form, only: %i[ show edit update destroy ] + + # Lista todas as respostas de formulário cadastradas. + # + # @return [void] + def index + @resposta_forms = RespostaForm.all + end + + # Exibe os detalhes de uma resposta de formulário específica. + # + # @return [void] + def show + end + + # Exibe o formulário de criação de nova resposta de formulário. + # + # @return [void] + def new + @resposta_form = RespostaForm.new + end + + # Exibe o formulário de edição de uma resposta de formulário existente. + # + # @return [void] + def edit + end + + # Cria uma nova resposta de formulário com os parâmetros permitidos. + # + # @return [void] + # @note Persiste a resposta no banco de dados. Em caso de sucesso, redireciona para a + # sua página; em caso de falha, re-renderiza o formulário de criação. + def create + @resposta_form = RespostaForm.new(resposta_form_params) + + respond_to do |format| + if @resposta_form.save + format.html { redirect_to @resposta_form, notice: "Resposta form was successfully created." } + format.json { render :show, status: :created, location: @resposta_form } + else + format.html { render :new, status: :unprocessable_content } + format.json { render json: @resposta_form.errors, status: :unprocessable_content } + end + end + end + + # Atualiza os dados de uma resposta de formulário existente. + # + # @return [void] + # @note Persiste as alterações no banco de dados. Em caso de sucesso, redireciona para + # a página da resposta; em caso de falha, re-renderiza o formulário de edição. + def update + respond_to do |format| + if @resposta_form.update(resposta_form_params) + format.html { redirect_to @resposta_form, notice: "Resposta form was successfully updated.", status: :see_other } + format.json { render :show, status: :ok, location: @resposta_form } + else + format.html { render :edit, status: :unprocessable_content } + format.json { render json: @resposta_form.errors, status: :unprocessable_content } + end + end + end + + # Remove permanentemente uma resposta de formulário do banco de dados. + # + # @return [void] + # @note Redireciona para a lista de respostas após a exclusão. + def destroy + @resposta_form.destroy! + + respond_to do |format| + format.html { redirect_to resposta_forms_path, notice: "Resposta form was successfully destroyed.", status: :see_other } + format.json { head :no_content } + end + end + + private + + # Busca a resposta de formulário pelo +:id+ da rota e a atribui a +@resposta_form+. + # + # @return [void] + def set_resposta_form + @resposta_form = RespostaForm.find(params.expect(:id)) + end + + # Filtra os parâmetros permitidos para criação/atualização de resposta de formulário. + # + # @return [ActionController::Parameters] parâmetros filtrados da resposta de formulário + def resposta_form_params + params.expect(resposta_form: [ :data_submissao, :formulario_id, :usuario_id ]) + end +end diff --git a/app/controllers/sessions_controller.rb b/app/controllers/sessions_controller.rb new file mode 100644 index 0000000000..3f1428faa7 --- /dev/null +++ b/app/controllers/sessions_controller.rb @@ -0,0 +1,84 @@ +# Gerencia o ciclo de vida da sessão de autenticação do usuário. +# +# Responsável pelo login (criação de sessão com verificação de credenciais via +# email ou matrícula) e pelo logout (destruição da sessão). Redireciona o usuário +# para a página correta de acordo com o seu perfil (+Administrador+ ou demais). +class SessionsController < ApplicationController + # Exibe o formulário de login. + # + # @return [void] + # @note Redireciona para a página do usuário caso já exista uma sessão ativa. + def new + if current_user + redirect_para_pagina_do_usuario(current_user) + end + end + + # Autentica o usuário com as credenciais informadas e inicia a sessão. + # + # @return [void] + # @note Lê os parâmetros +:login+ (email ou matrícula) e +:senha+ do formulário. + # Redireciona para a página raiz com alerta em caso de falha (login em branco, senha + # em branco, usuário não encontrado, cadastro não efetivado ou senha incorreta). + # Em caso de sucesso, armazena o id do usuário na sessão e redireciona para a sua + # página de avaliações. + def create + login = params[:login].to_s.strip + senha = params[:senha].to_s + + if login.blank? + redirect_to root_path, alert: "Falha no login: informe seu email ou matrícula" + return + end + + if senha.blank? + redirect_to root_path, alert: "Falha no login: informe a sua senha" + return + end + + usuario = Usuario.find_by(email: login) || Usuario.find_by(matricula: login) + + if usuario.blank? + redirect_to root_path, alert: "Falha no login: usuário não encontrado" + return + end + + unless usuario.senha_definida? + redirect_to root_path, alert: "Falha no login: usuário existente deve efetivar o seu cadastro por email" + return + end + + unless usuario.autenticar_senha(senha) + redirect_to root_path, alert: "Falha no login: senha incorreta" + return + end + + session[:usuario_id] = usuario.id + redirect_para_pagina_do_usuario(usuario) + end + + # Encerra a sessão do usuário atual. + # + # @return [void] + # @note Limpa todos os dados da sessão e redireciona para a página raiz. + def destroy + reset_session + redirect_to root_path + end + + private + + # Redireciona para a página de avaliações correspondente ao tipo do usuário. + # + # @param usuario [Usuario] o usuário cuja página será exibida + # @return [void] + # @note Administradores são redirecionados para +admin_avaliacoes_path+; + # demais usuários para +usuarios_avaliacoes_path+. + def redirect_para_pagina_do_usuario(usuario) + if usuario.is_a?(Administrador) + redirect_to admin_avaliacoes_path(usuario.id), notice: "Login realizado com sucesso." + else + redirect_to usuarios_avaliacoes_path(usuario.id), notice: "Login realizado com sucesso." + end + end +end diff --git a/app/controllers/templates_controller.rb b/app/controllers/templates_controller.rb new file mode 100644 index 0000000000..b62d5fe4ec --- /dev/null +++ b/app/controllers/templates_controller.rb @@ -0,0 +1,128 @@ +# Gerencia o CRUD de templates de formulário de avaliação. +# +# Templates são modelos reutilizáveis criados por administradores que definem a +# estrutura de uma avaliação (questões e opções de resposta). Cada administrador +# só pode gerenciar seus próprios templates. Utiliza o layout "gerenciamento" e +# suporta criação e edição de elementos e campos via nested attributes. +class TemplatesController < ApplicationController + layout "gerenciamento" + before_action :require_login + + include AdminAutenticavel + + before_action :set_admin + before_action :set_template, only: %i[ show edit update destroy ] + + # Lista todos os templates do administrador com seus elementos e campos. + # + # @return [void] + def index + @templates = @admin.templates.includes(elementos: :campos) + end + + # Redireciona para a lista de templates do administrador. + # + # @return [void] + # @note Redireciona para +admin_templates_path+. + def show + redirect_to admin_templates_path(@admin) + end + + # Exibe o formulário de criação de novo template com um elemento e um campo iniciais. + # + # @return [void] + def new + @templates = @admin.templates + @template = @admin.templates.build + elemento = @template.elementos.build + elemento.campos.build + end + + # Exibe o formulário de edição de um template existente. + # + # @return [void] + # @note Se o template não possuir elementos, cria um elemento vazio com um campo + # para facilitar o preenchimento do formulário. + def edit + @templates = @admin.templates + if @template.elementos.empty? + elemento = @template.elementos.build + elemento.campos.build + end + end + + # Cria um novo template com os parâmetros permitidos. + # + # @return [void] + # @note Persiste o template e seus elementos/campos no banco de dados via nested + # attributes. Em caso de sucesso, redireciona para a lista de templates; em caso + # de falha, re-renderiza o formulário de criação. + def create + @template = @admin.templates.build(template_params) + + respond_to do |format| + if @template.save + format.html { redirect_to admin_templates_path(@admin), notice: "Template criado com sucesso!" } + format.json { render :show, status: :created, location: @template } + else + @templates = @admin.templates + format.html { render :new, status: :unprocessable_content } + format.json { render json: @template.errors, status: :unprocessable_content } + end + end + end + + # Atualiza os dados de um template existente. + # + # @return [void] + # @note Persiste as alterações no banco de dados, incluindo adição, edição e remoção + # de elementos e campos. Em caso de sucesso, redireciona para a lista de templates; + # em caso de falha, re-renderiza o formulário de edição. + def update + respond_to do |format| + if @template.update(template_params) + format.html { redirect_to admin_templates_path(@admin), notice: "Template atualizado com sucesso!" } + format.json { render :show, status: :ok, location: @template } + else + @templates = @admin.templates + format.html { render :edit, status: :unprocessable_content } + format.json { render json: @template.errors, status: :unprocessable_content } + end + end + end + + # Remove permanentemente um template e seus elementos/campos do banco de dados. + # + # @return [void] + # @note Redireciona para a lista de templates após a exclusão. + def destroy + @template.destroy! + respond_to do |format| + format.html { redirect_to admin_templates_path(@admin), notice: "Template deletado com sucesso!", status: :see_other } + format.json { head :no_content } + end + end + + private + + # Busca o template pelo +:id+ da rota dentro dos templates do administrador. + # + # @return [void] + def set_template + @template = @admin.templates.find(params.expect(:id)) + end + + # Filtra os parâmetros permitidos para criação/atualização de template. + # + # @return [ActionController::Parameters] parâmetros filtrados do template com nested + # attributes de elementos e campos + def template_params + params.require(:template).permit( + :nome, + elementos_attributes: [ + :id, :enunciado, :ordem, :_destroy, + campos_attributes: [ :id, :tipo_elemento, :enunciado, :ordem, :_destroy ] + ] + ) + end +end diff --git a/app/controllers/turmas_controller.rb b/app/controllers/turmas_controller.rb new file mode 100644 index 0000000000..9ba365dea3 --- /dev/null +++ b/app/controllers/turmas_controller.rb @@ -0,0 +1,100 @@ +# Gerencia o CRUD de turmas. +# +# Turmas representam a oferta de uma disciplina em um semestre, agrupando docentes +# e discentes. Este controller oferece as operações básicas de listagem, visualização, +# criação, edição e exclusão de turmas. +class TurmasController < ApplicationController + before_action :require_login + before_action :set_turma, only: %i[ show edit update destroy ] + + # Lista todas as turmas cadastradas. + # + # @return [void] + def index + @turmas = Turma.all + end + + # Exibe os detalhes de uma turma específica. + # + # @return [void] + def show + end + + # Exibe o formulário de criação de nova turma. + # + # @return [void] + def new + @turma = Turma.new + end + + # Exibe o formulário de edição de uma turma existente. + # + # @return [void] + def edit + end + + # Cria uma nova turma com os parâmetros permitidos. + # + # @return [void] + # @note Persiste a turma no banco de dados. Em caso de sucesso, redireciona para a + # página da turma; em caso de falha, re-renderiza o formulário de criação. + def create + @turma = Turma.new(turma_params) + + respond_to do |format| + if @turma.save + format.html { redirect_to @turma, notice: "Turma was successfully created." } + format.json { render :show, status: :created, location: @turma } + else + format.html { render :new, status: :unprocessable_content } + format.json { render json: @turma.errors, status: :unprocessable_content } + end + end + end + + # Atualiza os dados de uma turma existente. + # + # @return [void] + # @note Persiste as alterações no banco de dados. Em caso de sucesso, redireciona para + # a página da turma; em caso de falha, re-renderiza o formulário de edição. + def update + respond_to do |format| + if @turma.update(turma_params) + format.html { redirect_to @turma, notice: "Turma was successfully updated.", status: :see_other } + format.json { render :show, status: :ok, location: @turma } + else + format.html { render :edit, status: :unprocessable_content } + format.json { render json: @turma.errors, status: :unprocessable_content } + end + end + end + + # Remove permanentemente uma turma do banco de dados. + # + # @return [void] + # @note Redireciona para a lista de turmas após a exclusão. + def destroy + @turma.destroy! + + respond_to do |format| + format.html { redirect_to turmas_path, notice: "Turma was successfully destroyed.", status: :see_other } + format.json { head :no_content } + end + end + + private + + # Busca a turma pelo +:id+ da rota e a atribui a +@turma+. + # + # @return [void] + def set_turma + @turma = Turma.find(params.expect(:id)) + end + + # Filtra os parâmetros permitidos para criação/atualização de turma. + # + # @return [ActionController::Parameters] parâmetros filtrados da turma + def turma_params + params.expect(turma: [ :numero_da_turma, :semestre, :horario, :disciplina_id ]) + end +end diff --git a/app/controllers/usuarios_controller.rb b/app/controllers/usuarios_controller.rb new file mode 100644 index 0000000000..fdeabee171 --- /dev/null +++ b/app/controllers/usuarios_controller.rb @@ -0,0 +1,203 @@ +# Gerencia o cadastro de usuários e o fluxo de resposta a formulários de avaliação. +# +# As ações de CRUD (+index+, +show+, +new+, +edit+, +create+, +update+, +destroy+) +# são restritas a administradores. As ações +avaliacoes+, +responder_formulario+ e +# +submeter_resposta+ são acessíveis a qualquer usuário autenticado e compõem o +# fluxo pelo qual docentes e discentes visualizam e respondem formulários de avaliação +# das suas turmas. +class UsuariosController < ApplicationController + before_action :require_login + before_action :require_admin, except: [ :avaliacoes, :responder_formulario, :submeter_resposta ] + before_action :set_usuario, only: %i[ show edit update destroy ] + + # Lista as avaliações (formulários) das turmas do usuário. + # + # @return [void] + # @note Lê o parâmetro +:usuario_id+ da rota. Popula +@turmas+ conforme o tipo do + # usuário (+Docente+ ou +Discente+); demais tipos resultam em coleção vazia. + def avaliacoes + @usuario = Usuario.find(params[:usuario_id]) + + if @usuario.is_a?(Docente) + @turmas = @usuario.turmas + elsif @usuario.is_a?(Discente) + @turmas = @usuario.turmas + else + @turmas = Turma.none + end + + @avaliacoes = Formulario + .joins(:turma) + .where(turma: @turmas) + .includes(turma: { disciplina: :departamento, docentes: [] }) + end + + # Exibe o formulário de avaliação para preenchimento pelo usuário. + # + # @return [void] + # @note Lê +:usuario_id+ e +:formulario_id+ da rota. Redireciona para a lista de + # avaliações com aviso se o usuário já tiver respondido o formulário. + def responder_formulario + @usuario = Usuario.find(params[:usuario_id]) + @formulario = Formulario.includes(elemento_forms: :campo_forms).find(params[:formulario_id]) + + if RespostaForm.exists?(formulario: @formulario, usuario: current_user) + redirect_to usuarios_avaliacoes_path(@usuario), notice: "Você já respondeu este formulário." + end + end + + # Persiste as respostas do usuário ao formulário de avaliação. + # + # @return [void] + # @note Lê +:usuario_id+, +:formulario_id+ e o hash +:respostas+ da requisição. + # Redireciona com alerta se o formulário já foi respondido ou se alguma questão + # obrigatória estiver em branco. Em caso de sucesso, cria um +RespostaForm+ e os + # +RespostaElem+ correspondentes a cada elemento dentro de uma transação, depois + # redireciona para a lista de avaliações. Em caso de erro de validação, re-renderiza + # o formulário com mensagem de alerta. + def submeter_resposta + @usuario = Usuario.find(params[:usuario_id]) + @formulario = Formulario.includes(elemento_forms: :campo_forms).find(params[:formulario_id]) + + if RespostaForm.exists?(formulario: @formulario, usuario: current_user) + redirect_to usuarios_avaliacoes_path(@usuario), alert: "Você já respondeu este formulário." and return + end + + respostas_em_branco = @formulario.elemento_forms.order(:ordem).any? do |ef| + params.dig(:respostas, ef.id.to_s).blank? + end + + if respostas_em_branco + flash.now[:alert] = "Por favor, responda todas as perguntas obrigatórias" + render :responder_formulario, status: :unprocessable_content and return + end + + resposta_form = RespostaForm.new( + formulario: @formulario, + usuario: current_user, + data_submissao: Date.today + ) + + ActiveRecord::Base.transaction do + resposta_form.save! + + @formulario.elemento_forms.order(:ordem).each do |ef| + resposta_val = params.dig(:respostas, ef.id.to_s) + next if resposta_val.blank? + + if ef.tipo == "Texto" + resposta_form.resposta_elems.create!( + elemento_form: ef, + texto_resposta: resposta_val + ) + else + campo = ef.campo_forms.find_by(id: resposta_val) + next unless campo + + resposta_form.resposta_elems.create!( + elemento_form: ef, + campo_form: campo, + texto_resposta: campo.enunciado + ) + end + end + end + + redirect_to usuarios_avaliacoes_path(@usuario), notice: "Respostas enviadas com sucesso!" + rescue ActiveRecord::RecordInvalid => e + @formulario = Formulario.includes(elemento_forms: :campo_forms).find(params[:formulario_id]) + flash.now[:alert] = "Erro ao salvar respostas: #{e.message}" + render :responder_formulario, status: :unprocessable_content + end + + # Lista todos os usuários cadastrados. + # + # @return [void] + def index + @usuarios = Usuario.all + end + + # Exibe os detalhes de um usuário específico. + # + # @return [void] + def show + end + + # Exibe o formulário de criação de novo usuário. + # + # @return [void] + def new + @usuario = Usuario.new + end + + # Exibe o formulário de edição de um usuário existente. + # + # @return [void] + def edit + end + + # Cria um novo usuário com os parâmetros permitidos. + # + # @return [void] + # @note Persiste o usuário no banco de dados. Em caso de sucesso, redireciona para a + # página do usuário; em caso de falha, re-renderiza o formulário de criação. + def create + @usuario = Usuario.new(usuario_params) + + respond_to do |format| + if @usuario.save + format.html { redirect_to @usuario, notice: "Usuario was successfully created." } + format.json { render :show, status: :created, location: @usuario } + else + format.html { render :new, status: :unprocessable_content } + format.json { render json: @usuario.errors, status: :unprocessable_content } + end + end + end + + # Atualiza os dados de um usuário existente. + # + # @return [void] + # @note Persiste as alterações no banco de dados. Em caso de sucesso, redireciona para + # a página do usuário; em caso de falha, re-renderiza o formulário de edição. + def update + respond_to do |format| + if @usuario.update(usuario_params) + format.html { redirect_to @usuario, notice: "Usuario was successfully updated.", status: :see_other } + format.json { render :show, status: :ok, location: @usuario } + else + format.html { render :edit, status: :unprocessable_content } + format.json { render json: @usuario.errors, status: :unprocessable_content } + end + end + end + + # Remove permanentemente um usuário do banco de dados. + # + # @return [void] + # @note Redireciona para a lista de usuários após a exclusão. + def destroy + @usuario.destroy! + + respond_to do |format| + format.html { redirect_to usuarios_path, notice: "Usuario was successfully destroyed.", status: :see_other } + format.json { head :no_content } + end + end + + private + + # Busca o usuário pelo +:id+ da rota e o atribui a +@usuario+. + # + # @return [void] + def set_usuario + @usuario = Usuario.find(params.expect(:id)) + end + + # Filtra os parâmetros permitidos para criação/atualização de usuário. + # + # @return [ActionController::Parameters] parâmetros filtrados do usuário + def usuario_params + params.expect(usuario: [ :matricula, :email, :nome, :formacao, :type ]) + end +end diff --git a/app/helpers/admin_helper.rb b/app/helpers/admin_helper.rb new file mode 100644 index 0000000000..d5c6d3555d --- /dev/null +++ b/app/helpers/admin_helper.rb @@ -0,0 +1,2 @@ +module AdminHelper +end diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb new file mode 100644 index 0000000000..4c277d4784 --- /dev/null +++ b/app/helpers/application_helper.rb @@ -0,0 +1,18 @@ +module ApplicationHelper + # Renderiza um ícone SVG inline a partir de um arquivo na pasta de assets. + # + # @param name [String] nome do arquivo SVG sem extensão (ex.: "check", "trash") + # @param options [Hash] atributos HTML adicionais a serem aplicados ao elemento + # ++ envolvente (ex.: class:, id:, data:) + # @return [ActiveSupport::SafeBuffer] elemento ++ contendo o SVG inline; + # ou a string "(ícone não encontrado)" caso o arquivo não exista + def svg_icon(name, options = {}) + file_path = Rails.root.join("app", "assets", "images", "icons", "#{name}.svg") + if File.exist?(file_path) + svg = File.read(file_path).html_safe + content_tag(:span, svg, options.merge(class: "icon-wrapper #{options[:class]}")) + else + "(ícone não encontrado)" + end + end +end diff --git a/app/helpers/campo_forms_helper.rb b/app/helpers/campo_forms_helper.rb new file mode 100644 index 0000000000..4748406894 --- /dev/null +++ b/app/helpers/campo_forms_helper.rb @@ -0,0 +1,2 @@ +module CampoFormsHelper +end diff --git a/app/helpers/campos_helper.rb b/app/helpers/campos_helper.rb new file mode 100644 index 0000000000..dec4f22ced --- /dev/null +++ b/app/helpers/campos_helper.rb @@ -0,0 +1,2 @@ +module CamposHelper +end diff --git a/app/helpers/cursos_helper.rb b/app/helpers/cursos_helper.rb new file mode 100644 index 0000000000..4921eff347 --- /dev/null +++ b/app/helpers/cursos_helper.rb @@ -0,0 +1,2 @@ +module CursosHelper +end diff --git a/app/helpers/departamentos_helper.rb b/app/helpers/departamentos_helper.rb new file mode 100644 index 0000000000..df3b94bfda --- /dev/null +++ b/app/helpers/departamentos_helper.rb @@ -0,0 +1,2 @@ +module DepartamentosHelper +end diff --git a/app/helpers/discentes_helper.rb b/app/helpers/discentes_helper.rb new file mode 100644 index 0000000000..14d20c14c6 --- /dev/null +++ b/app/helpers/discentes_helper.rb @@ -0,0 +1,2 @@ +module DiscentesHelper +end diff --git a/app/helpers/disciplinas_helper.rb b/app/helpers/disciplinas_helper.rb new file mode 100644 index 0000000000..30b225dd00 --- /dev/null +++ b/app/helpers/disciplinas_helper.rb @@ -0,0 +1,2 @@ +module DisciplinasHelper +end diff --git a/app/helpers/docentes_helper.rb b/app/helpers/docentes_helper.rb new file mode 100644 index 0000000000..390c207243 --- /dev/null +++ b/app/helpers/docentes_helper.rb @@ -0,0 +1,2 @@ +module DocentesHelper +end diff --git a/app/helpers/elemento_forms_helper.rb b/app/helpers/elemento_forms_helper.rb new file mode 100644 index 0000000000..93783c1bcf --- /dev/null +++ b/app/helpers/elemento_forms_helper.rb @@ -0,0 +1,2 @@ +module ElementoFormsHelper +end diff --git a/app/helpers/elementos_helper.rb b/app/helpers/elementos_helper.rb new file mode 100644 index 0000000000..2f69e37c5b --- /dev/null +++ b/app/helpers/elementos_helper.rb @@ -0,0 +1,2 @@ +module ElementosHelper +end diff --git a/app/helpers/formularios_helper.rb b/app/helpers/formularios_helper.rb new file mode 100644 index 0000000000..3b96bb2209 --- /dev/null +++ b/app/helpers/formularios_helper.rb @@ -0,0 +1,2 @@ +module FormulariosHelper +end diff --git a/app/helpers/resposta_elems_helper.rb b/app/helpers/resposta_elems_helper.rb new file mode 100644 index 0000000000..cd6826fefc --- /dev/null +++ b/app/helpers/resposta_elems_helper.rb @@ -0,0 +1,2 @@ +module RespostaElemsHelper +end diff --git a/app/helpers/resposta_forms_helper.rb b/app/helpers/resposta_forms_helper.rb new file mode 100644 index 0000000000..800820446a --- /dev/null +++ b/app/helpers/resposta_forms_helper.rb @@ -0,0 +1,2 @@ +module RespostaFormsHelper +end diff --git a/app/helpers/templates_helper.rb b/app/helpers/templates_helper.rb new file mode 100644 index 0000000000..888093b832 --- /dev/null +++ b/app/helpers/templates_helper.rb @@ -0,0 +1,2 @@ +module TemplatesHelper +end diff --git a/app/helpers/turmas_helper.rb b/app/helpers/turmas_helper.rb new file mode 100644 index 0000000000..617e1373e9 --- /dev/null +++ b/app/helpers/turmas_helper.rb @@ -0,0 +1,2 @@ +module TurmasHelper +end diff --git a/app/helpers/usuarios_helper.rb b/app/helpers/usuarios_helper.rb new file mode 100644 index 0000000000..1f233ed026 --- /dev/null +++ b/app/helpers/usuarios_helper.rb @@ -0,0 +1,2 @@ +module UsuariosHelper +end diff --git a/app/javascript/application.js b/app/javascript/application.js new file mode 100644 index 0000000000..0d7b49404c --- /dev/null +++ b/app/javascript/application.js @@ -0,0 +1,3 @@ +// Configure your import map in config/importmap.rb. Read more: https://github.com/rails/importmap-rails +import "@hotwired/turbo-rails" +import "controllers" diff --git a/app/javascript/controllers/application.js b/app/javascript/controllers/application.js new file mode 100644 index 0000000000..1213e85c7a --- /dev/null +++ b/app/javascript/controllers/application.js @@ -0,0 +1,9 @@ +import { Application } from "@hotwired/stimulus" + +const application = Application.start() + +// Configure Stimulus development experience +application.debug = false +window.Stimulus = application + +export { application } diff --git a/app/javascript/controllers/hello_controller.js b/app/javascript/controllers/hello_controller.js new file mode 100644 index 0000000000..5975c0789d --- /dev/null +++ b/app/javascript/controllers/hello_controller.js @@ -0,0 +1,7 @@ +import { Controller } from "@hotwired/stimulus" + +export default class extends Controller { + connect() { + this.element.textContent = "Hello World!" + } +} diff --git a/app/javascript/controllers/index.js b/app/javascript/controllers/index.js new file mode 100644 index 0000000000..1156bf8362 --- /dev/null +++ b/app/javascript/controllers/index.js @@ -0,0 +1,4 @@ +// Import and register all your controllers from the importmap via controllers/**/*_controller +import { application } from "controllers/application" +import { eagerLoadControllersFrom } from "@hotwired/stimulus-loading" +eagerLoadControllersFrom("controllers", application) diff --git a/app/jobs/application_job.rb b/app/jobs/application_job.rb new file mode 100644 index 0000000000..d394c3d106 --- /dev/null +++ b/app/jobs/application_job.rb @@ -0,0 +1,7 @@ +class ApplicationJob < ActiveJob::Base + # Automatically retry jobs that encountered a deadlock + # retry_on ActiveRecord::Deadlocked + + # Most jobs are safe to ignore if the underlying records are no longer available + # discard_on ActiveJob::DeserializationError +end diff --git a/app/mailers/application_mailer.rb b/app/mailers/application_mailer.rb new file mode 100644 index 0000000000..19b2c9e98c --- /dev/null +++ b/app/mailers/application_mailer.rb @@ -0,0 +1,4 @@ +class ApplicationMailer < ActionMailer::Base + default from: ENV.fetch("MAILER_FROM_ADDRESS", "camaar@gmail.com") + layout "mailer" +end diff --git a/app/mailers/usuario_mailer.rb b/app/mailers/usuario_mailer.rb new file mode 100644 index 0000000000..d36cb5c99c --- /dev/null +++ b/app/mailers/usuario_mailer.rb @@ -0,0 +1,23 @@ +class UsuarioMailer < ApplicationMailer + # Prepara o email de definição de senha inicial para o usuário. + # + # @param usuario [Usuario] destinatário do email, deve possuir +definicao_senha_token+ gerado + # @return [Mail::Message] mensagem de email pronta para ser entregue + def definicao_senha(usuario) + @usuario = usuario + @url = edit_definicao_senha_url(token: usuario.definicao_senha_token) + + mail(to: usuario.email, subject: "Definição de senha") + end + + # Prepara o email de redefinição de senha para o usuário. + # + # @param usuario [Usuario] destinatário do email, deve possuir +redefinicao_senha_token+ gerado + # @return [Mail::Message] mensagem de email pronta para ser entregue + def redefinicao_senha(usuario) + @usuario = usuario + @url = edit_redefinicao_senha_url(token: usuario.redefinicao_senha_token) + + mail(to: usuario.email, subject: "Redefinição de senha") + end +end diff --git a/app/models/administrador.rb b/app/models/administrador.rb new file mode 100644 index 0000000000..84afa2476d --- /dev/null +++ b/app/models/administrador.rb @@ -0,0 +1,10 @@ +# Representa um usuário com perfil de administrador do sistema. +# +# Herda de +Usuario+ e adiciona a obrigatoriedade de estar vinculado a um +# +Departamento+. Possui acesso exclusivo às funcionalidades de gerenciamento, +# envio de formulários e sincronização com o SIGAA, além de poder criar e +# gerenciar +Template+s de avaliação. +class Administrador < Usuario + has_many :templates, foreign_key: "usuario_id", dependent: :destroy + validates :departamento_id, presence: true +end diff --git a/app/models/application_record.rb b/app/models/application_record.rb new file mode 100644 index 0000000000..b63caeb8a5 --- /dev/null +++ b/app/models/application_record.rb @@ -0,0 +1,3 @@ +class ApplicationRecord < ActiveRecord::Base + primary_abstract_class +end diff --git a/app/models/campo.rb b/app/models/campo.rb new file mode 100644 index 0000000000..b72ec9c483 --- /dev/null +++ b/app/models/campo.rb @@ -0,0 +1,11 @@ +# Representa uma opção de resposta ou configuração de tipo dentro de um +Elemento+. +# +# Cada campo pertence a um +Elemento+ de template e define o +tipo_elemento+ +# ("Texto", "Múltipla Escolha", etc.) e o enunciado da opção. A ordem é única +# dentro do escopo do elemento pai. +class Campo < ApplicationRecord + belongs_to :elemento + validates :ordem, presence: true + validates :ordem, uniqueness: { scope: :elemento_id } + validates :tipo_elemento, presence: true +end diff --git a/app/models/campo_form.rb b/app/models/campo_form.rb new file mode 100644 index 0000000000..89ebf419df --- /dev/null +++ b/app/models/campo_form.rb @@ -0,0 +1,10 @@ +# Representa uma opção de resposta instanciada em um +ElementoForm+. +# +# É criado a partir de um +Campo+ de template no momento em que o formulário +# é enviado a uma turma. Quando um usuário seleciona esta opção, um +# +RespostaElem+ é criado referenciando este campo. +class CampoForm < ApplicationRecord + belongs_to :elemento_form + has_many :resposta_elems, dependent: :destroy + validates :ordem, presence: true +end diff --git a/app/models/concerns/.keep b/app/models/concerns/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/app/models/curso.rb b/app/models/curso.rb new file mode 100644 index 0000000000..26ec0351ae --- /dev/null +++ b/app/models/curso.rb @@ -0,0 +1,10 @@ +# Representa um curso de graduação ou pós-graduação. +# +# Pertence a um +Departamento+ e agrega os +Discente+s nele matriculados. +# Identificado de forma única pelo atributo +codigo+. +class Curso < ApplicationRecord + belongs_to :departamento + has_many :discentes + validates :codigo, presence: true, uniqueness: true + validates :nome, presence: true +end diff --git a/app/models/departamento.rb b/app/models/departamento.rb new file mode 100644 index 0000000000..ebf3866bbd --- /dev/null +++ b/app/models/departamento.rb @@ -0,0 +1,12 @@ +# Representa um departamento acadêmico da instituição. +# +# Agrupa +Curso+s, +Disciplina+s e +Administrador+es. Não pode ser excluído +# enquanto houver cursos ou disciplinas vinculados (+restrict_with_error+). +# Identificado de forma única pelo atributo +codigo+. +class Departamento < ApplicationRecord + has_many :cursos, dependent: :restrict_with_error + has_many :disciplinas, dependent: :restrict_with_error + has_many :administradores + validates :codigo, presence: true, uniqueness: true + validates :nome, presence: true +end diff --git a/app/models/discente.rb b/app/models/discente.rb new file mode 100644 index 0000000000..d750da22e5 --- /dev/null +++ b/app/models/discente.rb @@ -0,0 +1,9 @@ +# Representa um estudante (aluno) cadastrado no sistema. +# +# Herda de +Usuario+ e obrigatoriamente pertence a um +Curso+. Pode estar +# matriculado em múltiplas +Turma+s, nas quais receberá formulários de +# avaliação para responder. +class Discente < Usuario + validates :curso_id, presence: true + has_and_belongs_to_many :turmas, join_table: "discentes_turmas" +end diff --git a/app/models/disciplina.rb b/app/models/disciplina.rb new file mode 100644 index 0000000000..02f69a7417 --- /dev/null +++ b/app/models/disciplina.rb @@ -0,0 +1,10 @@ +# Representa uma disciplina ofertada por um +Departamento+. +# +# Pode ter múltiplas +Turma+s associadas (uma por semestre/oferta). Identificada +# de forma única pelo atributo +codigo+, que corresponde ao código do SIGAA. +class Disciplina < ApplicationRecord + belongs_to :departamento + has_many :turmas, dependent: :destroy + validates :codigo, presence: true, uniqueness: true + validates :nome, presence: true +end diff --git a/app/models/docente.rb b/app/models/docente.rb new file mode 100644 index 0000000000..d891f9d270 --- /dev/null +++ b/app/models/docente.rb @@ -0,0 +1,9 @@ +# Representa um professor vinculado a uma ou mais turmas. +# +# Herda de +Usuario+ e exige que o atributo +formacao+ esteja preenchido. +# Pode estar associado a múltiplas +Turma+s e é alvo das avaliações +# respondidas pelos discentes via +Formulario+. +class Docente < Usuario + validates :formacao, presence: true + has_and_belongs_to_many :turmas, join_table: "docentes_turmas" +end diff --git a/app/models/elemento.rb b/app/models/elemento.rb new file mode 100644 index 0000000000..c55644e207 --- /dev/null +++ b/app/models/elemento.rb @@ -0,0 +1,10 @@ +# Representa uma questão dentro de um +Template+ de avaliação. +# +# Contém um enunciado e uma ordem de exibição, além de possuir múltiplos +# +Campo+s que definem as opções de resposta (para questões de múltipla +# escolha) ou configuram o tipo da questão. +class Elemento < ApplicationRecord + belongs_to :template + has_many :campos, dependent: :destroy + accepts_nested_attributes_for :campos, allow_destroy: true +end diff --git a/app/models/elemento_form.rb b/app/models/elemento_form.rb new file mode 100644 index 0000000000..b1138104c9 --- /dev/null +++ b/app/models/elemento_form.rb @@ -0,0 +1,10 @@ +# Representa uma questão instanciada em um +Formulario+ de avaliação. +# +# É criado a partir de um +Elemento+ de template no momento em que o formulário +# é enviado a uma turma. Contém o enunciado e o tipo da questão, e agrupa os +# +CampoForm+s com as opções de resposta disponíveis. +class ElementoForm < ApplicationRecord + belongs_to :formulario + has_many :campo_forms, dependent: :destroy + validates :ordem, presence: true +end diff --git a/app/models/formulario.rb b/app/models/formulario.rb new file mode 100644 index 0000000000..713d1db2ff --- /dev/null +++ b/app/models/formulario.rb @@ -0,0 +1,10 @@ +# Representa um formulário de avaliação enviado a uma turma. +# +# É criado a partir de um +Template+ e associado a uma +Turma+. Contém os +# +ElementoForm+s (questões) que os usuários respondem, e agrega as +# +RespostaForm+s submetidas pelos participantes. +class Formulario < ApplicationRecord + belongs_to :turma + has_many :elemento_forms, dependent: :destroy + has_many :resposta_forms, dependent: :destroy +end diff --git a/app/models/resposta_elem.rb b/app/models/resposta_elem.rb new file mode 100644 index 0000000000..918c8d3c3e --- /dev/null +++ b/app/models/resposta_elem.rb @@ -0,0 +1,11 @@ +# Representa a resposta de um usuário a um elemento (questão) específico do formulário. +# +# Pertence a uma +RespostaForm+ e ao +ElementoForm+ respondido. Para questões de +# múltipla escolha, também referencia o +CampoForm+ selecionado. Para questões de +# texto livre, +campo_form+ é opcional e o conteúdo fica em +texto_resposta+. +class RespostaElem < ApplicationRecord + belongs_to :resposta_form + belongs_to :elemento_form + belongs_to :campo_form, optional: true + validates :texto_resposta, presence: true +end diff --git a/app/models/resposta_form.rb b/app/models/resposta_form.rb new file mode 100644 index 0000000000..105799dc83 --- /dev/null +++ b/app/models/resposta_form.rb @@ -0,0 +1,14 @@ +# Representa a submissão completa de um formulário de avaliação por um usuário. +# +# Registra qual +Usuario+ respondeu qual +Formulario+ e em que data. Um usuário +# só pode submeter uma resposta por formulário (unicidade do par usuario_id + +# formulario_id). Agrega os +RespostaElem+s com as respostas individuais a cada questão. +class RespostaForm < ApplicationRecord + belongs_to :formulario + belongs_to :usuario + has_many :resposta_elems, dependent: :destroy + validates :data_submissao, presence: true + validates :usuario_id, uniqueness: { + scope: :formulario_id + } +end diff --git a/app/models/template.rb b/app/models/template.rb new file mode 100644 index 0000000000..de344086ae --- /dev/null +++ b/app/models/template.rb @@ -0,0 +1,61 @@ +# Representa um modelo reutilizável de formulário criado por um +Administrador+. +# +# Contém um conjunto ordenado de +Elemento+s (questões), cada um com seus +# +Campo+s (opções). Ao ser enviado a turmas, o template é instanciado em +# +Formulario+s com +ElementoForm+s e +CampoForm+s correspondentes. +class Template < ApplicationRecord + belongs_to :administrador, foreign_key: "usuario_id", class_name: "Administrador" + has_many :elementos, dependent: :destroy + accepts_nested_attributes_for :elementos, allow_destroy: true + + validate :validar_titulo + validate :validar_elementos + validate :validar_preenchimento + + private + + # Valida que o nome do template não está em branco. + # + # @return [void] + # @note Adiciona erro em +:base+ se o atributo +nome+ estiver vazio. + def validar_titulo + if nome.blank? + errors.add(:base, "Título não pode ficar em branco!") + end + end + + # Valida que o template possui pelo menos um elemento não marcado para exclusão. + # + # @return [void] + # @note Adiciona erro em +:base+ se nenhum elemento sobreviver à filtragem de + # +marked_for_destruction?+. + def validar_elementos + if elementos.reject(&:marked_for_destruction?).empty? + errors.add(:base, "Template deve ter pelo menos um elemento!") + end + end + + # Valida que todos os elementos e seus campos estão devidamente preenchidos. + # + # @return [void] + # @note Adiciona erro em +:base+ e interrompe a execução na primeira violação + # encontrada: enunciado de elemento em branco, ou enunciado de campo em branco + # quando o tipo do campo não é "Texto". Não é executada se já existirem erros + # prévios. + def validar_preenchimento + return if errors.any? + elementos.reject(&:marked_for_destruction?).each do |elemento| + if elemento.enunciado.blank? + errors.add(:base, "O texto de todas as questões deve ser preenchido!") + return # Para a execução aqui para não repetir a mensagem várias vezes + end + + elemento.campos.reject(&:marked_for_destruction?).each do |campo| + if campo.tipo_elemento != "Texto" && campo.enunciado.blank? + errors.add(:base, "Todas as opções das questões devem ser preenchidas!") + return + end + end + end + end +end diff --git a/app/models/turma.rb b/app/models/turma.rb new file mode 100644 index 0000000000..25eb366798 --- /dev/null +++ b/app/models/turma.rb @@ -0,0 +1,16 @@ +# Representa uma oferta de disciplina em um determinado semestre. +# +# Agrupa +Discente+s e +Docente+s que cursam/ministram uma +Disciplina+ em um +# semestre específico. Cada turma pode ter múltiplos +Formulario+s de avaliação +# associados. O número da turma é único dentro do escopo de semestre e disciplina. +class Turma < ApplicationRecord + belongs_to :disciplina + has_many :formularios, dependent: :destroy + has_and_belongs_to_many :discentes, join_table: "discentes_turmas" + has_and_belongs_to_many :docentes, join_table: "docentes_turmas" + + validates :numero_da_turma, presence: true, uniqueness: { + scope: [ :semestre, :disciplina_id ] + } + validates :semestre, presence: true +end diff --git a/app/models/usuario.rb b/app/models/usuario.rb new file mode 100644 index 0000000000..a908817300 --- /dev/null +++ b/app/models/usuario.rb @@ -0,0 +1,132 @@ +# Classe base para todos os usuários do sistema (STI). +# +# Gerencia autenticação via BCrypt e tokens de email para definição e +# redefinição de senha. As subclasses concretas são +Administrador+, +# +Docente+ e +Discente+, diferenciadas pela coluna +type+ (Single Table +# Inheritance). +class Usuario < ApplicationRecord + belongs_to :curso, optional: true + belongs_to :departamento, optional: true + validates :matricula, presence: true, uniqueness: true + validates :email, presence: true, uniqueness: true + validates :nome, presence: true + + attr_reader :senha + attr_accessor :senha_confirmation + + before_save :atualizar_senha_hash, if: -> { senha.present? } + validate :validar_senha, if: -> { senha.present? } + + # Armazena a senha em texto plano em atributo virtual para uso nas validações e no hash. + # + # @param nova_senha [String] senha em texto plano fornecida pelo usuário + # @return [String] a mesma senha recebida + def senha=(nova_senha) + @senha = nova_senha + end + + # Verifica se o usuário já possui uma senha cadastrada. + # + # @return [Boolean] +true+ se o hash de senha estiver presente, +false+ caso contrário + def senha_definida? + senha_hash.present? + end + + # Verifica se a senha fornecida corresponde ao hash armazenado. + # + # @param tentativa [String] senha em texto plano a ser verificada + # @return [Boolean] +true+ se a senha conferir, +false+ caso contrário ou se o hash + # for inválido + def autenticar_senha(tentativa) + return false if senha_hash.blank? + + BCrypt::Password.new(senha_hash) == tentativa + rescue BCrypt::Errors::InvalidHash + false + end + + # Gera e persiste um token de definição de senha com a data/hora atual. + # + # @return [void] + # @note Atualiza os campos +definicao_senha_token+ e +definicao_senha_sent_at+ + # diretamente no banco de dados. + def gerar_definicao_senha_token! + update!( + definicao_senha_token: SecureRandom.urlsafe_base64(32), + definicao_senha_sent_at: Time.current + ) + end + + # Gera o token de definição de senha e envia o email correspondente ao usuário. + # + # @return [void] + # @note Chama +gerar_definicao_senha_token!+ e dispara o envio do email via + # +UsuarioMailer#definicao_senha+ de forma síncrona. + def enviar_email_definicao_senha! + gerar_definicao_senha_token! + UsuarioMailer.definicao_senha(self).deliver_now + end + + # Gera e persiste um token de redefinição de senha com a data/hora atual. + # + # @return [void] + # @note Atualiza os campos +redefinicao_senha_token+ e +redefinicao_senha_sent_at+ + # diretamente no banco de dados. + def gerar_redefinicao_senha_token! + update!( + redefinicao_senha_token: SecureRandom.urlsafe_base64(32), + redefinicao_senha_sent_at: Time.current + ) + end + + # Gera o token de redefinição de senha e envia o email correspondente ao usuário. + # + # @return [void] + # @note Chama +gerar_redefinicao_senha_token!+ e dispara o envio do email via + # +UsuarioMailer#redefinicao_senha+ de forma síncrona. + def enviar_email_redefinicao_senha! + gerar_redefinicao_senha_token! + UsuarioMailer.redefinicao_senha(self).deliver_now + end + + # Remove o token de redefinição de senha e a data de envio do banco de dados. + # + # @return [void] + # @note Define +redefinicao_senha_token+ e +redefinicao_senha_sent_at+ como +nil+. + def limpar_redefinicao_senha_token! + update!(redefinicao_senha_token: nil, redefinicao_senha_sent_at: nil) + end + + # Remove o token de definição de senha e a data de envio do banco de dados. + # + # @return [void] + # @note Define +definicao_senha_token+ e +definicao_senha_sent_at+ como +nil+. + def limpar_definicao_senha_token! + update!(definicao_senha_token: nil, definicao_senha_sent_at: nil) + end + + private + + # Valida a confirmação e o tamanho mínimo da senha. + # + # @return [void] + # @note Adiciona erros em +:senha+ se a confirmação não conferir ou se a senha tiver + # menos de 6 caracteres. + def validar_senha + if senha_confirmation.present? && senha != senha_confirmation + errors.add(:senha, :confirmation, message: "confirmação não confere") + end + + if senha.length < 6 + errors.add(:senha, :invalid, message: "senha inválida") + end + end + + # Gera e armazena o hash BCrypt da senha antes de salvar o registro. + # + # @return [void] + # @note Atualiza o campo virtual +senha_hash+ com o resultado de +BCrypt::Password.create+. + def atualizar_senha_hash + self.senha_hash = BCrypt::Password.create(senha) + end +end diff --git a/app/services/sigaa_importer.rb b/app/services/sigaa_importer.rb new file mode 100644 index 0000000000..2c6841eaab --- /dev/null +++ b/app/services/sigaa_importer.rb @@ -0,0 +1,399 @@ +# Serviço responsável pela importação e atualização de dados acadêmicos a partir +# dos arquivos JSON exportados pelo SIGAA (Sistema Integrado de Gestão de Atividades +# Acadêmicas). +# +# Processa dois arquivos: o de turmas/disciplinas (classes.json) e o de membros +# (class_members.json), criando ou atualizando +Departamento+s, +Disciplina+s, +# +Turma+s, +Docente+s, +Discente+s e +Curso+s dentro de uma única transação. +# Toda a lógica de persistência é encapsulada em métodos privados especializados, +# mantendo os métodos públicos enxutos. +# +# Os métodos de classe (+self.import_from_files+, +self.update_from_files+) são +# a interface pública recomendada; eles delegam para instâncias privadas para +# facilitar testes e reutilização interna. +class SigaaImporter + DEFAULT_DEP_CODIGO = "NAO_ESP".freeze + DEFAULT_DEP_NOME = "Não especificado".freeze + + # Agrupa o hash de membro com a turma correspondente, eliminando a necessidade + # de passar ambos como argumentos separados em todos os métodos de processamento. + MemberEntry = Struct.new(:member_hash, :turma) + + # Importa disciplinas, turmas, docentes e discentes a partir dos arquivos JSON do SIGAA. + # + # Registros já existentes no banco de dados (identificados por código ou email/matrícula) + # são ignorados; somente novos registros são criados. + # + # @param classes_path [String] caminho para o arquivo JSON com os dados das turmas/disciplinas + # @param members_path [String] caminho para o arquivo JSON com os dados dos membros (docentes e discentes) + # @return [String] mensagem descrevendo o resultado da operação + def self.import_from_files(classes_path, members_path) + new.import_from_files(classes_path, members_path) + end + + # Executa a importação propriamente dita (método de instância delegado pelo class method). + # + # @param classes_path [String] caminho para o arquivo JSON de turmas/disciplinas + # @param members_path [String] caminho para o arquivo JSON de membros + # @return [String] mensagem de resultado da operação + # @note Toda a operação roda dentro de uma transação; em caso de erro a transação + # é revertida e retorna "a importação falhou". + def import_from_files(classes_path, members_path) + counters = { created: 0, ignored: 0 } + + ActiveRecord::Base.transaction do + dep_padrao + import_classes_into(classes_path, counters) + import_members_into(members_path, counters) + end + + build_import_result(counters) + rescue StandardError + "a importação falhou" + end + + # Atualiza disciplinas, turmas, docentes e discentes existentes a partir dos arquivos JSON do SIGAA. + # + # @param classes_path [String] caminho para o arquivo JSON com os dados das turmas/disciplinas + # @param members_path [String] caminho para o arquivo JSON com os dados dos membros (docentes e discentes) + # @return [String] mensagem descrevendo o resultado da operação + def self.update_from_files(classes_path, members_path) + new.update_from_files(classes_path, members_path) + end + + # Executa a atualização propriamente dita (método de instância delegado pelo class method). + # + # @param classes_path [String] caminho para o arquivo JSON de turmas/disciplinas + # @param members_path [String] caminho para o arquivo JSON de membros + # @return [String] mensagem de resultado da operação + # @note Toda a operação roda dentro de uma transação; em caso de erro a transação + # é revertida e retorna "a atualização falhou". + def update_from_files(classes_path, members_path) + ActiveRecord::Base.transaction do + update_classes_from(classes_path) + update_members_from(members_path) + end + + "atualização realizada com sucesso" + rescue StandardError + "a atualização falhou" + end + + private + + # Departamentos ------------------------------------------------------------ + + # Retorna (ou cria na primeira chamada) o departamento padrão "Não especificado". + # + # @return [Departamento] instância memoizada do departamento padrão + def dep_padrao + @dep_padrao ||= Departamento.find_or_create_by!(codigo: DEFAULT_DEP_CODIGO) do |departamento| + departamento.nome = DEFAULT_DEP_NOME + end + end + + # Localiza ou cria um departamento pelo nome informado. + # + # @param nome [String, nil] nome do departamento; se em branco, retorna o padrão + # @return [Departamento] departamento encontrado ou recém-criado + def find_or_create_departamento(nome) + return dep_padrao if nome.blank? + + codigo = codigo_de_nome(nome, 20) + Departamento.find_or_create_by!(codigo: codigo) { |dep| dep.nome = nome } + end + + # Cursos ------------------------------------------------------------------- + + # Localiza ou cria um curso pelo nome informado durante a importação. + # + # @param nome [String, nil] nome do curso; se em branco, retorna +nil+ + # @return [Curso, nil] curso encontrado ou recém-criado, ou +nil+ se nome ausente + def find_or_create_curso(nome) + return nil if nome.blank? + + codigo = codigo_de_nome(nome, 30) + Curso.find_or_create_by!(codigo: codigo) do |curso| + curso.nome = nome + curso.departamento = dep_padrao + end + end + + # Localiza um curso existente pelo nome durante a atualização (não cria novo). + # + # @param nome [String, nil] nome do curso; se em branco, retorna +nil+ + # @return [Curso, nil] curso encontrado por código derivado ou por nome, ou +nil+ + def find_curso(nome) + return nil if nome.blank? + + codigo = codigo_de_nome(nome, 30) + Curso.find_by(codigo: codigo) || Curso.find_by(nome: nome) + end + + # JSON parsing ------------------------------------------------------------- + + # Lê e faz o parse de um arquivo JSON. + # + # @param path [String] caminho absoluto para o arquivo + # @return [Array] lista de entradas do JSON + def parse_json(path) + JSON.parse(File.read(path)) + end + + # Turma lookup ------------------------------------------------------------- + + # Localiza a turma referenciada por um hash de membro do JSON. + # + # @param member_hash [Hash] entrada do JSON de membros contendo os dados da turma + # @return [Turma, nil] turma encontrada, ou +nil+ se a disciplina ou turma não existir + def lookup_turma(member_hash) + code = member_hash.dig("class", "code") || member_hash["code"] + class_code = member_hash.dig("class", "classCode") || member_hash["classCode"] + semester = member_hash.dig("class", "semester") || member_hash["semester"] + + disciplina = Disciplina.find_by(codigo: code) + Turma.find_by(disciplina: disciplina, numero_da_turma: class_code, semestre: semester) + end + + # Import classes ----------------------------------------------------------- + + # Importa disciplinas e turmas a partir do arquivo JSON de classes. + # + # @param classes_path [String] caminho para o arquivo JSON de turmas/disciplinas + # @param counters [Hash] hash com chaves +:created+ e +:ignored+ para contagem + # @return [void] + def import_classes_into(classes_path, counters) + parse_json(classes_path).each do |entry| + disciplina = find_or_create_disciplina(entry) + turma = find_or_create_turma(disciplina, entry["class"] || {}) + + if turma.created_at == turma.updated_at + counters[:created] += 1 + else + counters[:ignored] += 1 + end + end + end + + # Localiza ou cria uma disciplina a partir de uma entrada do JSON de classes. + # + # @param entry [Hash] entrada do JSON com as chaves "code" e "name" + # @return [Disciplina] disciplina encontrada ou recém-criada + def find_or_create_disciplina(entry) + Disciplina.find_or_create_by!(codigo: entry["code"]) do |disciplina| + disciplina.nome = entry["name"] + disciplina.departamento = dep_padrao + end + end + + # Localiza ou cria uma turma para a disciplina a partir dos dados de classe. + # + # @param disciplina [Disciplina] disciplina à qual a turma pertence + # @param class_info [Hash] hash com "classCode", "semester" e "time" + # @return [Turma] turma encontrada ou recém-criada + def find_or_create_turma(disciplina, class_info) + Turma.find_or_create_by!( + disciplina: disciplina, + numero_da_turma: class_info["classCode"], + semestre: class_info["semester"] + ) do |turma| + turma.horario = class_info["time"] + end + end + + # Update classes ----------------------------------------------------------- + + # Atualiza disciplinas e turmas existentes a partir do arquivo JSON de classes. + # + # @param classes_path [String] caminho para o arquivo JSON de turmas/disciplinas + # @return [void] + # @note Apenas registros já existentes são atualizados; nenhum novo é criado. + def update_classes_from(classes_path) + parse_json(classes_path).each do |entry| + disciplina = Disciplina.find_by(codigo: entry["code"]) + disciplina&.update(nome: entry["name"]) + + class_info = entry["class"] || {} + turma = Turma.find_by( + disciplina: disciplina, + numero_da_turma: class_info["classCode"], + semestre: class_info["semester"] + ) + turma&.update(horario: class_info["time"]) + end + end + + # Import members (docentes + discentes) ------------------------------------ + + # Importa docentes e discentes a partir do arquivo JSON de membros. + # + # @param members_path [String] caminho para o arquivo JSON de membros + # @param counters [Hash] hash com chaves +:created+ e +:ignored+ para contagem + # @return [void] + def import_members_into(members_path, counters) + parse_json(members_path).each do |member| + turma = lookup_turma(member) + next unless turma + + entry = MemberEntry.new(member, turma) + import_docente(entry, counters) + import_discentes(entry, counters) + end + end + + # Importa ou ignora o docente de uma entrada do JSON de membros. + # + # @param entry [MemberEntry] entrada com member_hash e turma + # @param counters [Hash] hash de contagem +:created+/+:ignored+ + # @return [void] + def import_docente(entry, counters) + docente_hash = entry.member_hash["docente"] + return unless docente_hash.is_a?(Hash) + + dep = find_or_create_departamento(docente_hash["departamento"]) + docente = find_or_create_docente(docente_hash, dep) + add_membro_to_turma(docente, entry.turma, counters) + end + + # Localiza ou cria um docente pelo email. + # + # @param docente_hash [Hash] hash com dados do docente (email, nome, matricula, formacao) + # @param departamento [Departamento] departamento ao qual o docente pertence + # @return [Docente] docente encontrado ou recém-criado + def find_or_create_docente(docente_hash, departamento) + Docente.find_or_create_by!(email: docente_hash["email"]) do |docente| + docente.nome = docente_hash["nome"] + docente.matricula = docente_hash["matricula"] || docente_hash["usuario"] + docente.formacao = docente_hash["formacao"] || "docente" + docente.departamento = departamento + end + end + + # Importa ou ignora os discentes de uma entrada do JSON de membros. + # + # @param entry [MemberEntry] entrada com member_hash e turma + # @param counters [Hash] hash de contagem +:created+/+:ignored+ + # @return [void] + def import_discentes(entry, counters) + Array(entry.member_hash["dicente"]).each do |aluno| + next unless aluno.is_a?(Hash) + + curso = find_or_create_curso(aluno["curso"]) + discente = find_or_create_discente(aluno, curso) + add_membro_to_turma(discente, entry.turma, counters) + end + end + + # Localiza ou cria um discente pela matrícula. + # + # @param aluno_hash [Hash] hash com dados do aluno (matricula, nome, email, formacao) + # @param curso [Curso, nil] curso ao qual o discente pertence + # @return [Discente] discente encontrado ou recém-criado + def find_or_create_discente(aluno_hash, curso) + Discente.find_or_create_by!(matricula: aluno_hash["matricula"]) do |discente| + discente.nome = aluno_hash["nome"] + discente.email = aluno_hash["email"] + discente.formacao = aluno_hash["formacao"] || "graduando" + discente.curso = curso if curso + end + end + + # Update members ----------------------------------------------------------- + + # Atualiza docentes e discentes existentes a partir do arquivo JSON de membros. + # + # @param members_path [String] caminho para o arquivo JSON de membros + # @return [void] + # @note Apenas registros já existentes são atualizados; nenhum novo é criado. + def update_members_from(members_path) + parse_json(members_path).each do |member| + turma = lookup_turma(member) + next unless turma + + entry = MemberEntry.new(member, turma) + update_docente(entry) + update_discentes(entry) + end + end + + # Atualiza o docente de uma entrada do JSON de membros, se ele já existir. + # + # @param entry [MemberEntry] entrada com member_hash e turma + # @return [void] + def update_docente(entry) + docente_hash = entry.member_hash["docente"] + return unless docente_hash.is_a?(Hash) + + dep = find_or_create_departamento(docente_hash["departamento"]) + docente = Docente.find_by(email: docente_hash["email"]) + return unless docente + + docente.update( + nome: docente_hash["nome"], + departamento: dep || docente.departamento + ) + docente.turmas << entry.turma unless docente.turmas.exists?(entry.turma.id) + end + + # Atualiza os discentes de uma entrada do JSON de membros, se eles já existirem. + # + # @param entry [MemberEntry] entrada com member_hash e turma + # @return [void] + def update_discentes(entry) + Array(entry.member_hash["dicente"]).each do |aluno| + next unless aluno.is_a?(Hash) + + curso = find_curso(aluno["curso"]) + discente = Discente.find_by(matricula: aluno["matricula"]) + next unless discente + + discente.update( + nome: aluno["nome"], + email: aluno["email"], + curso: curso || discente.curso + ) + discente.turmas << entry.turma unless discente.turmas.exists?(entry.turma.id) + end + end + + # Helpers ------------------------------------------------------------------ + + # Adiciona um membro (docente ou discente) a uma turma, incrementando os contadores. + # + # @param membro [Docente, Discente] membro a ser adicionado + # @param turma [Turma] turma alvo + # @param counters [Hash] hash de contagem +:created+/+:ignored+ + # @return [void] + def add_membro_to_turma(membro, turma, counters) + if membro.turmas.exists?(turma.id) + counters[:ignored] += 1 + else + membro.turmas << turma + counters[:created] += 1 + end + end + + # Deriva um código curto a partir de um nome por parametrização e truncamento. + # + # @param nome [String] nome a converter + # @param max_length [Integer] número máximo de caracteres do código + # @return [String] código em maiúsculas com separadores underline + def codigo_de_nome(nome, max_length) + nome.parameterize(separator: "_").upcase.first(max_length) + end + + # Constrói a mensagem de resultado da importação com base nos contadores. + # + # @param counters [Hash] hash com as chaves +:created+ e +:ignored+ + # @return [String] mensagem descritiva do resultado + def build_import_result(counters) + created = counters[:created] + if created > 0 && counters[:ignored] > 0 + "alguns dados já foram importados e não serão importados novamente, mas os dados restantes foram importados com sucesso" + elsif created == 0 + "os dados já existem e não foram duplicados" + else + "importação realizada com sucesso" + end + end +end diff --git a/app/views/admin/avaliacoes.html.erb b/app/views/admin/avaliacoes.html.erb new file mode 100644 index 0000000000..e68456981e --- /dev/null +++ b/app/views/admin/avaliacoes.html.erb @@ -0,0 +1,32 @@ +<% if @avaliacoes.present? %> +
+ + <% @avaliacoes.each do |formulario| %> + <% turma = formulario.turma %> + <% disciplina = turma.disciplina %> + <% professor = turma.docentes.first %> + +
+
+

+ <%= disciplina.nome %> +

+

+ <%= turma.semestre %><%= " — #{turma.horario}" if turma.horario.present? %> +

+
+ +
+

+ <%= professor&.nome || "Professor(a) não alocado(a)" %> +

+
+
+ <% end %> + +
+<% else %> +
+

Nenhuma avaliação disponível no momento.

+
+<% end %> diff --git a/app/views/admin/enviar_formularios.html.erb b/app/views/admin/enviar_formularios.html.erb new file mode 100644 index 0000000000..28842e4758 --- /dev/null +++ b/app/views/admin/enviar_formularios.html.erb @@ -0,0 +1,57 @@ + diff --git a/app/views/admin/exportar_csv.csv.erb b/app/views/admin/exportar_csv.csv.erb new file mode 100644 index 0000000000..fae955b369 --- /dev/null +++ b/app/views/admin/exportar_csv.csv.erb @@ -0,0 +1,24 @@ +<% + colunas_dinamicas = ElementoForm.where(formulario_id: @formulario.id) + .order(:ordem) + .pluck(:enunciado) + + cabecalho = ["Usuário da Resposta", "Data de Submissão"] + colunas_dinamicas +-%> +<%= raw CSV.generate_line(cabecalho) -%> +<% @respostas.each do |resposta| -%> +<% + respostas_do_usuario = resposta.resposta_elems.index_by { |re| re.elemento_form.enunciado } + + linha = [ + resposta.usuario&.nome || "Anônimo", + resposta.created_at.strftime("%d/%m/%Y %H:%M") + ] + + colunas_dinamicas.each do |enunciado| + resposta_do_campo = respostas_do_usuario[enunciado] + linha << resposta_do_campo&.texto_resposta + end +-%> +<%= raw CSV.generate_line(linha) -%> +<% end -%> \ No newline at end of file diff --git a/app/views/admin/gerenciamento.html.erb b/app/views/admin/gerenciamento.html.erb new file mode 100644 index 0000000000..d107dde90a --- /dev/null +++ b/app/views/admin/gerenciamento.html.erb @@ -0,0 +1,12 @@ +
+ +

+ Ações de Gerenciamento +

+ + <%= link_to "Importar / Atualizar dados do SIGAA", admin_sincronizar_sigaa_path(@admin), class: "btn-figma" %> + <%= link_to "Editar Templates", admin_templates_path(@admin), class: "btn-figma" %> + <%= link_to "Enviar Formulários", admin_enviar_formularios_path(@admin), class: "btn-figma" %> + <%= button_to "Resultados", admin_resultados_path(@admin), method: :get, class: "btn-figma" %> + +
diff --git a/app/views/admin/resultados.html.erb b/app/views/admin/resultados.html.erb new file mode 100644 index 0000000000..5120a9f593 --- /dev/null +++ b/app/views/admin/resultados.html.erb @@ -0,0 +1,42 @@ +
+ + <% if @formularios.present? %> +
+ + <% @formularios.each do |formulario| %> +
+ +
+

+ <%= formulario.turma.disciplina.nome %> +

+

+ Turma <%= formulario.turma.numero_da_turma %> +

+

+ <%= formulario.turma.semestre %> - <%= formulario.turma.horario %> +

+
+ +
+

+ <%# Caso a relação no seu model seja diferente, ajuste '.docentes' para o nome correto %> + <%= formulario.turma.docentes.first&.nome || "Professor(a) não alocado(a)" %> +

+ + <%= link_to "Baixar Resultado", admin_baixar_csv_path(@admin, id: formulario.id, format: :csv), style: "display: block; text-align: center; background-color: #612F65; color: white; text-decoration: none; padding: 10px 16px; border-radius: 4px; font-weight: bold; font-size: 0.9rem;" %> +
+ +
+ <% end %> + +
+ <% else %> + +
+

Nenhum formulário encontrado para o seu departamento neste semestre.

+
+ + <% end %> + +
\ No newline at end of file diff --git a/app/views/admin/sincronizar_sigaa.html.erb b/app/views/admin/sincronizar_sigaa.html.erb new file mode 100644 index 0000000000..2208979606 --- /dev/null +++ b/app/views/admin/sincronizar_sigaa.html.erb @@ -0,0 +1,27 @@ +
+

+ Sincronizar dados do SIGAA +

+ + <%= form_with local: true, url: admin_sincronizar_sigaa_path, method: :post, multipart: true do |f| %> +
+ <%= f.label :acao, "Tipo de sincronização:", style: "display: block; margin-bottom: 10px;" %> + <%= f.select :acao, [["Importar dados", "importar"], ["Atualizar dados", "atualizar"]], {}, class: "form-control" %> +
+ +
+ <%= f.label :arquivo_classes, "Arquivo de turmas (classes.json):", style: "display: block; margin-bottom: 10px;" %> + <%= f.file_field :arquivo_classes, accept: "application/json", required: true %> +
+ +
+ <%= f.label :arquivo_membros, "Arquivo de membros (class_members.json):", style: "display: block; margin-bottom: 10px;" %> + <%= f.file_field :arquivo_membros, accept: "application/json", required: true %> +
+ +
+ <%= f.submit "Sincronizar", class: "btn-figma" %> + <%= link_to "Cancelar", admin_gerenciamento_path, class: "btn-figma" %> +
+ <% end %> +
diff --git a/app/views/campo_forms/_campo_form.html.erb b/app/views/campo_forms/_campo_form.html.erb new file mode 100644 index 0000000000..017c946779 --- /dev/null +++ b/app/views/campo_forms/_campo_form.html.erb @@ -0,0 +1,17 @@ +
+
+ Ordem: + <%= campo_form.ordem %> +
+ +
+ Enunciado: + <%= campo_form.enunciado %> +
+ +
+ Elemento form: + <%= campo_form.elemento_form_id %> +
+ +
diff --git a/app/views/campo_forms/_campo_form.json.jbuilder b/app/views/campo_forms/_campo_form.json.jbuilder new file mode 100644 index 0000000000..8c75eb97e0 --- /dev/null +++ b/app/views/campo_forms/_campo_form.json.jbuilder @@ -0,0 +1,2 @@ +json.extract! campo_form, :id, :ordem, :enunciado, :elemento_form_id, :created_at, :updated_at +json.url campo_form_url(campo_form, format: :json) diff --git a/app/views/campo_forms/_form.html.erb b/app/views/campo_forms/_form.html.erb new file mode 100644 index 0000000000..a425f8b8fb --- /dev/null +++ b/app/views/campo_forms/_form.html.erb @@ -0,0 +1,32 @@ +<%= form_with(model: campo_form) do |form| %> + <% if campo_form.errors.any? %> +
+

<%= pluralize(campo_form.errors.count, "error") %> prohibited this campo_form from being saved:

+ +
    + <% campo_form.errors.each do |error| %> +
  • <%= error.full_message %>
  • + <% end %> +
+
+ <% end %> + +
+ <%= form.label :ordem, style: "display: block" %> + <%= form.number_field :ordem %> +
+ +
+ <%= form.label :enunciado, style: "display: block" %> + <%= form.text_field :enunciado %> +
+ +
+ <%= form.label :elemento_form_id, style: "display: block" %> + <%= form.text_field :elemento_form_id %> +
+ +
+ <%= form.submit %> +
+<% end %> diff --git a/app/views/campo_forms/edit.html.erb b/app/views/campo_forms/edit.html.erb new file mode 100644 index 0000000000..6fcbe94956 --- /dev/null +++ b/app/views/campo_forms/edit.html.erb @@ -0,0 +1,12 @@ +<% content_for :title, "Editing campo form" %> + +

Editing campo form

+ +<%= render "form", campo_form: @campo_form %> + +
+ +
+ <%= link_to "Show this campo form", @campo_form %> | + <%= link_to "Back to campo forms", campo_forms_path %> +
diff --git a/app/views/campo_forms/index.html.erb b/app/views/campo_forms/index.html.erb new file mode 100644 index 0000000000..8daeea2454 --- /dev/null +++ b/app/views/campo_forms/index.html.erb @@ -0,0 +1,16 @@ +

<%= notice %>

+ +<% content_for :title, "Campo forms" %> + +

Campo forms

+ +
+ <% @campo_forms.each do |campo_form| %> + <%= render campo_form %> +

+ <%= link_to "Show this campo form", campo_form %> +

+ <% end %> +
+ +<%= link_to "New campo form", new_campo_form_path %> diff --git a/app/views/campo_forms/index.json.jbuilder b/app/views/campo_forms/index.json.jbuilder new file mode 100644 index 0000000000..eb30da75b2 --- /dev/null +++ b/app/views/campo_forms/index.json.jbuilder @@ -0,0 +1 @@ +json.array! @campo_forms, partial: "campo_forms/campo_form", as: :campo_form diff --git a/app/views/campo_forms/new.html.erb b/app/views/campo_forms/new.html.erb new file mode 100644 index 0000000000..7b29b045a6 --- /dev/null +++ b/app/views/campo_forms/new.html.erb @@ -0,0 +1,11 @@ +<% content_for :title, "New campo form" %> + +

New campo form

+ +<%= render "form", campo_form: @campo_form %> + +
+ +
+ <%= link_to "Back to campo forms", campo_forms_path %> +
diff --git a/app/views/campo_forms/show.html.erb b/app/views/campo_forms/show.html.erb new file mode 100644 index 0000000000..8e6d73f6e0 --- /dev/null +++ b/app/views/campo_forms/show.html.erb @@ -0,0 +1,10 @@ +

<%= notice %>

+ +<%= render @campo_form %> + +
+ <%= link_to "Edit this campo form", edit_campo_form_path(@campo_form) %> | + <%= link_to "Back to campo forms", campo_forms_path %> + + <%= button_to "Destroy this campo form", @campo_form, method: :delete %> +
diff --git a/app/views/campo_forms/show.json.jbuilder b/app/views/campo_forms/show.json.jbuilder new file mode 100644 index 0000000000..08aeeb5981 --- /dev/null +++ b/app/views/campo_forms/show.json.jbuilder @@ -0,0 +1 @@ +json.partial! "campo_forms/campo_form", campo_form: @campo_form diff --git a/app/views/campos/_campo.html.erb b/app/views/campos/_campo.html.erb new file mode 100644 index 0000000000..16889ffbca --- /dev/null +++ b/app/views/campos/_campo.html.erb @@ -0,0 +1,22 @@ +
+
+ Ordem: + <%= campo.ordem %> +
+ +
+ Enunciado: + <%= campo.enunciado %> +
+ +
+ Tipo elemento: + <%= campo.tipo_elemento %> +
+ +
+ Elemento: + <%= campo.elemento_id %> +
+ +
diff --git a/app/views/campos/_campo.json.jbuilder b/app/views/campos/_campo.json.jbuilder new file mode 100644 index 0000000000..91c37792b6 --- /dev/null +++ b/app/views/campos/_campo.json.jbuilder @@ -0,0 +1,2 @@ +json.extract! campo, :id, :ordem, :enunciado, :tipo_elemento, :elemento_id, :created_at, :updated_at +json.url campo_url(campo, format: :json) diff --git a/app/views/campos/_form.html.erb b/app/views/campos/_form.html.erb new file mode 100644 index 0000000000..d240daebc8 --- /dev/null +++ b/app/views/campos/_form.html.erb @@ -0,0 +1,37 @@ +<%= form_with(model: campo) do |form| %> + <% if campo.errors.any? %> +
+

<%= pluralize(campo.errors.count, "error") %> prohibited this campo from being saved:

+ +
    + <% campo.errors.each do |error| %> +
  • <%= error.full_message %>
  • + <% end %> +
+
+ <% end %> + +
+ <%= form.label :ordem, style: "display: block" %> + <%= form.number_field :ordem %> +
+ +
+ <%= form.label :enunciado, style: "display: block" %> + <%= form.text_field :enunciado %> +
+ +
+ <%= form.label :tipo_elemento, style: "display: block" %> + <%= form.text_field :tipo_elemento %> +
+ +
+ <%= form.label :elemento_id, style: "display: block" %> + <%= form.text_field :elemento_id %> +
+ +
+ <%= form.submit %> +
+<% end %> diff --git a/app/views/campos/edit.html.erb b/app/views/campos/edit.html.erb new file mode 100644 index 0000000000..f7bf25cf92 --- /dev/null +++ b/app/views/campos/edit.html.erb @@ -0,0 +1,12 @@ +<% content_for :title, "Editing campo" %> + +

Editing campo

+ +<%= render "form", campo: @campo %> + +
+ +
+ <%= link_to "Show this campo", @campo %> | + <%= link_to "Back to campos", campos_path %> +
diff --git a/app/views/campos/index.html.erb b/app/views/campos/index.html.erb new file mode 100644 index 0000000000..d3f9dd8b6b --- /dev/null +++ b/app/views/campos/index.html.erb @@ -0,0 +1,16 @@ +

<%= notice %>

+ +<% content_for :title, "Campos" %> + +

Campos

+ +
+ <% @campos.each do |campo| %> + <%= render campo %> +

+ <%= link_to "Show this campo", campo %> +

+ <% end %> +
+ +<%= link_to "New campo", new_campo_path %> diff --git a/app/views/campos/index.json.jbuilder b/app/views/campos/index.json.jbuilder new file mode 100644 index 0000000000..3c0e743402 --- /dev/null +++ b/app/views/campos/index.json.jbuilder @@ -0,0 +1 @@ +json.array! @campos, partial: "campos/campo", as: :campo diff --git a/app/views/campos/new.html.erb b/app/views/campos/new.html.erb new file mode 100644 index 0000000000..96fe844c6e --- /dev/null +++ b/app/views/campos/new.html.erb @@ -0,0 +1,11 @@ +<% content_for :title, "New campo" %> + +

New campo

+ +<%= render "form", campo: @campo %> + +
+ +
+ <%= link_to "Back to campos", campos_path %> +
diff --git a/app/views/campos/show.html.erb b/app/views/campos/show.html.erb new file mode 100644 index 0000000000..3535330c82 --- /dev/null +++ b/app/views/campos/show.html.erb @@ -0,0 +1,10 @@ +

<%= notice %>

+ +<%= render @campo %> + +
+ <%= link_to "Edit this campo", edit_campo_path(@campo) %> | + <%= link_to "Back to campos", campos_path %> + + <%= button_to "Destroy this campo", @campo, method: :delete %> +
diff --git a/app/views/campos/show.json.jbuilder b/app/views/campos/show.json.jbuilder new file mode 100644 index 0000000000..bdb6307753 --- /dev/null +++ b/app/views/campos/show.json.jbuilder @@ -0,0 +1 @@ +json.partial! "campos/campo", campo: @campo diff --git a/app/views/cursos/_curso.html.erb b/app/views/cursos/_curso.html.erb new file mode 100644 index 0000000000..4542c6c387 --- /dev/null +++ b/app/views/cursos/_curso.html.erb @@ -0,0 +1,17 @@ +
+
+ Codigo: + <%= curso.codigo %> +
+ +
+ Nome: + <%= curso.nome %> +
+ +
+ Departamento: + <%= curso.departamento_id %> +
+ +
diff --git a/app/views/cursos/_curso.json.jbuilder b/app/views/cursos/_curso.json.jbuilder new file mode 100644 index 0000000000..fc8ea66f22 --- /dev/null +++ b/app/views/cursos/_curso.json.jbuilder @@ -0,0 +1,2 @@ +json.extract! curso, :id, :codigo, :nome, :departamento_id, :created_at, :updated_at +json.url curso_url(curso, format: :json) diff --git a/app/views/cursos/_form.html.erb b/app/views/cursos/_form.html.erb new file mode 100644 index 0000000000..8e110c66e9 --- /dev/null +++ b/app/views/cursos/_form.html.erb @@ -0,0 +1,32 @@ +<%= form_with(model: curso) do |form| %> + <% if curso.errors.any? %> +
+

<%= pluralize(curso.errors.count, "error") %> prohibited this curso from being saved:

+ +
    + <% curso.errors.each do |error| %> +
  • <%= error.full_message %>
  • + <% end %> +
+
+ <% end %> + +
+ <%= form.label :codigo, style: "display: block" %> + <%= form.text_field :codigo %> +
+ +
+ <%= form.label :nome, style: "display: block" %> + <%= form.text_field :nome %> +
+ +
+ <%= form.label :departamento_id, style: "display: block" %> + <%= form.text_field :departamento_id %> +
+ +
+ <%= form.submit %> +
+<% end %> diff --git a/app/views/cursos/edit.html.erb b/app/views/cursos/edit.html.erb new file mode 100644 index 0000000000..146b27780b --- /dev/null +++ b/app/views/cursos/edit.html.erb @@ -0,0 +1,12 @@ +<% content_for :title, "Editing curso" %> + +

Editing curso

+ +<%= render "form", curso: @curso %> + +
+ +
+ <%= link_to "Show this curso", @curso %> | + <%= link_to "Back to cursos", cursos_path %> +
diff --git a/app/views/cursos/index.html.erb b/app/views/cursos/index.html.erb new file mode 100644 index 0000000000..24626172a0 --- /dev/null +++ b/app/views/cursos/index.html.erb @@ -0,0 +1,16 @@ +

<%= notice %>

+ +<% content_for :title, "Cursos" %> + +

Cursos

+ +
+ <% @cursos.each do |curso| %> + <%= render curso %> +

+ <%= link_to "Show this curso", curso %> +

+ <% end %> +
+ +<%= link_to "New curso", new_curso_path %> diff --git a/app/views/cursos/index.json.jbuilder b/app/views/cursos/index.json.jbuilder new file mode 100644 index 0000000000..2e39c23019 --- /dev/null +++ b/app/views/cursos/index.json.jbuilder @@ -0,0 +1 @@ +json.array! @cursos, partial: "cursos/curso", as: :curso diff --git a/app/views/cursos/new.html.erb b/app/views/cursos/new.html.erb new file mode 100644 index 0000000000..f4f7bec9ba --- /dev/null +++ b/app/views/cursos/new.html.erb @@ -0,0 +1,11 @@ +<% content_for :title, "New curso" %> + +

New curso

+ +<%= render "form", curso: @curso %> + +
+ +
+ <%= link_to "Back to cursos", cursos_path %> +
diff --git a/app/views/cursos/show.html.erb b/app/views/cursos/show.html.erb new file mode 100644 index 0000000000..3f0601c157 --- /dev/null +++ b/app/views/cursos/show.html.erb @@ -0,0 +1,10 @@ +

<%= notice %>

+ +<%= render @curso %> + +
+ <%= link_to "Edit this curso", edit_curso_path(@curso) %> | + <%= link_to "Back to cursos", cursos_path %> + + <%= button_to "Destroy this curso", @curso, method: :delete %> +
diff --git a/app/views/cursos/show.json.jbuilder b/app/views/cursos/show.json.jbuilder new file mode 100644 index 0000000000..74b378ecab --- /dev/null +++ b/app/views/cursos/show.json.jbuilder @@ -0,0 +1 @@ +json.partial! "cursos/curso", curso: @curso diff --git a/app/views/definicao_senhas/edit.html.erb b/app/views/definicao_senhas/edit.html.erb new file mode 100644 index 0000000000..db28bdd159 --- /dev/null +++ b/app/views/definicao_senhas/edit.html.erb @@ -0,0 +1,17 @@ +

Definição de senha

+ +<%= form_with url: definicao_senha_path(token: params[:token]), method: :patch do %> +
+ <%= label_tag :senha, "Nova senha" %> + <%= password_field_tag :senha %> +
+ +
+ <%= label_tag :senha_confirmation, "Confirmar senha" %> + <%= password_field_tag :senha_confirmation %> +
+ +
+ <%= submit_tag "Definir senha" %> +
+<% end %> diff --git a/app/views/departamentos/_departamento.html.erb b/app/views/departamentos/_departamento.html.erb new file mode 100644 index 0000000000..b4e3907c9a --- /dev/null +++ b/app/views/departamentos/_departamento.html.erb @@ -0,0 +1,12 @@ +
+
+ Codigo: + <%= departamento.codigo %> +
+ +
+ Nome: + <%= departamento.nome %> +
+ +
diff --git a/app/views/departamentos/_departamento.json.jbuilder b/app/views/departamentos/_departamento.json.jbuilder new file mode 100644 index 0000000000..2145ba20c5 --- /dev/null +++ b/app/views/departamentos/_departamento.json.jbuilder @@ -0,0 +1,2 @@ +json.extract! departamento, :id, :codigo, :nome, :created_at, :updated_at +json.url departamento_url(departamento, format: :json) diff --git a/app/views/departamentos/_form.html.erb b/app/views/departamentos/_form.html.erb new file mode 100644 index 0000000000..a8ed55c8f4 --- /dev/null +++ b/app/views/departamentos/_form.html.erb @@ -0,0 +1,27 @@ +<%= form_with(model: departamento) do |form| %> + <% if departamento.errors.any? %> +
+

<%= pluralize(departamento.errors.count, "error") %> prohibited this departamento from being saved:

+ +
    + <% departamento.errors.each do |error| %> +
  • <%= error.full_message %>
  • + <% end %> +
+
+ <% end %> + +
+ <%= form.label :codigo, style: "display: block" %> + <%= form.text_field :codigo %> +
+ +
+ <%= form.label :nome, style: "display: block" %> + <%= form.text_field :nome %> +
+ +
+ <%= form.submit %> +
+<% end %> diff --git a/app/views/departamentos/edit.html.erb b/app/views/departamentos/edit.html.erb new file mode 100644 index 0000000000..f63ef9cac0 --- /dev/null +++ b/app/views/departamentos/edit.html.erb @@ -0,0 +1,12 @@ +<% content_for :title, "Editing departamento" %> + +

Editing departamento

+ +<%= render "form", departamento: @departamento %> + +
+ +
+ <%= link_to "Show this departamento", @departamento %> | + <%= link_to "Back to departamentos", departamentos_path %> +
diff --git a/app/views/departamentos/index.html.erb b/app/views/departamentos/index.html.erb new file mode 100644 index 0000000000..a05d2b04fa --- /dev/null +++ b/app/views/departamentos/index.html.erb @@ -0,0 +1,16 @@ +

<%= notice %>

+ +<% content_for :title, "Departamentos" %> + +

Departamentos

+ +
+ <% @departamentos.each do |departamento| %> + <%= render departamento %> +

+ <%= link_to "Show this departamento", departamento %> +

+ <% end %> +
+ +<%= link_to "New departamento", new_departamento_path %> diff --git a/app/views/departamentos/index.json.jbuilder b/app/views/departamentos/index.json.jbuilder new file mode 100644 index 0000000000..030ab748d1 --- /dev/null +++ b/app/views/departamentos/index.json.jbuilder @@ -0,0 +1 @@ +json.array! @departamentos, partial: "departamentos/departamento", as: :departamento diff --git a/app/views/departamentos/new.html.erb b/app/views/departamentos/new.html.erb new file mode 100644 index 0000000000..76eefa1cfb --- /dev/null +++ b/app/views/departamentos/new.html.erb @@ -0,0 +1,11 @@ +<% content_for :title, "New departamento" %> + +

New departamento

+ +<%= render "form", departamento: @departamento %> + +
+ +
+ <%= link_to "Back to departamentos", departamentos_path %> +
diff --git a/app/views/departamentos/show.html.erb b/app/views/departamentos/show.html.erb new file mode 100644 index 0000000000..2957799d46 --- /dev/null +++ b/app/views/departamentos/show.html.erb @@ -0,0 +1,10 @@ +

<%= notice %>

+ +<%= render @departamento %> + +
+ <%= link_to "Edit this departamento", edit_departamento_path(@departamento) %> | + <%= link_to "Back to departamentos", departamentos_path %> + + <%= button_to "Destroy this departamento", @departamento, method: :delete %> +
diff --git a/app/views/departamentos/show.json.jbuilder b/app/views/departamentos/show.json.jbuilder new file mode 100644 index 0000000000..13c4a70c0c --- /dev/null +++ b/app/views/departamentos/show.json.jbuilder @@ -0,0 +1 @@ +json.partial! "departamentos/departamento", departamento: @departamento diff --git a/app/views/discentes/_discente.html.erb b/app/views/discentes/_discente.html.erb new file mode 100644 index 0000000000..6d800585cc --- /dev/null +++ b/app/views/discentes/_discente.html.erb @@ -0,0 +1,27 @@ +
+
+ Matricula: + <%= discente.matricula %> +
+ +
+ Email: + <%= discente.email %> +
+ +
+ Nome: + <%= discente.nome %> +
+ +
+ Formacao: + <%= discente.formacao %> +
+ +
+ Curso: + <%= discente.curso_id %> +
+ +
diff --git a/app/views/discentes/_discente.json.jbuilder b/app/views/discentes/_discente.json.jbuilder new file mode 100644 index 0000000000..1451775555 --- /dev/null +++ b/app/views/discentes/_discente.json.jbuilder @@ -0,0 +1,2 @@ +json.extract! discente, :id, :matricula, :email, :nome, :formacao, :curso_id, :created_at, :updated_at +json.url discente_url(discente, format: :json) diff --git a/app/views/discentes/_form.html.erb b/app/views/discentes/_form.html.erb new file mode 100644 index 0000000000..1508351bb7 --- /dev/null +++ b/app/views/discentes/_form.html.erb @@ -0,0 +1,42 @@ +<%= form_with(model: discente) do |form| %> + <% if discente.errors.any? %> +
+

<%= pluralize(discente.errors.count, "error") %> prohibited this discente from being saved:

+ +
    + <% discente.errors.each do |error| %> +
  • <%= error.full_message %>
  • + <% end %> +
+
+ <% end %> + +
+ <%= form.label :matricula, style: "display: block" %> + <%= form.text_field :matricula %> +
+ +
+ <%= form.label :email, style: "display: block" %> + <%= form.text_field :email %> +
+ +
+ <%= form.label :nome, style: "display: block" %> + <%= form.text_field :nome %> +
+ +
+ <%= form.label :formacao, style: "display: block" %> + <%= form.text_field :formacao %> +
+ +
+ <%= form.label :curso_id, style: "display: block" %> + <%= form.text_field :curso_id %> +
+ +
+ <%= form.submit %> +
+<% end %> diff --git a/app/views/discentes/edit.html.erb b/app/views/discentes/edit.html.erb new file mode 100644 index 0000000000..b406df6523 --- /dev/null +++ b/app/views/discentes/edit.html.erb @@ -0,0 +1,12 @@ +<% content_for :title, "Editing discente" %> + +

Editing discente

+ +<%= render "form", discente: @discente %> + +
+ +
+ <%= link_to "Show this discente", @discente %> | + <%= link_to "Back to discentes", discentes_path %> +
diff --git a/app/views/discentes/index.html.erb b/app/views/discentes/index.html.erb new file mode 100644 index 0000000000..55626169e5 --- /dev/null +++ b/app/views/discentes/index.html.erb @@ -0,0 +1,16 @@ +

<%= notice %>

+ +<% content_for :title, "Discentes" %> + +

Discentes

+ +
+ <% @discentes.each do |discente| %> + <%= render discente %> +

+ <%= link_to "Show this discente", discente %> +

+ <% end %> +
+ +<%= link_to "New discente", new_discente_path %> diff --git a/app/views/discentes/index.json.jbuilder b/app/views/discentes/index.json.jbuilder new file mode 100644 index 0000000000..80c25ce894 --- /dev/null +++ b/app/views/discentes/index.json.jbuilder @@ -0,0 +1 @@ +json.array! @discentes, partial: "discentes/discente", as: :discente diff --git a/app/views/discentes/new.html.erb b/app/views/discentes/new.html.erb new file mode 100644 index 0000000000..964c1192ba --- /dev/null +++ b/app/views/discentes/new.html.erb @@ -0,0 +1,11 @@ +<% content_for :title, "New discente" %> + +

New discente

+ +<%= render "form", discente: @discente %> + +
+ +
+ <%= link_to "Back to discentes", discentes_path %> +
diff --git a/app/views/discentes/show.html.erb b/app/views/discentes/show.html.erb new file mode 100644 index 0000000000..253165e73e --- /dev/null +++ b/app/views/discentes/show.html.erb @@ -0,0 +1,10 @@ +

<%= notice %>

+ +<%= render @discente %> + +
+ <%= link_to "Edit this discente", edit_discente_path(@discente) %> | + <%= link_to "Back to discentes", discentes_path %> + + <%= button_to "Destroy this discente", @discente, method: :delete %> +
diff --git a/app/views/discentes/show.json.jbuilder b/app/views/discentes/show.json.jbuilder new file mode 100644 index 0000000000..0d3ad84a23 --- /dev/null +++ b/app/views/discentes/show.json.jbuilder @@ -0,0 +1 @@ +json.partial! "discentes/discente", discente: @discente diff --git a/app/views/disciplinas/_disciplina.html.erb b/app/views/disciplinas/_disciplina.html.erb new file mode 100644 index 0000000000..eece272568 --- /dev/null +++ b/app/views/disciplinas/_disciplina.html.erb @@ -0,0 +1,17 @@ +
+
+ Codigo: + <%= disciplina.codigo %> +
+ +
+ Nome: + <%= disciplina.nome %> +
+ +
+ Departamento: + <%= disciplina.departamento_id %> +
+ +
diff --git a/app/views/disciplinas/_disciplina.json.jbuilder b/app/views/disciplinas/_disciplina.json.jbuilder new file mode 100644 index 0000000000..c7fc54340e --- /dev/null +++ b/app/views/disciplinas/_disciplina.json.jbuilder @@ -0,0 +1,2 @@ +json.extract! disciplina, :id, :codigo, :nome, :departamento_id, :created_at, :updated_at +json.url disciplina_url(disciplina, format: :json) diff --git a/app/views/disciplinas/_form.html.erb b/app/views/disciplinas/_form.html.erb new file mode 100644 index 0000000000..373da8e92a --- /dev/null +++ b/app/views/disciplinas/_form.html.erb @@ -0,0 +1,32 @@ +<%= form_with(model: disciplina) do |form| %> + <% if disciplina.errors.any? %> +
+

<%= pluralize(disciplina.errors.count, "error") %> prohibited this disciplina from being saved:

+ +
    + <% disciplina.errors.each do |error| %> +
  • <%= error.full_message %>
  • + <% end %> +
+
+ <% end %> + +
+ <%= form.label :codigo, style: "display: block" %> + <%= form.text_field :codigo %> +
+ +
+ <%= form.label :nome, style: "display: block" %> + <%= form.text_field :nome %> +
+ +
+ <%= form.label :departamento_id, style: "display: block" %> + <%= form.text_field :departamento_id %> +
+ +
+ <%= form.submit %> +
+<% end %> diff --git a/app/views/disciplinas/edit.html.erb b/app/views/disciplinas/edit.html.erb new file mode 100644 index 0000000000..d43c76ac3f --- /dev/null +++ b/app/views/disciplinas/edit.html.erb @@ -0,0 +1,12 @@ +<% content_for :title, "Editing disciplina" %> + +

Editing disciplina

+ +<%= render "form", disciplina: @disciplina %> + +
+ +
+ <%= link_to "Show this disciplina", @disciplina %> | + <%= link_to "Back to disciplinas", disciplinas_path %> +
diff --git a/app/views/disciplinas/index.html.erb b/app/views/disciplinas/index.html.erb new file mode 100644 index 0000000000..f2806e550c --- /dev/null +++ b/app/views/disciplinas/index.html.erb @@ -0,0 +1,16 @@ +

<%= notice %>

+ +<% content_for :title, "Disciplinas" %> + +

Disciplinas

+ +
+ <% @disciplinas.each do |disciplina| %> + <%= render disciplina %> +

+ <%= link_to "Show this disciplina", disciplina %> +

+ <% end %> +
+ +<%= link_to "New disciplina", new_disciplina_path %> diff --git a/app/views/disciplinas/index.json.jbuilder b/app/views/disciplinas/index.json.jbuilder new file mode 100644 index 0000000000..f7dfbb1351 --- /dev/null +++ b/app/views/disciplinas/index.json.jbuilder @@ -0,0 +1 @@ +json.array! @disciplinas, partial: "disciplinas/disciplina", as: :disciplina diff --git a/app/views/disciplinas/new.html.erb b/app/views/disciplinas/new.html.erb new file mode 100644 index 0000000000..749a8f81d4 --- /dev/null +++ b/app/views/disciplinas/new.html.erb @@ -0,0 +1,11 @@ +<% content_for :title, "New disciplina" %> + +

New disciplina

+ +<%= render "form", disciplina: @disciplina %> + +
+ +
+ <%= link_to "Back to disciplinas", disciplinas_path %> +
diff --git a/app/views/disciplinas/show.html.erb b/app/views/disciplinas/show.html.erb new file mode 100644 index 0000000000..53498063d9 --- /dev/null +++ b/app/views/disciplinas/show.html.erb @@ -0,0 +1,10 @@ +

<%= notice %>

+ +<%= render @disciplina %> + +
+ <%= link_to "Edit this disciplina", edit_disciplina_path(@disciplina) %> | + <%= link_to "Back to disciplinas", disciplinas_path %> + + <%= button_to "Destroy this disciplina", @disciplina, method: :delete %> +
diff --git a/app/views/disciplinas/show.json.jbuilder b/app/views/disciplinas/show.json.jbuilder new file mode 100644 index 0000000000..81900042ae --- /dev/null +++ b/app/views/disciplinas/show.json.jbuilder @@ -0,0 +1 @@ +json.partial! "disciplinas/disciplina", disciplina: @disciplina diff --git a/app/views/docentes/_docente.html.erb b/app/views/docentes/_docente.html.erb new file mode 100644 index 0000000000..1aebfe62bf --- /dev/null +++ b/app/views/docentes/_docente.html.erb @@ -0,0 +1,22 @@ +
+
+ Matricula: + <%= docente.matricula %> +
+ +
+ Email: + <%= docente.email %> +
+ +
+ Nome: + <%= docente.nome %> +
+ +
+ Formacao: + <%= docente.formacao %> +
+ +
diff --git a/app/views/docentes/_docente.json.jbuilder b/app/views/docentes/_docente.json.jbuilder new file mode 100644 index 0000000000..6d10e76c27 --- /dev/null +++ b/app/views/docentes/_docente.json.jbuilder @@ -0,0 +1,2 @@ +json.extract! docente, :id, :matricula, :email, :nome, :formacao, :created_at, :updated_at +json.url docente_url(docente, format: :json) diff --git a/app/views/docentes/_form.html.erb b/app/views/docentes/_form.html.erb new file mode 100644 index 0000000000..59d2257579 --- /dev/null +++ b/app/views/docentes/_form.html.erb @@ -0,0 +1,37 @@ +<%= form_with(model: docente) do |form| %> + <% if docente.errors.any? %> +
+

<%= pluralize(docente.errors.count, "error") %> prohibited this docente from being saved:

+ +
    + <% docente.errors.each do |error| %> +
  • <%= error.full_message %>
  • + <% end %> +
+
+ <% end %> + +
+ <%= form.label :matricula, style: "display: block" %> + <%= form.text_field :matricula %> +
+ +
+ <%= form.label :email, style: "display: block" %> + <%= form.text_field :email %> +
+ +
+ <%= form.label :nome, style: "display: block" %> + <%= form.text_field :nome %> +
+ +
+ <%= form.label :formacao, style: "display: block" %> + <%= form.text_field :formacao %> +
+ +
+ <%= form.submit %> +
+<% end %> diff --git a/app/views/docentes/edit.html.erb b/app/views/docentes/edit.html.erb new file mode 100644 index 0000000000..f943000a91 --- /dev/null +++ b/app/views/docentes/edit.html.erb @@ -0,0 +1,12 @@ +<% content_for :title, "Editing docente" %> + +

Editing docente

+ +<%= render "form", docente: @docente %> + +
+ +
+ <%= link_to "Show this docente", @docente %> | + <%= link_to "Back to docentes", docentes_path %> +
diff --git a/app/views/docentes/index.html.erb b/app/views/docentes/index.html.erb new file mode 100644 index 0000000000..87242c4310 --- /dev/null +++ b/app/views/docentes/index.html.erb @@ -0,0 +1,16 @@ +

<%= notice %>

+ +<% content_for :title, "Docentes" %> + +

Docentes

+ +
+ <% @docentes.each do |docente| %> + <%= render docente %> +

+ <%= link_to "Show this docente", docente %> +

+ <% end %> +
+ +<%= link_to "New docente", new_docente_path %> diff --git a/app/views/docentes/index.json.jbuilder b/app/views/docentes/index.json.jbuilder new file mode 100644 index 0000000000..9fa1138d65 --- /dev/null +++ b/app/views/docentes/index.json.jbuilder @@ -0,0 +1 @@ +json.array! @docentes, partial: "docentes/docente", as: :docente diff --git a/app/views/docentes/new.html.erb b/app/views/docentes/new.html.erb new file mode 100644 index 0000000000..963e827ea2 --- /dev/null +++ b/app/views/docentes/new.html.erb @@ -0,0 +1,11 @@ +<% content_for :title, "New docente" %> + +

New docente

+ +<%= render "form", docente: @docente %> + +
+ +
+ <%= link_to "Back to docentes", docentes_path %> +
diff --git a/app/views/docentes/show.html.erb b/app/views/docentes/show.html.erb new file mode 100644 index 0000000000..2cae716ac2 --- /dev/null +++ b/app/views/docentes/show.html.erb @@ -0,0 +1,10 @@ +

<%= notice %>

+ +<%= render @docente %> + +
+ <%= link_to "Edit this docente", edit_docente_path(@docente) %> | + <%= link_to "Back to docentes", docentes_path %> + + <%= button_to "Destroy this docente", @docente, method: :delete %> +
diff --git a/app/views/docentes/show.json.jbuilder b/app/views/docentes/show.json.jbuilder new file mode 100644 index 0000000000..52216e7d59 --- /dev/null +++ b/app/views/docentes/show.json.jbuilder @@ -0,0 +1 @@ +json.partial! "docentes/docente", docente: @docente diff --git a/app/views/elemento_forms/_elemento_form.html.erb b/app/views/elemento_forms/_elemento_form.html.erb new file mode 100644 index 0000000000..c9c8ff75dd --- /dev/null +++ b/app/views/elemento_forms/_elemento_form.html.erb @@ -0,0 +1,17 @@ +
+
+ Ordem: + <%= elemento_form.ordem %> +
+ +
+ Enunciado: + <%= elemento_form.enunciado %> +
+ +
+ Formulario: + <%= elemento_form.formulario_id %> +
+ +
diff --git a/app/views/elemento_forms/_elemento_form.json.jbuilder b/app/views/elemento_forms/_elemento_form.json.jbuilder new file mode 100644 index 0000000000..c8c9c3c1dd --- /dev/null +++ b/app/views/elemento_forms/_elemento_form.json.jbuilder @@ -0,0 +1,2 @@ +json.extract! elemento_form, :id, :ordem, :enunciado, :formulario_id, :created_at, :updated_at +json.url elemento_form_url(elemento_form, format: :json) diff --git a/app/views/elemento_forms/_form.html.erb b/app/views/elemento_forms/_form.html.erb new file mode 100644 index 0000000000..e82793e837 --- /dev/null +++ b/app/views/elemento_forms/_form.html.erb @@ -0,0 +1,32 @@ +<%= form_with(model: elemento_form) do |form| %> + <% if elemento_form.errors.any? %> +
+

<%= pluralize(elemento_form.errors.count, "error") %> prohibited this elemento_form from being saved:

+ +
    + <% elemento_form.errors.each do |error| %> +
  • <%= error.full_message %>
  • + <% end %> +
+
+ <% end %> + +
+ <%= form.label :ordem, style: "display: block" %> + <%= form.number_field :ordem %> +
+ +
+ <%= form.label :enunciado, style: "display: block" %> + <%= form.text_field :enunciado %> +
+ +
+ <%= form.label :formulario_id, style: "display: block" %> + <%= form.text_field :formulario_id %> +
+ +
+ <%= form.submit %> +
+<% end %> diff --git a/app/views/elemento_forms/edit.html.erb b/app/views/elemento_forms/edit.html.erb new file mode 100644 index 0000000000..a40b53f636 --- /dev/null +++ b/app/views/elemento_forms/edit.html.erb @@ -0,0 +1,12 @@ +<% content_for :title, "Editing elemento form" %> + +

Editing elemento form

+ +<%= render "form", elemento_form: @elemento_form %> + +
+ +
+ <%= link_to "Show this elemento form", @elemento_form %> | + <%= link_to "Back to elemento forms", elemento_forms_path %> +
diff --git a/app/views/elemento_forms/index.html.erb b/app/views/elemento_forms/index.html.erb new file mode 100644 index 0000000000..ee86c1863e --- /dev/null +++ b/app/views/elemento_forms/index.html.erb @@ -0,0 +1,16 @@ +

<%= notice %>

+ +<% content_for :title, "Elemento forms" %> + +

Elemento forms

+ +
+ <% @elemento_forms.each do |elemento_form| %> + <%= render elemento_form %> +

+ <%= link_to "Show this elemento form", elemento_form %> +

+ <% end %> +
+ +<%= link_to "New elemento form", new_elemento_form_path %> diff --git a/app/views/elemento_forms/index.json.jbuilder b/app/views/elemento_forms/index.json.jbuilder new file mode 100644 index 0000000000..d92ed08923 --- /dev/null +++ b/app/views/elemento_forms/index.json.jbuilder @@ -0,0 +1 @@ +json.array! @elemento_forms, partial: "elemento_forms/elemento_form", as: :elemento_form diff --git a/app/views/elemento_forms/new.html.erb b/app/views/elemento_forms/new.html.erb new file mode 100644 index 0000000000..1802adb7fc --- /dev/null +++ b/app/views/elemento_forms/new.html.erb @@ -0,0 +1,11 @@ +<% content_for :title, "New elemento form" %> + +

New elemento form

+ +<%= render "form", elemento_form: @elemento_form %> + +
+ +
+ <%= link_to "Back to elemento forms", elemento_forms_path %> +
diff --git a/app/views/elemento_forms/show.html.erb b/app/views/elemento_forms/show.html.erb new file mode 100644 index 0000000000..216c0abdbf --- /dev/null +++ b/app/views/elemento_forms/show.html.erb @@ -0,0 +1,10 @@ +

<%= notice %>

+ +<%= render @elemento_form %> + +
+ <%= link_to "Edit this elemento form", edit_elemento_form_path(@elemento_form) %> | + <%= link_to "Back to elemento forms", elemento_forms_path %> + + <%= button_to "Destroy this elemento form", @elemento_form, method: :delete %> +
diff --git a/app/views/elemento_forms/show.json.jbuilder b/app/views/elemento_forms/show.json.jbuilder new file mode 100644 index 0000000000..f73a125a23 --- /dev/null +++ b/app/views/elemento_forms/show.json.jbuilder @@ -0,0 +1 @@ +json.partial! "elemento_forms/elemento_form", elemento_form: @elemento_form diff --git a/app/views/elementos/_elemento.html.erb b/app/views/elementos/_elemento.html.erb new file mode 100644 index 0000000000..2fba356080 --- /dev/null +++ b/app/views/elementos/_elemento.html.erb @@ -0,0 +1,17 @@ +
+
+ Ordem: + <%= elemento.ordem %> +
+ +
+ Enunciado: + <%= elemento.enunciado %> +
+ +
+ Template: + <%= elemento.template_id %> +
+ +
diff --git a/app/views/elementos/_elemento.json.jbuilder b/app/views/elementos/_elemento.json.jbuilder new file mode 100644 index 0000000000..ab132a3548 --- /dev/null +++ b/app/views/elementos/_elemento.json.jbuilder @@ -0,0 +1,2 @@ +json.extract! elemento, :id, :ordem, :enunciado, :template_id, :created_at, :updated_at +json.url elemento_url(elemento, format: :json) diff --git a/app/views/elementos/_form.html.erb b/app/views/elementos/_form.html.erb new file mode 100644 index 0000000000..e7f9b64d4c --- /dev/null +++ b/app/views/elementos/_form.html.erb @@ -0,0 +1,32 @@ +<%= form_with(model: elemento) do |form| %> + <% if elemento.errors.any? %> +
+

<%= pluralize(elemento.errors.count, "error") %> prohibited this elemento from being saved:

+ +
    + <% elemento.errors.each do |error| %> +
  • <%= error.full_message %>
  • + <% end %> +
+
+ <% end %> + +
+ <%= form.label :ordem, style: "display: block" %> + <%= form.number_field :ordem %> +
+ +
+ <%= form.label :enunciado, style: "display: block" %> + <%= form.text_field :enunciado %> +
+ +
+ <%= form.label :template_id, style: "display: block" %> + <%= form.text_field :template_id %> +
+ +
+ <%= form.submit %> +
+<% end %> diff --git a/app/views/elementos/edit.html.erb b/app/views/elementos/edit.html.erb new file mode 100644 index 0000000000..e8021663c8 --- /dev/null +++ b/app/views/elementos/edit.html.erb @@ -0,0 +1,12 @@ +<% content_for :title, "Editing elemento" %> + +

Editing elemento

+ +<%= render "form", elemento: @elemento %> + +
+ +
+ <%= link_to "Show this elemento", @elemento %> | + <%= link_to "Back to elementos", elementos_path %> +
diff --git a/app/views/elementos/index.html.erb b/app/views/elementos/index.html.erb new file mode 100644 index 0000000000..e3edba25e0 --- /dev/null +++ b/app/views/elementos/index.html.erb @@ -0,0 +1,16 @@ +

<%= notice %>

+ +<% content_for :title, "Elementos" %> + +

Elementos

+ +
+ <% @elementos.each do |elemento| %> + <%= render elemento %> +

+ <%= link_to "Show this elemento", elemento %> +

+ <% end %> +
+ +<%= link_to "New elemento", new_elemento_path %> diff --git a/app/views/elementos/index.json.jbuilder b/app/views/elementos/index.json.jbuilder new file mode 100644 index 0000000000..bbf28cc646 --- /dev/null +++ b/app/views/elementos/index.json.jbuilder @@ -0,0 +1 @@ +json.array! @elementos, partial: "elementos/elemento", as: :elemento diff --git a/app/views/elementos/new.html.erb b/app/views/elementos/new.html.erb new file mode 100644 index 0000000000..dc3997b102 --- /dev/null +++ b/app/views/elementos/new.html.erb @@ -0,0 +1,11 @@ +<% content_for :title, "New elemento" %> + +

New elemento

+ +<%= render "form", elemento: @elemento %> + +
+ +
+ <%= link_to "Back to elementos", elementos_path %> +
diff --git a/app/views/elementos/show.html.erb b/app/views/elementos/show.html.erb new file mode 100644 index 0000000000..e8d76a29af --- /dev/null +++ b/app/views/elementos/show.html.erb @@ -0,0 +1,10 @@ +

<%= notice %>

+ +<%= render @elemento %> + +
+ <%= link_to "Edit this elemento", edit_elemento_path(@elemento) %> | + <%= link_to "Back to elementos", elementos_path %> + + <%= button_to "Destroy this elemento", @elemento, method: :delete %> +
diff --git a/app/views/elementos/show.json.jbuilder b/app/views/elementos/show.json.jbuilder new file mode 100644 index 0000000000..a39f969950 --- /dev/null +++ b/app/views/elementos/show.json.jbuilder @@ -0,0 +1 @@ +json.partial! "elementos/elemento", elemento: @elemento diff --git a/app/views/formularios/_form.html.erb b/app/views/formularios/_form.html.erb new file mode 100644 index 0000000000..ddbf9658b6 --- /dev/null +++ b/app/views/formularios/_form.html.erb @@ -0,0 +1,22 @@ +<%= form_with(model: formulario) do |form| %> + <% if formulario.errors.any? %> +
+

<%= pluralize(formulario.errors.count, "error") %> prohibited this formulario from being saved:

+ +
    + <% formulario.errors.each do |error| %> +
  • <%= error.full_message %>
  • + <% end %> +
+
+ <% end %> + +
+ <%= form.label :turma_id, style: "display: block" %> + <%= form.text_field :turma_id %> +
+ +
+ <%= form.submit %> +
+<% end %> diff --git a/app/views/formularios/_formulario.html.erb b/app/views/formularios/_formulario.html.erb new file mode 100644 index 0000000000..18470d4252 --- /dev/null +++ b/app/views/formularios/_formulario.html.erb @@ -0,0 +1,7 @@ +
+
+ Turma: + <%= formulario.turma_id %> +
+ +
diff --git a/app/views/formularios/_formulario.json.jbuilder b/app/views/formularios/_formulario.json.jbuilder new file mode 100644 index 0000000000..70529ec0c5 --- /dev/null +++ b/app/views/formularios/_formulario.json.jbuilder @@ -0,0 +1,2 @@ +json.extract! formulario, :id, :turma_id, :created_at, :updated_at +json.url formulario_url(formulario, format: :json) diff --git a/app/views/formularios/edit.html.erb b/app/views/formularios/edit.html.erb new file mode 100644 index 0000000000..2fb833aa29 --- /dev/null +++ b/app/views/formularios/edit.html.erb @@ -0,0 +1,12 @@ +<% content_for :title, "Editing formulario" %> + +

Editing formulario

+ +<%= render "form", formulario: @formulario %> + +
+ +
+ <%= link_to "Show this formulario", @formulario %> | + <%= link_to "Back to formularios", formularios_path %> +
diff --git a/app/views/formularios/index.html.erb b/app/views/formularios/index.html.erb new file mode 100644 index 0000000000..99df9d53e3 --- /dev/null +++ b/app/views/formularios/index.html.erb @@ -0,0 +1,16 @@ +

<%= notice %>

+ +<% content_for :title, "Formularios" %> + +

Formularios

+ +
+ <% @formularios.each do |formulario| %> + <%= render formulario %> +

+ <%= link_to "Show this formulario", formulario %> +

+ <% end %> +
+ +<%= link_to "New formulario", new_formulario_path %> diff --git a/app/views/formularios/index.json.jbuilder b/app/views/formularios/index.json.jbuilder new file mode 100644 index 0000000000..70770973a8 --- /dev/null +++ b/app/views/formularios/index.json.jbuilder @@ -0,0 +1 @@ +json.array! @formularios, partial: "formularios/formulario", as: :formulario diff --git a/app/views/formularios/new.html.erb b/app/views/formularios/new.html.erb new file mode 100644 index 0000000000..0dbdfdbd5c --- /dev/null +++ b/app/views/formularios/new.html.erb @@ -0,0 +1,11 @@ +<% content_for :title, "New formulario" %> + +

New formulario

+ +<%= render "form", formulario: @formulario %> + +
+ +
+ <%= link_to "Back to formularios", formularios_path %> +
diff --git a/app/views/formularios/show.html.erb b/app/views/formularios/show.html.erb new file mode 100644 index 0000000000..24709ac66b --- /dev/null +++ b/app/views/formularios/show.html.erb @@ -0,0 +1,10 @@ +

<%= notice %>

+ +<%= render @formulario %> + +
+ <%= link_to "Edit this formulario", edit_formulario_path(@formulario) %> | + <%= link_to "Back to formularios", formularios_path %> + + <%= button_to "Destroy this formulario", @formulario, method: :delete %> +
diff --git a/app/views/formularios/show.json.jbuilder b/app/views/formularios/show.json.jbuilder new file mode 100644 index 0000000000..476f64d624 --- /dev/null +++ b/app/views/formularios/show.json.jbuilder @@ -0,0 +1 @@ +json.partial! "formularios/formulario", formulario: @formulario diff --git a/app/views/home/index.html.erb b/app/views/home/index.html.erb new file mode 100644 index 0000000000..605d440da6 --- /dev/null +++ b/app/views/home/index.html.erb @@ -0,0 +1 @@ +

Página inicial

diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb new file mode 100644 index 0000000000..76b583b824 --- /dev/null +++ b/app/views/layouts/application.html.erb @@ -0,0 +1,33 @@ + + + + <%= content_for(:title) || "Camaar" %> + + + + + <%= csrf_meta_tags %> + <%= csp_meta_tag %> + + <%= yield :head %> + + <%# Enable PWA manifest for installable apps (make sure to enable in config/routes.rb too!) %> + <%#= tag.link rel: "manifest", href: pwa_manifest_path(format: :json) %> + + + + + + <%# Includes all stylesheet files in app/assets/stylesheets %> + <%= stylesheet_link_tag :app, "data-turbo-track": "reload" %> + <%= javascript_importmap_tags %> + + + + <% flash.each do |type, message| %> +
<%= message %>
+ <% end %> + + <%= yield %> + + diff --git a/app/views/layouts/gerenciamento.html.erb b/app/views/layouts/gerenciamento.html.erb new file mode 100644 index 0000000000..ce5e333a2f --- /dev/null +++ b/app/views/layouts/gerenciamento.html.erb @@ -0,0 +1,56 @@ + + + + CAMAAR - Gerenciamento + + <%= csrf_meta_tags %> + <%= csp_meta_tag %> + + <%= stylesheet_link_tag "application", "data-turbo-track": "reload" %> + <%= stylesheet_link_tag "gerenciamento", "data-turbo-track": "reload" %> + + + +
+ +
+
+

Visão Geral

+
+
+ +
+ +
+ +
U
+
+
+ +
+ + + +
+ <% flash.each do |type, message| %> +
+ <%= message %> +
+ <% end %> + <%= yield %> +
+ +
+
+ + \ No newline at end of file diff --git a/app/views/layouts/mailer.html.erb b/app/views/layouts/mailer.html.erb new file mode 100644 index 0000000000..3aac9002ed --- /dev/null +++ b/app/views/layouts/mailer.html.erb @@ -0,0 +1,13 @@ + + + + + + + + + <%= yield %> + + diff --git a/app/views/layouts/mailer.text.erb b/app/views/layouts/mailer.text.erb new file mode 100644 index 0000000000..37f0bddbd7 --- /dev/null +++ b/app/views/layouts/mailer.text.erb @@ -0,0 +1 @@ +<%= yield %> diff --git a/app/views/pwa/manifest.json.erb b/app/views/pwa/manifest.json.erb new file mode 100644 index 0000000000..fca522bbe4 --- /dev/null +++ b/app/views/pwa/manifest.json.erb @@ -0,0 +1,22 @@ +{ + "name": "Camaar", + "icons": [ + { + "src": "/icon.png", + "type": "image/png", + "sizes": "512x512" + }, + { + "src": "/icon.png", + "type": "image/png", + "sizes": "512x512", + "purpose": "maskable" + } + ], + "start_url": "/", + "display": "standalone", + "scope": "/", + "description": "Camaar.", + "theme_color": "red", + "background_color": "red" +} diff --git a/app/views/pwa/service-worker.js b/app/views/pwa/service-worker.js new file mode 100644 index 0000000000..b3a13fb7bb --- /dev/null +++ b/app/views/pwa/service-worker.js @@ -0,0 +1,26 @@ +// Add a service worker for processing Web Push notifications: +// +// self.addEventListener("push", async (event) => { +// const { title, options } = await event.data.json() +// event.waitUntil(self.registration.showNotification(title, options)) +// }) +// +// self.addEventListener("notificationclick", function(event) { +// event.notification.close() +// event.waitUntil( +// clients.matchAll({ type: "window" }).then((clientList) => { +// for (let i = 0; i < clientList.length; i++) { +// let client = clientList[i] +// let clientPath = (new URL(client.url)).pathname +// +// if (clientPath == event.notification.data.path && "focus" in client) { +// return client.focus() +// } +// } +// +// if (clients.openWindow) { +// return clients.openWindow(event.notification.data.path) +// } +// }) +// ) +// }) diff --git a/app/views/redefinicao_senhas/edit.html.erb b/app/views/redefinicao_senhas/edit.html.erb new file mode 100644 index 0000000000..e79c4226bb --- /dev/null +++ b/app/views/redefinicao_senhas/edit.html.erb @@ -0,0 +1,17 @@ +

Redefinição de senha

+ +<%= form_with url: redefinicao_senha_path(token: params[:token]), method: :patch do %> +
+ <%= label_tag :senha, "Nova senha" %> + <%= password_field_tag :senha %> +
+ +
+ <%= label_tag :senha_confirmation, "Confirmar senha" %> + <%= password_field_tag :senha_confirmation %> +
+ +
+ <%= submit_tag "Redefinir senha" %> +
+<% end %> diff --git a/app/views/redefinicao_senhas/new.html.erb b/app/views/redefinicao_senhas/new.html.erb new file mode 100644 index 0000000000..e7234e77f1 --- /dev/null +++ b/app/views/redefinicao_senhas/new.html.erb @@ -0,0 +1,19 @@ +
+
+ +

Redefinição de senha

+ + <%= form_with url: redefinir_senha_path do %> + +
+ <%= label_tag :email, "Email" %> + <%= email_field_tag :email %> +
+ + <%= submit_tag "Solicitar redefinição", + class: "btn-submit" %> + + <% end %> + +
+
\ No newline at end of file diff --git a/app/views/resposta_elems/_form.html.erb b/app/views/resposta_elems/_form.html.erb new file mode 100644 index 0000000000..3e09b2d5ee --- /dev/null +++ b/app/views/resposta_elems/_form.html.erb @@ -0,0 +1,37 @@ +<%= form_with(model: resposta_elem) do |form| %> + <% if resposta_elem.errors.any? %> +
+

<%= pluralize(resposta_elem.errors.count, "error") %> prohibited this resposta_elem from being saved:

+ +
    + <% resposta_elem.errors.each do |error| %> +
  • <%= error.full_message %>
  • + <% end %> +
+
+ <% end %> + +
+ <%= form.label :texto_resposta, style: "display: block" %> + <%= form.textarea :texto_resposta %> +
+ +
+ <%= form.label :resposta_form_id, style: "display: block" %> + <%= form.text_field :resposta_form_id %> +
+ +
+ <%= form.label :elemento_form_id, style: "display: block" %> + <%= form.text_field :elemento_form_id %> +
+ +
+ <%= form.label :campo_form_id, style: "display: block" %> + <%= form.text_field :campo_form_id %> +
+ +
+ <%= form.submit %> +
+<% end %> diff --git a/app/views/resposta_elems/_resposta_elem.html.erb b/app/views/resposta_elems/_resposta_elem.html.erb new file mode 100644 index 0000000000..8c745b02ac --- /dev/null +++ b/app/views/resposta_elems/_resposta_elem.html.erb @@ -0,0 +1,22 @@ +
+
+ Texto resposta: + <%= resposta_elem.texto_resposta %> +
+ +
+ Resposta form: + <%= resposta_elem.resposta_form_id %> +
+ +
+ Elemento form: + <%= resposta_elem.elemento_form_id %> +
+ +
+ Campo form: + <%= resposta_elem.campo_form_id %> +
+ +
diff --git a/app/views/resposta_elems/_resposta_elem.json.jbuilder b/app/views/resposta_elems/_resposta_elem.json.jbuilder new file mode 100644 index 0000000000..ee21ede9bb --- /dev/null +++ b/app/views/resposta_elems/_resposta_elem.json.jbuilder @@ -0,0 +1,2 @@ +json.extract! resposta_elem, :id, :texto_resposta, :resposta_form_id, :elemento_form_id, :campo_form_id, :created_at, :updated_at +json.url resposta_elem_url(resposta_elem, format: :json) diff --git a/app/views/resposta_elems/edit.html.erb b/app/views/resposta_elems/edit.html.erb new file mode 100644 index 0000000000..dc00e9f6b3 --- /dev/null +++ b/app/views/resposta_elems/edit.html.erb @@ -0,0 +1,12 @@ +<% content_for :title, "Editing resposta elem" %> + +

Editing resposta elem

+ +<%= render "form", resposta_elem: @resposta_elem %> + +
+ +
+ <%= link_to "Show this resposta elem", @resposta_elem %> | + <%= link_to "Back to resposta elems", resposta_elems_path %> +
diff --git a/app/views/resposta_elems/index.html.erb b/app/views/resposta_elems/index.html.erb new file mode 100644 index 0000000000..ab277400f0 --- /dev/null +++ b/app/views/resposta_elems/index.html.erb @@ -0,0 +1,16 @@ +

<%= notice %>

+ +<% content_for :title, "Resposta elems" %> + +

Resposta elems

+ +
+ <% @resposta_elems.each do |resposta_elem| %> + <%= render resposta_elem %> +

+ <%= link_to "Show this resposta elem", resposta_elem %> +

+ <% end %> +
+ +<%= link_to "New resposta elem", new_resposta_elem_path %> diff --git a/app/views/resposta_elems/index.json.jbuilder b/app/views/resposta_elems/index.json.jbuilder new file mode 100644 index 0000000000..9bedba8ca4 --- /dev/null +++ b/app/views/resposta_elems/index.json.jbuilder @@ -0,0 +1 @@ +json.array! @resposta_elems, partial: "resposta_elems/resposta_elem", as: :resposta_elem diff --git a/app/views/resposta_elems/new.html.erb b/app/views/resposta_elems/new.html.erb new file mode 100644 index 0000000000..b00f55c4cb --- /dev/null +++ b/app/views/resposta_elems/new.html.erb @@ -0,0 +1,11 @@ +<% content_for :title, "New resposta elem" %> + +

New resposta elem

+ +<%= render "form", resposta_elem: @resposta_elem %> + +
+ +
+ <%= link_to "Back to resposta elems", resposta_elems_path %> +
diff --git a/app/views/resposta_elems/show.html.erb b/app/views/resposta_elems/show.html.erb new file mode 100644 index 0000000000..4662d00331 --- /dev/null +++ b/app/views/resposta_elems/show.html.erb @@ -0,0 +1,10 @@ +

<%= notice %>

+ +<%= render @resposta_elem %> + +
+ <%= link_to "Edit this resposta elem", edit_resposta_elem_path(@resposta_elem) %> | + <%= link_to "Back to resposta elems", resposta_elems_path %> + + <%= button_to "Destroy this resposta elem", @resposta_elem, method: :delete %> +
diff --git a/app/views/resposta_elems/show.json.jbuilder b/app/views/resposta_elems/show.json.jbuilder new file mode 100644 index 0000000000..33fcf947e4 --- /dev/null +++ b/app/views/resposta_elems/show.json.jbuilder @@ -0,0 +1 @@ +json.partial! "resposta_elems/resposta_elem", resposta_elem: @resposta_elem diff --git a/app/views/resposta_forms/_form.html.erb b/app/views/resposta_forms/_form.html.erb new file mode 100644 index 0000000000..8a1345f86c --- /dev/null +++ b/app/views/resposta_forms/_form.html.erb @@ -0,0 +1,32 @@ +<%= form_with(model: resposta_form) do |form| %> + <% if resposta_form.errors.any? %> +
+

<%= pluralize(resposta_form.errors.count, "error") %> prohibited this resposta_form from being saved:

+ +
    + <% resposta_form.errors.each do |error| %> +
  • <%= error.full_message %>
  • + <% end %> +
+
+ <% end %> + +
+ <%= form.label :data_submissao, style: "display: block" %> + <%= form.date_field :data_submissao %> +
+ +
+ <%= form.label :formulario_id, style: "display: block" %> + <%= form.text_field :formulario_id %> +
+ +
+ <%= form.label :usuario_id, style: "display: block" %> + <%= form.text_field :usuario_id %> +
+ +
+ <%= form.submit %> +
+<% end %> diff --git a/app/views/resposta_forms/_resposta_form.html.erb b/app/views/resposta_forms/_resposta_form.html.erb new file mode 100644 index 0000000000..ca137130db --- /dev/null +++ b/app/views/resposta_forms/_resposta_form.html.erb @@ -0,0 +1,17 @@ +
+
+ Data submissao: + <%= resposta_form.data_submissao %> +
+ +
+ Formulario: + <%= resposta_form.formulario_id %> +
+ +
+ Usuario: + <%= resposta_form.usuario_id %> +
+ +
diff --git a/app/views/resposta_forms/_resposta_form.json.jbuilder b/app/views/resposta_forms/_resposta_form.json.jbuilder new file mode 100644 index 0000000000..72ef55e3d3 --- /dev/null +++ b/app/views/resposta_forms/_resposta_form.json.jbuilder @@ -0,0 +1,2 @@ +json.extract! resposta_form, :id, :data_submissao, :formulario_id, :usuario_id, :created_at, :updated_at +json.url resposta_form_url(resposta_form, format: :json) diff --git a/app/views/resposta_forms/edit.html.erb b/app/views/resposta_forms/edit.html.erb new file mode 100644 index 0000000000..787853e439 --- /dev/null +++ b/app/views/resposta_forms/edit.html.erb @@ -0,0 +1,12 @@ +<% content_for :title, "Editing resposta form" %> + +

Editing resposta form

+ +<%= render "form", resposta_form: @resposta_form %> + +
+ +
+ <%= link_to "Show this resposta form", @resposta_form %> | + <%= link_to "Back to resposta forms", resposta_forms_path %> +
diff --git a/app/views/resposta_forms/index.html.erb b/app/views/resposta_forms/index.html.erb new file mode 100644 index 0000000000..1680e608d8 --- /dev/null +++ b/app/views/resposta_forms/index.html.erb @@ -0,0 +1,16 @@ +

<%= notice %>

+ +<% content_for :title, "Resposta forms" %> + +

Resposta forms

+ +
+ <% @resposta_forms.each do |resposta_form| %> + <%= render resposta_form %> +

+ <%= link_to "Show this resposta form", resposta_form %> +

+ <% end %> +
+ +<%= link_to "New resposta form", new_resposta_form_path %> diff --git a/app/views/resposta_forms/index.json.jbuilder b/app/views/resposta_forms/index.json.jbuilder new file mode 100644 index 0000000000..a4ad662804 --- /dev/null +++ b/app/views/resposta_forms/index.json.jbuilder @@ -0,0 +1 @@ +json.array! @resposta_forms, partial: "resposta_forms/resposta_form", as: :resposta_form diff --git a/app/views/resposta_forms/new.html.erb b/app/views/resposta_forms/new.html.erb new file mode 100644 index 0000000000..82472ef192 --- /dev/null +++ b/app/views/resposta_forms/new.html.erb @@ -0,0 +1,11 @@ +<% content_for :title, "New resposta form" %> + +

New resposta form

+ +<%= render "form", resposta_form: @resposta_form %> + +
+ +
+ <%= link_to "Back to resposta forms", resposta_forms_path %> +
diff --git a/app/views/resposta_forms/show.html.erb b/app/views/resposta_forms/show.html.erb new file mode 100644 index 0000000000..e57e7b663c --- /dev/null +++ b/app/views/resposta_forms/show.html.erb @@ -0,0 +1,10 @@ +

<%= notice %>

+ +<%= render @resposta_form %> + +
+ <%= link_to "Edit this resposta form", edit_resposta_form_path(@resposta_form) %> | + <%= link_to "Back to resposta forms", resposta_forms_path %> + + <%= button_to "Destroy this resposta form", @resposta_form, method: :delete %> +
diff --git a/app/views/resposta_forms/show.json.jbuilder b/app/views/resposta_forms/show.json.jbuilder new file mode 100644 index 0000000000..cf7c6cab1f --- /dev/null +++ b/app/views/resposta_forms/show.json.jbuilder @@ -0,0 +1 @@ +json.partial! "resposta_forms/resposta_form", resposta_form: @resposta_form diff --git a/app/views/sessions/new.html.erb b/app/views/sessions/new.html.erb new file mode 100644 index 0000000000..8f93b2236a --- /dev/null +++ b/app/views/sessions/new.html.erb @@ -0,0 +1,30 @@ + \ No newline at end of file diff --git a/app/views/templates/_form.html.erb b/app/views/templates/_form.html.erb new file mode 100644 index 0000000000..8901960cb7 --- /dev/null +++ b/app/views/templates/_form.html.erb @@ -0,0 +1,231 @@ + + + + + \ No newline at end of file diff --git a/app/views/templates/_grid.html.erb b/app/views/templates/_grid.html.erb new file mode 100644 index 0000000000..e2951eb863 --- /dev/null +++ b/app/views/templates/_grid.html.erb @@ -0,0 +1,37 @@ +<% if @templates.empty? %> +
+

Nenhum template encontrado.

+ <%= link_to "Criar novo template", new_admin_template_path, class: "btn-figma-success", style: "text-decoration: none;" %> +
+<% else %> +
+ <% @templates.each do |template| %> + + <% next if template.new_record? %> + +
+
+

<%= template.nome %>

+
+ +
+ <%= link_to edit_admin_template_path(@admin, template), class: "action-btn", aria: { label: "Editar" } do %> + <%= svg_icon('edit') %> + <% end %> + + <%= button_to admin_template_path(@admin, template), method: :delete, + form: { data: { turbo_confirm: "..." } }, + class: "action-btn button-to-clean", + aria: { label: "Deletar" } do %> + <%= svg_icon('trash') %> + <% end %> +
+
+ <% end %> + + <%= link_to new_admin_template_path(@admin), class: "card-create-new" do %> + Adicionar novo template + + + <% end %> +
+<% end %> \ No newline at end of file diff --git a/app/views/templates/_template.json.jbuilder b/app/views/templates/_template.json.jbuilder new file mode 100644 index 0000000000..4cffa98a79 --- /dev/null +++ b/app/views/templates/_template.json.jbuilder @@ -0,0 +1,2 @@ +json.extract! template, :id, :nome, :created_at, :updated_at +json.url template_url(template, format: :json) diff --git a/app/views/templates/_template_form.html.erb b/app/views/templates/_template_form.html.erb new file mode 100644 index 0000000000..75ca947616 --- /dev/null +++ b/app/views/templates/_template_form.html.erb @@ -0,0 +1,11 @@ +<%= form_with model: @template, + url: @template.persisted? ? update_admin_template_path(@admin, @template) : create_admin_template_path, + method: @template.persisted? ? :patch : :post do |f| %> + +
+ <%= f.label :nome, "Nome do template:" %> + <%= f.text_field :nome, placeholder: "Digite o nome..." %> +
+ + <%= f.submit @template.persisted? ? "Salvar Alterações" : "Criar Template", class: "btn-save" %> +<% end %> \ No newline at end of file diff --git a/app/views/templates/edit.html.erb b/app/views/templates/edit.html.erb new file mode 100644 index 0000000000..0e96116b60 --- /dev/null +++ b/app/views/templates/edit.html.erb @@ -0,0 +1,2 @@ +<%= render 'grid' %> +<%= render 'form' %> \ No newline at end of file diff --git a/app/views/templates/edit_template.html.erb b/app/views/templates/edit_template.html.erb new file mode 100644 index 0000000000..09df7eee18 --- /dev/null +++ b/app/views/templates/edit_template.html.erb @@ -0,0 +1 @@ +<%= render 'template_form' %> \ No newline at end of file diff --git a/app/views/templates/index.html.erb b/app/views/templates/index.html.erb new file mode 100644 index 0000000000..30669cb98c --- /dev/null +++ b/app/views/templates/index.html.erb @@ -0,0 +1 @@ +<%= render 'grid' %> \ No newline at end of file diff --git a/app/views/templates/index.json.jbuilder b/app/views/templates/index.json.jbuilder new file mode 100644 index 0000000000..5163fa0e1e --- /dev/null +++ b/app/views/templates/index.json.jbuilder @@ -0,0 +1 @@ +json.array! @templates, partial: "templates/template", as: :template diff --git a/app/views/templates/new.html.erb b/app/views/templates/new.html.erb new file mode 100644 index 0000000000..0e96116b60 --- /dev/null +++ b/app/views/templates/new.html.erb @@ -0,0 +1,2 @@ +<%= render 'grid' %> +<%= render 'form' %> \ No newline at end of file diff --git a/app/views/templates/show.json.jbuilder b/app/views/templates/show.json.jbuilder new file mode 100644 index 0000000000..33110ec93b --- /dev/null +++ b/app/views/templates/show.json.jbuilder @@ -0,0 +1 @@ +json.partial! "templates/template", template: @template diff --git a/app/views/turmas/_form.html.erb b/app/views/turmas/_form.html.erb new file mode 100644 index 0000000000..fd4628cb48 --- /dev/null +++ b/app/views/turmas/_form.html.erb @@ -0,0 +1,37 @@ +<%= form_with(model: turma) do |form| %> + <% if turma.errors.any? %> +
+

<%= pluralize(turma.errors.count, "error") %> prohibited this turma from being saved:

+ +
    + <% turma.errors.each do |error| %> +
  • <%= error.full_message %>
  • + <% end %> +
+
+ <% end %> + +
+ <%= form.label :numero_da_turma, style: "display: block" %> + <%= form.text_field :numero_da_turma %> +
+ +
+ <%= form.label :semestre, style: "display: block" %> + <%= form.text_field :semestre %> +
+ +
+ <%= form.label :horario, style: "display: block" %> + <%= form.text_field :horario %> +
+ +
+ <%= form.label :disciplina_id, style: "display: block" %> + <%= form.text_field :disciplina_id %> +
+ +
+ <%= form.submit %> +
+<% end %> diff --git a/app/views/turmas/_turma.html.erb b/app/views/turmas/_turma.html.erb new file mode 100644 index 0000000000..59428ae588 --- /dev/null +++ b/app/views/turmas/_turma.html.erb @@ -0,0 +1,22 @@ +
+
+ Numero da turma: + <%= turma.numero_da_turma %> +
+ +
+ Semestre: + <%= turma.semestre %> +
+ +
+ Horario: + <%= turma.horario %> +
+ +
+ Disciplina: + <%= turma.disciplina_id %> +
+ +
diff --git a/app/views/turmas/_turma.json.jbuilder b/app/views/turmas/_turma.json.jbuilder new file mode 100644 index 0000000000..f5e91fcfa8 --- /dev/null +++ b/app/views/turmas/_turma.json.jbuilder @@ -0,0 +1,2 @@ +json.extract! turma, :id, :numero_da_turma, :semestre, :horario, :disciplina_id, :created_at, :updated_at +json.url turma_url(turma, format: :json) diff --git a/app/views/turmas/edit.html.erb b/app/views/turmas/edit.html.erb new file mode 100644 index 0000000000..108b99a6c2 --- /dev/null +++ b/app/views/turmas/edit.html.erb @@ -0,0 +1,12 @@ +<% content_for :title, "Editing turma" %> + +

Editing turma

+ +<%= render "form", turma: @turma %> + +
+ +
+ <%= link_to "Show this turma", @turma %> | + <%= link_to "Back to turmas", turmas_path %> +
diff --git a/app/views/turmas/index.html.erb b/app/views/turmas/index.html.erb new file mode 100644 index 0000000000..72ec97a969 --- /dev/null +++ b/app/views/turmas/index.html.erb @@ -0,0 +1,16 @@ +

<%= notice %>

+ +<% content_for :title, "Turmas" %> + +

Turmas

+ +
+ <% @turmas.each do |turma| %> + <%= render turma %> +

+ <%= link_to "Show this turma", turma %> +

+ <% end %> +
+ +<%= link_to "New turma", new_turma_path %> diff --git a/app/views/turmas/index.json.jbuilder b/app/views/turmas/index.json.jbuilder new file mode 100644 index 0000000000..e70b9255db --- /dev/null +++ b/app/views/turmas/index.json.jbuilder @@ -0,0 +1 @@ +json.array! @turmas, partial: "turmas/turma", as: :turma diff --git a/app/views/turmas/new.html.erb b/app/views/turmas/new.html.erb new file mode 100644 index 0000000000..477e3282ff --- /dev/null +++ b/app/views/turmas/new.html.erb @@ -0,0 +1,11 @@ +<% content_for :title, "New turma" %> + +

New turma

+ +<%= render "form", turma: @turma %> + +
+ +
+ <%= link_to "Back to turmas", turmas_path %> +
diff --git a/app/views/turmas/show.html.erb b/app/views/turmas/show.html.erb new file mode 100644 index 0000000000..72fb58239d --- /dev/null +++ b/app/views/turmas/show.html.erb @@ -0,0 +1,10 @@ +

<%= notice %>

+ +<%= render @turma %> + +
+ <%= link_to "Edit this turma", edit_turma_path(@turma) %> | + <%= link_to "Back to turmas", turmas_path %> + + <%= button_to "Destroy this turma", @turma, method: :delete %> +
diff --git a/app/views/turmas/show.json.jbuilder b/app/views/turmas/show.json.jbuilder new file mode 100644 index 0000000000..1d164186aa --- /dev/null +++ b/app/views/turmas/show.json.jbuilder @@ -0,0 +1 @@ +json.partial! "turmas/turma", turma: @turma diff --git a/app/views/usuario_mailer/definicao_senha.html.erb b/app/views/usuario_mailer/definicao_senha.html.erb new file mode 100644 index 0000000000..627179a338 --- /dev/null +++ b/app/views/usuario_mailer/definicao_senha.html.erb @@ -0,0 +1,5 @@ +

Olá, <%= @usuario.nome %>.

+ +

Para definir sua senha e acessar o sistema, acesse o link abaixo:

+ +

<%= @url %>

diff --git a/app/views/usuario_mailer/definicao_senha.text.erb b/app/views/usuario_mailer/definicao_senha.text.erb new file mode 100644 index 0000000000..37e8a1dca3 --- /dev/null +++ b/app/views/usuario_mailer/definicao_senha.text.erb @@ -0,0 +1,5 @@ +Olá, <%= @usuario.nome %>. + +Para definir sua senha e acessar o sistema, acesse o link abaixo: + +<%= @url %> diff --git a/app/views/usuario_mailer/redefinicao_senha.html.erb b/app/views/usuario_mailer/redefinicao_senha.html.erb new file mode 100644 index 0000000000..389a9c5176 --- /dev/null +++ b/app/views/usuario_mailer/redefinicao_senha.html.erb @@ -0,0 +1,5 @@ +

Olá, <%= @usuario.nome %>.

+ +

Você solicitou a redefinição da sua senha. Acesse o link abaixo:

+ +

<%= @url %>

diff --git a/app/views/usuario_mailer/redefinicao_senha.text.erb b/app/views/usuario_mailer/redefinicao_senha.text.erb new file mode 100644 index 0000000000..f874bdf5cd --- /dev/null +++ b/app/views/usuario_mailer/redefinicao_senha.text.erb @@ -0,0 +1,5 @@ +Olá, <%= @usuario.nome %>. + +Você solicitou a redefinição da sua senha. Acesse o link abaixo: + +<%= @url %> diff --git a/app/views/usuarios/_form.html.erb b/app/views/usuarios/_form.html.erb new file mode 100644 index 0000000000..6a0bcb7c33 --- /dev/null +++ b/app/views/usuarios/_form.html.erb @@ -0,0 +1,42 @@ +<%= form_with(model: usuario) do |form| %> + <% if usuario.errors.any? %> +
+

<%= pluralize(usuario.errors.count, "error") %> prohibited this usuario from being saved:

+ +
    + <% usuario.errors.each do |error| %> +
  • <%= error.full_message %>
  • + <% end %> +
+
+ <% end %> + +
+ <%= form.label :matricula, style: "display: block" %> + <%= form.text_field :matricula %> +
+ +
+ <%= form.label :email, style: "display: block" %> + <%= form.text_field :email %> +
+ +
+ <%= form.label :nome, style: "display: block" %> + <%= form.text_field :nome %> +
+ +
+ <%= form.label :formacao, style: "display: block" %> + <%= form.text_field :formacao %> +
+ +
+ <%= form.label :type, style: "display: block" %> + <%= form.text_field :type %> +
+ +
+ <%= form.submit %> +
+<% end %> diff --git a/app/views/usuarios/_usuario.html.erb b/app/views/usuarios/_usuario.html.erb new file mode 100644 index 0000000000..6defd9c276 --- /dev/null +++ b/app/views/usuarios/_usuario.html.erb @@ -0,0 +1,27 @@ +
+
+ Matricula: + <%= usuario.matricula %> +
+ +
+ Email: + <%= usuario.email %> +
+ +
+ Nome: + <%= usuario.nome %> +
+ +
+ Formacao: + <%= usuario.formacao %> +
+ +
+ Type: + <%= usuario.type %> +
+ +
diff --git a/app/views/usuarios/_usuario.json.jbuilder b/app/views/usuarios/_usuario.json.jbuilder new file mode 100644 index 0000000000..4f0dd1450d --- /dev/null +++ b/app/views/usuarios/_usuario.json.jbuilder @@ -0,0 +1,2 @@ +json.extract! usuario, :id, :matricula, :email, :nome, :formacao, :type, :created_at, :updated_at +json.url usuario_url(usuario, format: :json) diff --git a/app/views/usuarios/avaliacoes.html.erb b/app/views/usuarios/avaliacoes.html.erb new file mode 100644 index 0000000000..abaf679ade --- /dev/null +++ b/app/views/usuarios/avaliacoes.html.erb @@ -0,0 +1,85 @@ +<%# app/views/usuarios/avaliacoes.html.erb %> + +
+ + <%# ── Header ── %> +
+ +
+

Avaliações

+
+ +
+
+ +
+ +
+
+ U +
+ +
+
+ +
+ + <%# ── Conteúdo ── %> +
+ + <% if notice.present? %> +
+ <%= notice %> +
+ <% end %> + + <% if alert.present? %> +
+ <%= alert %> +
+ <% end %> + + <% if @avaliacoes.present? %> +
+ + <% @avaliacoes.each do |formulario| %> + <% turma = formulario.turma %> + <% disciplina = turma.disciplina %> + <% professor = turma.docentes.first %> + + <%= link_to usuarios_responder_formulario_path(@usuario, formulario), + style: "width: 278px; background: #FFFFFF; border-radius: 8px; padding: 24px; display: flex; flex-direction: column; justify-content: space-between; min-height: 130px; text-decoration: none; color: inherit; box-sizing: border-box;" do %> + +
+

+ <%= disciplina.nome %> +

+

+ <%= turma.semestre %><%= " — #{turma.horario}" if turma.horario.present? %> +

+
+ +
+

+ <%= professor&.nome || "Professor(a) não alocado(a)" %> +

+
+ + <% end %> + <% end %> + +
+ <% else %> +
+

Nenhuma avaliação disponível para você no momento.

+
+ <% end %> + +
+ +
\ No newline at end of file diff --git a/app/views/usuarios/edit.html.erb b/app/views/usuarios/edit.html.erb new file mode 100644 index 0000000000..670af5b784 --- /dev/null +++ b/app/views/usuarios/edit.html.erb @@ -0,0 +1,12 @@ +<% content_for :title, "Editing usuario" %> + +

Editing usuario

+ +<%= render "form", usuario: @usuario %> + +
+ +
+ <%= link_to "Show this usuario", @usuario %> | + <%= link_to "Back to usuarios", usuarios_path %> +
diff --git a/app/views/usuarios/index.html.erb b/app/views/usuarios/index.html.erb new file mode 100644 index 0000000000..3715fefa03 --- /dev/null +++ b/app/views/usuarios/index.html.erb @@ -0,0 +1,16 @@ +

<%= notice %>

+ +<% content_for :title, "Usuarios" %> + +

Usuarios

+ +
+ <% @usuarios.each do |usuario| %> + <%= render partial: "usuario", object: usuario %> +

+ <%= link_to "Show this usuario", usuario_path(usuario) %> +

+ <% end %> +
+ +<%= link_to "New usuario", new_usuario_path %> diff --git a/app/views/usuarios/index.json.jbuilder b/app/views/usuarios/index.json.jbuilder new file mode 100644 index 0000000000..b7fdb3ce8f --- /dev/null +++ b/app/views/usuarios/index.json.jbuilder @@ -0,0 +1 @@ +json.array! @usuarios, partial: "usuarios/usuario", as: :usuario diff --git a/app/views/usuarios/new.html.erb b/app/views/usuarios/new.html.erb new file mode 100644 index 0000000000..8a2c9f08cc --- /dev/null +++ b/app/views/usuarios/new.html.erb @@ -0,0 +1,11 @@ +<% content_for :title, "New usuario" %> + +

New usuario

+ +<%= render "form", usuario: @usuario %> + +
+ +
+ <%= link_to "Back to usuarios", usuarios_path %> +
diff --git a/app/views/usuarios/responder_formulario.html.erb b/app/views/usuarios/responder_formulario.html.erb new file mode 100644 index 0000000000..87504c7444 --- /dev/null +++ b/app/views/usuarios/responder_formulario.html.erb @@ -0,0 +1,105 @@ +<%# app/views/usuarios/responder_formulario.html.erb %> + +<% + titulo_header = if @formulario.titulo.present? + "Avaliação - #{@formulario.titulo}" + elsif @formulario.turma + partes = [@formulario.turma.disciplina&.nome, @formulario.turma.semestre].compact + partes.any? ? "Avaliação - #{partes.join(' - ')}" : "Avaliação" + else + "Avaliação" + end +%> + +
+ + <%# ── Header ── %> +
+ +
+ <%= link_to usuarios_avaliacoes_path(@usuario), + style: "display: flex; align-items: center; color: #000000; text-decoration: none; font-size: 22px; line-height: 1;" do %> + ☰ + <% end %> +

+ <%= titulo_header %> +

+
+ +
+ U +
+ +
+ + <%# ── Conteúdo ── %> +
+ + <% if flash[:alert] %> +
+ <%= flash[:alert] %> +
+ <% end %> + + <%= form_with url: usuarios_submeter_resposta_path(@usuario, @formulario), + method: :post, + id: "formulario-resposta", + style: "display: flex; flex-direction: column; gap: 16px;" do |f| %> + + <% if @formulario.elemento_forms.empty? %> +
+

Este formulário não possui perguntas.

+
+ <% end %> + + <% @formulario.elemento_forms.order(:ordem).each do |ef| %> +
+ +

+ <%= ef.enunciado %> +

+ + <% if ef.tipo == "Texto" %> + + + <% else %> +
+ <% ef.campo_forms.order(:ordem).each do |campo| %> + + <% end %> +
+ <% end %> + +
+ <% end %> + + <% end %> + +
+ + <% if @formulario.elemento_forms.any? %> + + <% end %> + +
diff --git a/app/views/usuarios/show.html.erb b/app/views/usuarios/show.html.erb new file mode 100644 index 0000000000..ae4030189d --- /dev/null +++ b/app/views/usuarios/show.html.erb @@ -0,0 +1,10 @@ +

<%= notice %>

+ +<%= render @usuario %> + +
+ <%= link_to "Edit this usuario", edit_usuario_path(@usuario) %> | + <%= link_to "Back to usuarios", usuarios_path %> + + <%= button_to "Destroy this usuario", @usuario, method: :delete %> +
diff --git a/app/views/usuarios/show.json.jbuilder b/app/views/usuarios/show.json.jbuilder new file mode 100644 index 0000000000..ad071a9501 --- /dev/null +++ b/app/views/usuarios/show.json.jbuilder @@ -0,0 +1 @@ +json.partial! "usuarios/usuario", usuario: @usuario diff --git a/bin/brakeman b/bin/brakeman new file mode 100755 index 0000000000..ace1c9ba08 --- /dev/null +++ b/bin/brakeman @@ -0,0 +1,7 @@ +#!/usr/bin/env ruby +require "rubygems" +require "bundler/setup" + +ARGV.unshift("--ensure-latest") + +load Gem.bin_path("brakeman", "brakeman") diff --git a/bin/bundler-audit b/bin/bundler-audit new file mode 100755 index 0000000000..e2ef22690c --- /dev/null +++ b/bin/bundler-audit @@ -0,0 +1,6 @@ +#!/usr/bin/env ruby +require_relative "../config/boot" +require "bundler/audit/cli" + +ARGV.concat %w[ --config config/bundler-audit.yml ] if ARGV.empty? || ARGV.include?("check") +Bundler::Audit::CLI.start diff --git a/bin/ci b/bin/ci new file mode 100755 index 0000000000..4137ad5bb0 --- /dev/null +++ b/bin/ci @@ -0,0 +1,6 @@ +#!/usr/bin/env ruby +require_relative "../config/boot" +require "active_support/continuous_integration" + +CI = ActiveSupport::ContinuousIntegration +require_relative "../config/ci.rb" diff --git a/bin/cucumber b/bin/cucumber new file mode 100755 index 0000000000..eb5e962e86 --- /dev/null +++ b/bin/cucumber @@ -0,0 +1,11 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +vendored_cucumber_bin = Dir["#{File.dirname(__FILE__)}/../vendor/{gems,plugins}/cucumber*/bin/cucumber"].first +if vendored_cucumber_bin + load File.expand_path(vendored_cucumber_bin) +else + require 'rubygems' unless ENV['NO_RUBYGEMS'] + require 'cucumber' + load Cucumber::BINARY +end diff --git a/bin/dev b/bin/dev new file mode 100755 index 0000000000..5f91c20545 --- /dev/null +++ b/bin/dev @@ -0,0 +1,2 @@ +#!/usr/bin/env ruby +exec "./bin/rails", "server", *ARGV diff --git a/bin/docker-entrypoint b/bin/docker-entrypoint new file mode 100755 index 0000000000..ed31659f40 --- /dev/null +++ b/bin/docker-entrypoint @@ -0,0 +1,8 @@ +#!/bin/bash -e + +# If running the rails server then create or migrate existing database +if [ "${@: -2:1}" == "./bin/rails" ] && [ "${@: -1:1}" == "server" ]; then + ./bin/rails db:prepare +fi + +exec "${@}" diff --git a/bin/importmap b/bin/importmap new file mode 100755 index 0000000000..36502ab16c --- /dev/null +++ b/bin/importmap @@ -0,0 +1,4 @@ +#!/usr/bin/env ruby + +require_relative "../config/application" +require "importmap/commands" diff --git a/bin/jobs b/bin/jobs new file mode 100755 index 0000000000..dcf59f309a --- /dev/null +++ b/bin/jobs @@ -0,0 +1,6 @@ +#!/usr/bin/env ruby + +require_relative "../config/environment" +require "solid_queue/cli" + +SolidQueue::Cli.start(ARGV) diff --git a/bin/kamal b/bin/kamal new file mode 100755 index 0000000000..d9ba276702 --- /dev/null +++ b/bin/kamal @@ -0,0 +1,16 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +# +# This file was generated by Bundler. +# +# The application 'kamal' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__) + +require "rubygems" +require "bundler/setup" + +load Gem.bin_path("kamal", "kamal") diff --git a/bin/rails b/bin/rails new file mode 100755 index 0000000000..419c6337a0 --- /dev/null +++ b/bin/rails @@ -0,0 +1,9 @@ +#!/usr/bin/env ruby +APP_PATH = File.expand_path("../config/application", __dir__) +require_relative "../config/boot" +require "rails/commands" + +if ENV['RAILS_ENV'] == 'test' + require 'simplecov' + SimpleCov.start 'rails' +end diff --git a/bin/rake b/bin/rake new file mode 100755 index 0000000000..4fbf10b960 --- /dev/null +++ b/bin/rake @@ -0,0 +1,4 @@ +#!/usr/bin/env ruby +require_relative "../config/boot" +require "rake" +Rake.application.run diff --git a/bin/rubocop b/bin/rubocop new file mode 100755 index 0000000000..5a20504716 --- /dev/null +++ b/bin/rubocop @@ -0,0 +1,8 @@ +#!/usr/bin/env ruby +require "rubygems" +require "bundler/setup" + +# Explicit RuboCop config increases performance slightly while avoiding config confusion. +ARGV.unshift("--config", File.expand_path("../.rubocop.yml", __dir__)) + +load Gem.bin_path("rubocop", "rubocop") diff --git a/bin/setup b/bin/setup new file mode 100755 index 0000000000..81be011e87 --- /dev/null +++ b/bin/setup @@ -0,0 +1,35 @@ +#!/usr/bin/env ruby +require "fileutils" + +APP_ROOT = File.expand_path("..", __dir__) + +def system!(*args) + system(*args, exception: true) +end + +FileUtils.chdir APP_ROOT do + # This script is a way to set up or update your development environment automatically. + # This script is idempotent, so that you can run it at any time and get an expectable outcome. + # Add necessary setup steps to this file. + + puts "== Installing dependencies ==" + system("bundle check") || system!("bundle install") + + # puts "\n== Copying sample files ==" + # unless File.exist?("config/database.yml") + # FileUtils.cp "config/database.yml.sample", "config/database.yml" + # end + + puts "\n== Preparing database ==" + system! "bin/rails db:prepare" + system! "bin/rails db:reset" if ARGV.include?("--reset") + + puts "\n== Removing old logs and tempfiles ==" + system! "bin/rails log:clear tmp:clear" + + unless ARGV.include?("--skip-server") + puts "\n== Starting development server ==" + STDOUT.flush # flush the output before exec(2) so that it displays + exec "bin/dev" + end +end diff --git a/bin/thrust b/bin/thrust new file mode 100755 index 0000000000..36bde2d832 --- /dev/null +++ b/bin/thrust @@ -0,0 +1,5 @@ +#!/usr/bin/env ruby +require "rubygems" +require "bundler/setup" + +load Gem.bin_path("thruster", "thrust") diff --git a/config.ru b/config.ru new file mode 100644 index 0000000000..4a3c09a688 --- /dev/null +++ b/config.ru @@ -0,0 +1,6 @@ +# This file is used by Rack-based servers to start the application. + +require_relative "config/environment" + +run Rails.application +Rails.application.load_server diff --git a/config/application.rb b/config/application.rb new file mode 100644 index 0000000000..b4848d838b --- /dev/null +++ b/config/application.rb @@ -0,0 +1,27 @@ +require_relative "boot" + +require "rails/all" + +# Require the gems listed in Gemfile, including any gems +# you've limited to :test, :development, or :production. +Bundler.require(*Rails.groups) + +module Camaar + class Application < Rails::Application + # Initialize configuration defaults for originally generated Rails version. + config.load_defaults 8.1 + + # Please, add to the `ignore` list any other `lib` subdirectories that do + # not contain `.rb` files, or that should not be reloaded or eager loaded. + # Common ones are `templates`, `generators`, or `middleware`, for example. + config.autoload_lib(ignore: %w[assets tasks]) + + # Configuration for the application, engines, and railties goes here. + # + # These settings can be overridden in specific environments using the files + # in config/environments, which are processed later. + # + # config.time_zone = "Central Time (US & Canada)" + # config.eager_load_paths << Rails.root.join("extras") + end +end diff --git a/config/boot.rb b/config/boot.rb new file mode 100644 index 0000000000..988a5ddc46 --- /dev/null +++ b/config/boot.rb @@ -0,0 +1,4 @@ +ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__) + +require "bundler/setup" # Set up gems listed in the Gemfile. +require "bootsnap/setup" # Speed up boot time by caching expensive operations. diff --git a/config/bundler-audit.yml b/config/bundler-audit.yml new file mode 100644 index 0000000000..e74b3af949 --- /dev/null +++ b/config/bundler-audit.yml @@ -0,0 +1,5 @@ +# Audit all gems listed in the Gemfile for known security problems by running bin/bundler-audit. +# CVEs that are not relevant to the application can be enumerated on the ignore list below. + +ignore: + - CVE-THAT-DOES-NOT-APPLY diff --git a/config/cable.yml b/config/cable.yml new file mode 100644 index 0000000000..b9adc5aa3a --- /dev/null +++ b/config/cable.yml @@ -0,0 +1,17 @@ +# Async adapter only works within the same process, so for manually triggering cable updates from a console, +# and seeing results in the browser, you must do so from the web console (running inside the dev process), +# not a terminal started via bin/rails console! Add "console" to any action or any ERB template view +# to make the web console appear. +development: + adapter: async + +test: + adapter: test + +production: + adapter: solid_cable + connects_to: + database: + writing: cable + polling_interval: 0.1.seconds + message_retention: 1.day diff --git a/config/cache.yml b/config/cache.yml new file mode 100644 index 0000000000..19d490843b --- /dev/null +++ b/config/cache.yml @@ -0,0 +1,16 @@ +default: &default + store_options: + # Cap age of oldest cache entry to fulfill retention policies + # max_age: <%= 60.days.to_i %> + max_size: <%= 256.megabytes %> + namespace: <%= Rails.env %> + +development: + <<: *default + +test: + <<: *default + +production: + database: cache + <<: *default diff --git a/config/ci.rb b/config/ci.rb new file mode 100644 index 0000000000..1712cc1127 --- /dev/null +++ b/config/ci.rb @@ -0,0 +1,24 @@ +# Run using bin/ci + +CI.run do + step "Setup", "bin/setup --skip-server" + + step "Style: Ruby", "bin/rubocop" + + step "Security: Gem audit", "bin/bundler-audit" + step "Security: Importmap vulnerability audit", "bin/importmap audit" + step "Security: Brakeman code analysis", "bin/brakeman --quiet --no-pager --exit-on-warn --exit-on-error" + step "Tests: Rails", "bin/rails test" + step "Tests: Seeds", "env RAILS_ENV=test bin/rails db:seed:replant" + + # Optional: Run system tests + # step "Tests: System", "bin/rails test:system" + + # Optional: set a green GitHub commit status to unblock PR merge. + # Requires the `gh` CLI and `gh extension install basecamp/gh-signoff`. + # if success? + # step "Signoff: All systems go. Ready for merge and deploy.", "gh signoff" + # else + # failure "Signoff: CI failed. Do not merge or deploy.", "Fix the issues and try again." + # end +end diff --git a/config/credentials.yml.enc b/config/credentials.yml.enc new file mode 100644 index 0000000000..09eb287f93 --- /dev/null +++ b/config/credentials.yml.enc @@ -0,0 +1 @@ +4H8/6nhnfIn9qW6hDXeaYIPA3qXldZwgNhgvx+L1Hn7mBFhEYQcclgYI+WiUqPbhcvtdzm5FkhaDaTb0TfUCfFTkLfIEdJs9kC+pEBilNfOdzMTTT2d6KeVGNO+BSu/dfxec7YQpsiICdabItL3av/dmoSA9KwDP75Ep+RDAQBXllNWAqBy5zIz1Cnb+/q7doDz2oj+F/Or1Go+v32WzZNm7dbJ4AW3EHJw2L8k82sVmawg8x6i2ehcCNHALQZO/lB3nT6IY0ZkkOxzALaUroqVlgEe+695GkTe08bNTPLrE5l4XSs1edC8V47RTO/ieO9EqHxU3hKvpH7Xdot1P0D6WI6G/koAAzzHnE2jvb4VU6UCIkAXs2mp7L954yxqNgEZ9KOymqNOmancSSStMXp7O5KCiiN6BQCx8ydLaNgScImfwC9dWCiquZOv8Km36dAfzE92TbZUNogOxA5Uw7xEIrjH4Jrg7JDBqM34mJnWW1j5ZX+Fz5Zld--9oy00/0iz+TVEIu/--wUtORdaSWiIGCttp56iN7g== \ No newline at end of file diff --git a/config/cucumber.yml b/config/cucumber.yml new file mode 100644 index 0000000000..47a4663ae2 --- /dev/null +++ b/config/cucumber.yml @@ -0,0 +1,8 @@ +<% +rerun = File.file?('rerun.txt') ? IO.read('rerun.txt') : "" +rerun = rerun.strip.gsub /\s/, ' ' +rerun_opts = rerun.empty? ? "--format #{ENV['CUCUMBER_FORMAT'] || 'progress'} features" : "--format #{ENV['CUCUMBER_FORMAT'] || 'pretty'} #{rerun}" +std_opts = "--format #{ENV['CUCUMBER_FORMAT'] || 'pretty'} --strict --tags 'not @wip'" +%> +default: <%= std_opts %> features +rerun: <%= rerun_opts %> --format rerun --out rerun.txt --strict --tags 'not @wip' diff --git a/config/database.yml b/config/database.yml new file mode 100644 index 0000000000..966443404f --- /dev/null +++ b/config/database.yml @@ -0,0 +1,74 @@ +# MySQL. Versions 5.6.4 and up are supported. +# +# Install the MySQL driver +# gem install mysql2 +# +# Ensure the MySQL gem is defined in your Gemfile +# gem "mysql2" +# +# And be sure to use new-style password hashing: +# https://dev.mysql.com/doc/refman/5.7/en/password-hashing.html +# +default: &default + adapter: mysql2 + encoding: utf8mb4 + pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> + username: camaar + password: senha_do_camaar + host: 127.0.0.1 + +development: + <<: *default + database: camaar_development + +# Warning: The database defined as "test" will be erased and +# re-generated from your development database when you run "rake". +# Do not set this db to the same as development or production. +test: + <<: *default + database: camaar_test + +# As with config/credentials.yml, you never want to store sensitive information, +# like your database password, in your source code. If your source code is +# ever seen by anyone, they now have access to your database. +# +# Instead, provide the password or a full connection URL as an environment +# variable when you boot the app. For example: +# +# DATABASE_URL="mysql2://myuser:mypass@localhost/somedatabase" +# +# If the connection URL is provided in the special DATABASE_URL environment +# variable, Rails will automatically merge its configuration values on top of +# the values provided in this file. Alternatively, you can specify a connection +# URL environment variable explicitly: +# +# production: +# url: <%= ENV["MY_APP_DATABASE_URL"] %> +# +# Connection URLs for non-primary databases can also be configured using +# environment variables. The variable name is formed by concatenating the +# connection name with `_DATABASE_URL`. For example: +# +# CACHE_DATABASE_URL="mysql2://cacheuser:cachepass@localhost/cachedatabase" +# +# Read https://guides.rubyonrails.org/configuring.html#configuring-a-database +# for a full overview on how database connection configuration can be specified. +# +production: + primary: &primary_production + <<: *default + database: camaar_production + username: camaar + password: <%= ENV["CAMAAR_DATABASE_PASSWORD"] %> + cache: + <<: *primary_production + database: camaar_production_cache + migrations_paths: db/cache_migrate + queue: + <<: *primary_production + database: camaar_production_queue + migrations_paths: db/queue_migrate + cable: + <<: *primary_production + database: camaar_production_cable + migrations_paths: db/cable_migrate diff --git a/config/deploy.yml b/config/deploy.yml new file mode 100644 index 0000000000..501ac950fe --- /dev/null +++ b/config/deploy.yml @@ -0,0 +1,119 @@ +# Name of your application. Used to uniquely configure containers. +service: camaar + +# Name of the container image (use your-user/app-name on external registries). +image: camaar + +# Deploy to these servers. +servers: + web: + - 192.168.0.1 + # job: + # hosts: + # - 192.168.0.1 + # cmd: bin/jobs + +# Enable SSL auto certification via Let's Encrypt and allow for multiple apps on a single web server. +# If used with Cloudflare, set encryption mode in SSL/TLS setting to "Full" to enable CF-to-app encryption. +# +# Using an SSL proxy like this requires turning on config.assume_ssl and config.force_ssl in production.rb! +# +# Don't use this when deploying to multiple web servers (then you have to terminate SSL at your load balancer). +# +# proxy: +# ssl: true +# host: app.example.com + +# Where you keep your container images. +registry: + # Alternatives: hub.docker.com / registry.digitalocean.com / ghcr.io / ... + server: localhost:5555 + + # Needed for authenticated registries. + # username: your-user + + # Always use an access token rather than real password when possible. + # password: + # - KAMAL_REGISTRY_PASSWORD + +# Inject ENV variables into containers (secrets come from .kamal/secrets). +env: + secret: + - RAILS_MASTER_KEY + clear: + # Run the Solid Queue Supervisor inside the web server's Puma process to do jobs. + # When you start using multiple servers, you should split out job processing to a dedicated machine. + SOLID_QUEUE_IN_PUMA: true + + # Set number of processes dedicated to Solid Queue (default: 1) + # JOB_CONCURRENCY: 3 + + # Set number of cores available to the application on each server (default: 1). + # WEB_CONCURRENCY: 2 + + # Match this to any external database server to configure Active Record correctly + # Use camaar-db for a db accessory server on same machine via local kamal docker network. + # DB_HOST: 192.168.0.2 + + # Log everything from Rails + # RAILS_LOG_LEVEL: debug + +# Aliases are triggered with "bin/kamal ". You can overwrite arguments on invocation: +# "bin/kamal logs -r job" will tail logs from the first server in the job section. +aliases: + console: app exec --interactive --reuse "bin/rails console" + shell: app exec --interactive --reuse "bash" + logs: app logs -f + dbc: app exec --interactive --reuse "bin/rails dbconsole --include-password" + +# Use a persistent storage volume for sqlite database files and local Active Storage files. +# Recommended to change this to a mounted volume path that is backed up off server. +volumes: + - "camaar_storage:/rails/storage" + +# Bridge fingerprinted assets, like JS and CSS, between versions to avoid +# hitting 404 on in-flight requests. Combines all files from new and old +# version inside the asset_path. +asset_path: /rails/public/assets + +# Configure the image builder. +builder: + arch: amd64 + + # # Build image via remote server (useful for faster amd64 builds on arm64 computers) + # remote: ssh://docker@docker-builder-server + # + # # Pass arguments and secrets to the Docker build process + # args: + # RUBY_VERSION: 4.0.2 + # secrets: + # - GITHUB_TOKEN + # - RAILS_MASTER_KEY + +# Use a different ssh user than root +# ssh: +# user: app + +# Use accessory services (secrets come from .kamal/secrets). +# accessories: +# db: +# image: mysql:8.0 +# host: 192.168.0.2 +# # Change to 3306 to expose port to the world instead of just local network. +# port: "127.0.0.1:3306:3306" +# env: +# clear: +# MYSQL_ROOT_HOST: '%' +# secret: +# - MYSQL_ROOT_PASSWORD +# files: +# - config/mysql/production.cnf:/etc/mysql/my.cnf +# - db/production.sql:/docker-entrypoint-initdb.d/setup.sql +# directories: +# - data:/var/lib/mysql +# redis: +# image: valkey/valkey:8 +# host: 192.168.0.2 +# port: 6379 +# directories: +# - data:/data diff --git a/config/environment.rb b/config/environment.rb new file mode 100644 index 0000000000..cac5315775 --- /dev/null +++ b/config/environment.rb @@ -0,0 +1,5 @@ +# Load the Rails application. +require_relative "application" + +# Initialize the Rails application. +Rails.application.initialize! diff --git a/config/environments/development.rb b/config/environments/development.rb new file mode 100644 index 0000000000..da8e70d7ad --- /dev/null +++ b/config/environments/development.rb @@ -0,0 +1,99 @@ +require "active_support/core_ext/integer/time" + +Rails.application.configure do + # Configure 'rails notes' to inspect Cucumber files + config.annotations.register_directories("features") + config.annotations.register_extensions("feature") { |tag| /#\s*(#{tag}):?\s*(.*)$/ } + + # Settings specified here will take precedence over those in config/application.rb. + + # Make code changes take effect immediately without server restart. + config.enable_reloading = true + + # Do not eager load code on boot. + config.eager_load = false + + # Show full error reports. + config.consider_all_requests_local = true + + # Enable server timing. + config.server_timing = true + + # Enable/disable Action Controller caching. By default Action Controller caching is disabled. + # Run rails dev:cache to toggle Action Controller caching. + if Rails.root.join("tmp/caching-dev.txt").exist? + config.action_controller.perform_caching = true + config.action_controller.enable_fragment_cache_logging = true + config.public_file_server.headers = { "cache-control" => "public, max-age=#{2.days.to_i}" } + else + config.action_controller.perform_caching = false + end + + # Change to :null_store to avoid any caching. + config.cache_store = :memory_store + + # Store uploaded files on the local file system (see config/storage.yml for options). + config.active_storage.service = :local + + # Don't care if the mailer can't send. + config.action_mailer.raise_delivery_errors = true + + # Make template changes take effect immediately. + config.action_mailer.perform_caching = false + + # Set localhost to be used by links generated in mailer templates. + config.action_mailer.default_url_options = { + host: ENV.fetch("APP_HOST", "localhost:3000"), + protocol: ENV.fetch("APP_PROTOCOL", "http") + } + + # Gmail SMTP configuration via environment variables + config.action_mailer.delivery_method = :smtp + config.action_mailer.smtp_settings = { + address: ENV.fetch("SMTP_ADDRESS", "smtp.gmail.com"), + port: ENV.fetch("SMTP_PORT", 587).to_i, + domain: ENV.fetch("SMTP_DOMAIN", "gmail.com"), + user_name: ENV.fetch("SMTP_USERNAME", ""), + password: ENV.fetch("SMTP_PASSWORD", ""), + authentication: :plain, + enable_starttls_auto: true, + open_timeout: 10, + read_timeout: 10 + } + + # Print deprecation notices to the Rails logger. + config.active_support.deprecation = :log + + # Raise an error on page load if there are pending migrations. + config.active_record.migration_error = :page_load + + # Highlight code that triggered database queries in logs. + config.active_record.verbose_query_logs = true + + # Append comments with runtime information tags to SQL queries in logs. + config.active_record.query_log_tags_enabled = true + + # Highlight code that enqueued background job in logs. + config.active_job.verbose_enqueue_logs = true + + # Highlight code that triggered redirect in logs. + config.action_dispatch.verbose_redirect_logs = true + + # Suppress logger output for asset requests. + config.assets.quiet = true + + # Raises error for missing translations. + # config.i18n.raise_on_missing_translations = true + + # Annotate rendered view with file names. + config.action_view.annotate_rendered_view_with_filenames = true + + # Uncomment if you wish to allow Action Cable access from any origin. + # config.action_cable.disable_request_forgery_protection = true + + # Raise error when a before_action's only/except options reference missing actions. + config.action_controller.raise_on_missing_callback_actions = true + + # Apply autocorrection by RuboCop to files generated by `bin/rails generate`. + # config.generators.apply_rubocop_autocorrect_after_generate! +end diff --git a/config/environments/production.rb b/config/environments/production.rb new file mode 100644 index 0000000000..f7a4759303 --- /dev/null +++ b/config/environments/production.rb @@ -0,0 +1,98 @@ +require "active_support/core_ext/integer/time" + +Rails.application.configure do + # Settings specified here will take precedence over those in config/application.rb. + + # Code is not reloaded between requests. + config.enable_reloading = false + + # Eager load code on boot for better performance and memory savings (ignored by Rake tasks). + config.eager_load = true + + # Full error reports are disabled. + config.consider_all_requests_local = false + + # Turn on fragment caching in view templates. + config.action_controller.perform_caching = true + + # Cache assets for far-future expiry since they are all digest stamped. + config.public_file_server.headers = { "cache-control" => "public, max-age=#{1.year.to_i}" } + + # Enable serving of images, stylesheets, and JavaScripts from an asset server. + # config.asset_host = "http://assets.example.com" + + # Store uploaded files on the local file system (see config/storage.yml for options). + config.active_storage.service = :local + + # Assume all access to the app is happening through a SSL-terminating reverse proxy. + # config.assume_ssl = true + + # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies. + # config.force_ssl = true + + # Skip http-to-https redirect for the default health check endpoint. + # config.ssl_options = { redirect: { exclude: ->(request) { request.path == "/up" } } } + + # Log to STDOUT with the current request id as a default log tag. + config.log_tags = [ :request_id ] + config.logger = ActiveSupport::TaggedLogging.logger(STDOUT) + + # Change to "debug" to log everything (including potentially personally-identifiable information!). + config.log_level = ENV.fetch("RAILS_LOG_LEVEL", "info") + + # Prevent health checks from clogging up the logs. + config.silence_healthcheck_path = "/up" + + # Don't log any deprecations. + config.active_support.report_deprecations = false + + # Replace the default in-process memory cache store with a durable alternative. + config.cache_store = :solid_cache_store + + # Replace the default in-process and non-durable queuing backend for Active Job. + config.active_job.queue_adapter = :solid_queue + config.solid_queue.connects_to = { database: { writing: :queue } } + + # Ignore bad email addresses and do not raise email delivery errors. + # Set this to true and configure the email server for immediate delivery to raise delivery errors. + config.action_mailer.raise_delivery_errors = true + + # Set host to be used by links generated in mailer templates. + config.action_mailer.default_url_options = { + host: ENV.fetch("APP_HOST", "example.com"), + protocol: ENV.fetch("APP_PROTOCOL", "https") + } + + # Gmail SMTP configuration via environment variables + config.action_mailer.delivery_method = :smtp + config.action_mailer.smtp_settings = { + address: ENV.fetch("SMTP_ADDRESS", "smtp.gmail.com"), + port: ENV.fetch("SMTP_PORT", 587).to_i, + domain: ENV.fetch("SMTP_DOMAIN", "gmail.com"), + user_name: ENV.fetch("SMTP_USERNAME", ""), + password: ENV.fetch("SMTP_PASSWORD", ""), + authentication: :plain, + enable_starttls_auto: true, + open_timeout: 10, + read_timeout: 10 + } + + # Enable locale fallbacks for I18n (makes lookups for any locale fall back to + # the I18n.default_locale when a translation cannot be found). + config.i18n.fallbacks = true + + # Do not dump schema after migrations. + config.active_record.dump_schema_after_migration = false + + # Only use :id for inspections in production. + config.active_record.attributes_for_inspect = [ :id ] + + # Enable DNS rebinding protection and other `Host` header attacks. + # config.hosts = [ + # "example.com", # Allow requests from example.com + # /.*\.example\.com/ # Allow requests from subdomains like `www.example.com` + # ] + # + # Skip DNS rebinding protection for the default health check endpoint. + # config.host_authorization = { exclude: ->(request) { request.path == "/up" } } +end diff --git a/config/environments/test.rb b/config/environments/test.rb new file mode 100644 index 0000000000..29d195b837 --- /dev/null +++ b/config/environments/test.rb @@ -0,0 +1,57 @@ +# The test environment is used exclusively to run your application's +# test suite. You never need to work with it otherwise. Remember that +# your test database is "scratch space" for the test suite and is wiped +# and recreated between test runs. Don't rely on the data there! + +Rails.application.configure do + # Configure 'rails notes' to inspect Cucumber files + config.annotations.register_directories("features") + config.annotations.register_extensions("feature") { |tag| /#\s*(#{tag}):?\s*(.*)$/ } + + # Settings specified here will take precedence over those in config/application.rb. + + # While tests run files are not watched, reloading is not necessary. + config.enable_reloading = false + + # Eager loading loads your entire application. When running a single test locally, + # this is usually not necessary, and can slow down your test suite. However, it's + # recommended that you enable it in continuous integration systems to ensure eager + # loading is working properly before deploying your code. + config.eager_load = ENV["CI"].present? + + # Configure public file server for tests with cache-control for performance. + config.public_file_server.headers = { "cache-control" => "public, max-age=3600" } + + # Show full error reports. + config.consider_all_requests_local = true + config.cache_store = :null_store + + # Render exception templates for rescuable exceptions and raise for other exceptions. + config.action_dispatch.show_exceptions = :rescuable + + # Disable request forgery protection in test environment. + config.action_controller.allow_forgery_protection = false + + # Store uploaded files on the local file system in a temporary directory. + config.active_storage.service = :test + + # Tell Action Mailer not to deliver emails to the real world. + # The :test delivery method accumulates sent emails in the + # ActionMailer::Base.deliveries array. + config.action_mailer.delivery_method = :test + + # Set host to be used by links generated in mailer templates. + config.action_mailer.default_url_options = { host: "example.com" } + + # Print deprecation notices to the stderr. + config.active_support.deprecation = :stderr + + # Raises error for missing translations. + # config.i18n.raise_on_missing_translations = true + + # Annotate rendered view with file names. + # config.action_view.annotate_rendered_view_with_filenames = true + + # Raise error when a before_action's only/except options reference missing actions. + config.action_controller.raise_on_missing_callback_actions = true +end diff --git a/config/importmap.rb b/config/importmap.rb new file mode 100644 index 0000000000..909dfc542d --- /dev/null +++ b/config/importmap.rb @@ -0,0 +1,7 @@ +# Pin npm packages by running ./bin/importmap + +pin "application" +pin "@hotwired/turbo-rails", to: "turbo.min.js" +pin "@hotwired/stimulus", to: "stimulus.min.js" +pin "@hotwired/stimulus-loading", to: "stimulus-loading.js" +pin_all_from "app/javascript/controllers", under: "controllers" diff --git a/config/initializers/assets.rb b/config/initializers/assets.rb new file mode 100644 index 0000000000..487324424f --- /dev/null +++ b/config/initializers/assets.rb @@ -0,0 +1,7 @@ +# Be sure to restart your server when you modify this file. + +# Version of your assets, change this if you want to expire all your assets. +Rails.application.config.assets.version = "1.0" + +# Add additional assets to the asset load path. +# Rails.application.config.assets.paths << Emoji.images_path diff --git a/config/initializers/content_security_policy.rb b/config/initializers/content_security_policy.rb new file mode 100644 index 0000000000..d51d713979 --- /dev/null +++ b/config/initializers/content_security_policy.rb @@ -0,0 +1,29 @@ +# Be sure to restart your server when you modify this file. + +# Define an application-wide content security policy. +# See the Securing Rails Applications Guide for more information: +# https://guides.rubyonrails.org/security.html#content-security-policy-header + +# Rails.application.configure do +# config.content_security_policy do |policy| +# policy.default_src :self, :https +# policy.font_src :self, :https, :data +# policy.img_src :self, :https, :data +# policy.object_src :none +# policy.script_src :self, :https +# policy.style_src :self, :https +# # Specify URI for violation reports +# # policy.report_uri "/csp-violation-report-endpoint" +# end +# +# # Generate session nonces for permitted importmap, inline scripts, and inline styles. +# config.content_security_policy_nonce_generator = ->(request) { request.session.id.to_s } +# config.content_security_policy_nonce_directives = %w(script-src style-src) +# +# # Automatically add `nonce` to `javascript_tag`, `javascript_include_tag`, and `stylesheet_link_tag` +# # if the corresponding directives are specified in `content_security_policy_nonce_directives`. +# # config.content_security_policy_nonce_auto = true +# +# # Report violations without enforcing the policy. +# # config.content_security_policy_report_only = true +# end diff --git a/config/initializers/filter_parameter_logging.rb b/config/initializers/filter_parameter_logging.rb new file mode 100644 index 0000000000..c0b717f7ec --- /dev/null +++ b/config/initializers/filter_parameter_logging.rb @@ -0,0 +1,8 @@ +# Be sure to restart your server when you modify this file. + +# Configure parameters to be partially matched (e.g. passw matches password) and filtered from the log file. +# Use this to limit dissemination of sensitive information. +# See the ActiveSupport::ParameterFilter documentation for supported notations and behaviors. +Rails.application.config.filter_parameters += [ + :passw, :email, :secret, :token, :_key, :crypt, :salt, :certificate, :otp, :ssn, :cvv, :cvc +] diff --git a/config/initializers/inflections.rb b/config/initializers/inflections.rb new file mode 100644 index 0000000000..3860f659ea --- /dev/null +++ b/config/initializers/inflections.rb @@ -0,0 +1,16 @@ +# Be sure to restart your server when you modify this file. + +# Add new inflection rules using the following format. Inflections +# are locale specific, and you may define rules for as many different +# locales as you wish. All of these examples are active by default: +# ActiveSupport::Inflector.inflections(:en) do |inflect| +# inflect.plural /^(ox)$/i, "\\1en" +# inflect.singular /^(ox)en/i, "\\1" +# inflect.irregular "person", "people" +# inflect.uncountable %w( fish sheep ) +# end + +# These inflection rules are supported but not enabled by default: +# ActiveSupport::Inflector.inflections(:en) do |inflect| +# inflect.acronym "RESTful" +# end diff --git a/config/locales/en.yml b/config/locales/en.yml new file mode 100644 index 0000000000..6c349ae5e3 --- /dev/null +++ b/config/locales/en.yml @@ -0,0 +1,31 @@ +# Files in the config/locales directory are used for internationalization and +# are automatically loaded by Rails. If you want to use locales other than +# English, add the necessary files in this directory. +# +# To use the locales, use `I18n.t`: +# +# I18n.t "hello" +# +# In views, this is aliased to just `t`: +# +# <%= t("hello") %> +# +# To use a different locale, set it with `I18n.locale`: +# +# I18n.locale = :es +# +# This would use the information in config/locales/es.yml. +# +# To learn more about the API, please read the Rails Internationalization guide +# at https://guides.rubyonrails.org/i18n.html. +# +# Be aware that YAML interprets the following case-insensitive strings as +# booleans: `true`, `false`, `on`, `off`, `yes`, `no`. Therefore, these strings +# must be quoted to be interpreted as strings. For example: +# +# en: +# "yes": yup +# enabled: "ON" + +en: + hello: "Hello world" diff --git a/config/puma.rb b/config/puma.rb new file mode 100644 index 0000000000..38c4b86596 --- /dev/null +++ b/config/puma.rb @@ -0,0 +1,42 @@ +# This configuration file will be evaluated by Puma. The top-level methods that +# are invoked here are part of Puma's configuration DSL. For more information +# about methods provided by the DSL, see https://puma.io/puma/Puma/DSL.html. +# +# Puma starts a configurable number of processes (workers) and each process +# serves each request in a thread from an internal thread pool. +# +# You can control the number of workers using ENV["WEB_CONCURRENCY"]. You +# should only set this value when you want to run 2 or more workers. The +# default is already 1. You can set it to `auto` to automatically start a worker +# for each available processor. +# +# The ideal number of threads per worker depends both on how much time the +# application spends waiting for IO operations and on how much you wish to +# prioritize throughput over latency. +# +# As a rule of thumb, increasing the number of threads will increase how much +# traffic a given process can handle (throughput), but due to CRuby's +# Global VM Lock (GVL) it has diminishing returns and will degrade the +# response time (latency) of the application. +# +# The default is set to 3 threads as it's deemed a decent compromise between +# throughput and latency for the average Rails application. +# +# Any libraries that use a connection pool or another resource pool should +# be configured to provide at least as many connections as the number of +# threads. This includes Active Record's `pool` parameter in `database.yml`. +threads_count = ENV.fetch("RAILS_MAX_THREADS", 3) +threads threads_count, threads_count + +# Specifies the `port` that Puma will listen on to receive requests; default is 3000. +port ENV.fetch("PORT", 3000) + +# Allow puma to be restarted by `bin/rails restart` command. +plugin :tmp_restart + +# Run the Solid Queue supervisor inside of Puma for single-server deployments. +plugin :solid_queue if ENV["SOLID_QUEUE_IN_PUMA"] + +# Specify the PID file. Defaults to tmp/pids/server.pid in development. +# In other environments, only set the PID file if requested. +pidfile ENV["PIDFILE"] if ENV["PIDFILE"] diff --git a/config/queue.yml b/config/queue.yml new file mode 100644 index 0000000000..9eace59c41 --- /dev/null +++ b/config/queue.yml @@ -0,0 +1,18 @@ +default: &default + dispatchers: + - polling_interval: 1 + batch_size: 500 + workers: + - queues: "*" + threads: 3 + processes: <%= ENV.fetch("JOB_CONCURRENCY", 1) %> + polling_interval: 0.1 + +development: + <<: *default + +test: + <<: *default + +production: + <<: *default diff --git a/config/recurring.yml b/config/recurring.yml new file mode 100644 index 0000000000..b4207f9b07 --- /dev/null +++ b/config/recurring.yml @@ -0,0 +1,15 @@ +# examples: +# periodic_cleanup: +# class: CleanSoftDeletedRecordsJob +# queue: background +# args: [ 1000, { batch_size: 500 } ] +# schedule: every hour +# periodic_cleanup_with_command: +# command: "SoftDeletedRecord.due.delete_all" +# priority: 2 +# schedule: at 5am every day + +production: + clear_solid_queue_finished_jobs: + command: "SolidQueue::Job.clear_finished_in_batches(sleep_between_batches: 0.3)" + schedule: every hour at minute 12 diff --git a/config/routes.rb b/config/routes.rb new file mode 100644 index 0000000000..39de81fc5e --- /dev/null +++ b/config/routes.rb @@ -0,0 +1,63 @@ +Rails.application.routes.draw do + root "sessions#new" + + get "/inicio", to: "home#index", as: :inicio + post "/login", to: "sessions#create", as: :login + delete "/logout", to: "sessions#destroy", as: :logout + + get "/definir_senha/:token", to: "definicao_senhas#edit", as: :edit_definicao_senha + patch "/definir_senha/:token", to: "definicao_senhas#update", as: :definicao_senha + + get "/redefinir_senha", to: "redefinicao_senhas#new", as: :redefinir_senha + post "/redefinir_senha", to: "redefinicao_senhas#create" + get "/redefinir_senha/:token", to: "redefinicao_senhas#edit", as: :edit_redefinicao_senha + patch "/redefinir_senha/:token", to: "redefinicao_senhas#update", as: :redefinicao_senha + + resources :resposta_elems + resources :resposta_forms + resources :campo_forms + resources :elemento_forms + resources :formularios + resources :campos + resources :elementos + resources :docentes + resources :discentes + resources :usuarios + resources :turmas + resources :disciplinas + resources :cursos + resources :departamentos + # Define your application routes per the DSL in https://guides.rubyonrails.org/routing.html + + # Reveal health status on /up that returns 200 if the app boots with no exceptions, otherwise 500. + # Can be used by load balancers and uptime monitors to verify that the app is live. + + scope "/admin/:admin_id", as: "admin" do + get "avaliacoes", to: "admin#avaliacoes", as: :avaliacoes + get "gerenciamento", to: "admin#gerenciamento", as: :gerenciamento + resources :templates + get "sincronizar_sigaa", to: "admin#sincronizar_sigaa", as: :sincronizar_sigaa + post "sincronizar_sigaa", to: "admin#sincronizar_sigaa" + get "enviar_formularios", to: "admin#enviar_formularios", as: :enviar_formularios + post "enviar_formularios", to: "admin#enviar_formularios" + get "resultados", to: "admin#resultados", as: :resultados + get "resultados/:id/download.csv", to: "admin#exportar_csv", as: :baixar_csv + end + + scope "/usuarios/:usuario_id", as: "usuarios" do + get "avaliacoes", to: "usuarios#avaliacoes", as: :avaliacoes + get "formularios/:formulario_id/responder", to: "usuarios#responder_formulario", as: :responder_formulario + post "formularios/:formulario_id/responder", to: "usuarios#submeter_resposta", as: :submeter_resposta + end + + post "admin/importar_sigaa", to: "admin#importar_sigaa", as: :importar_sigaa + post "admin/atualizar_sigaa", to: "admin#atualizar_sigaa", as: :atualizar_sigaa + + get "up" => "rails/health#show", as: :rails_health_check + # Render dynamic PWA files from app/views/pwa/* (remember to link manifest in application.html.erb) + # get "manifest" => "rails/pwa#manifest", as: :pwa_manifest + # get "service-worker" => "rails/pwa#service_worker", as: :pwa_service_worker + + # Defines the root path route ("/") + # root "posts#index" +end diff --git a/config/storage.yml b/config/storage.yml new file mode 100644 index 0000000000..927dc537c8 --- /dev/null +++ b/config/storage.yml @@ -0,0 +1,27 @@ +test: + service: Disk + root: <%= Rails.root.join("tmp/storage") %> + +local: + service: Disk + root: <%= Rails.root.join("storage") %> + +# Use bin/rails credentials:edit to set the AWS secrets (as aws:access_key_id|secret_access_key) +# amazon: +# service: S3 +# access_key_id: <%= Rails.application.credentials.dig(:aws, :access_key_id) %> +# secret_access_key: <%= Rails.application.credentials.dig(:aws, :secret_access_key) %> +# region: us-east-1 +# bucket: your_own_bucket-<%= Rails.env %> + +# Remember not to checkin your GCS keyfile to a repository +# google: +# service: GCS +# project: your_project +# credentials: <%= Rails.root.join("path/to/gcs.keyfile") %> +# bucket: your_own_bucket-<%= Rails.env %> + +# mirror: +# service: Mirror +# primary: local +# mirrors: [ amazon, google, microsoft ] diff --git a/db/cable_schema.rb b/db/cable_schema.rb new file mode 100644 index 0000000000..23666604a5 --- /dev/null +++ b/db/cable_schema.rb @@ -0,0 +1,11 @@ +ActiveRecord::Schema[7.1].define(version: 1) do + create_table "solid_cable_messages", force: :cascade do |t| + t.binary "channel", limit: 1024, null: false + t.binary "payload", limit: 536870912, null: false + t.datetime "created_at", null: false + t.integer "channel_hash", limit: 8, null: false + t.index ["channel"], name: "index_solid_cable_messages_on_channel" + t.index ["channel_hash"], name: "index_solid_cable_messages_on_channel_hash" + t.index ["created_at"], name: "index_solid_cable_messages_on_created_at" + end +end diff --git a/db/cache_schema.rb b/db/cache_schema.rb new file mode 100644 index 0000000000..81a410d188 --- /dev/null +++ b/db/cache_schema.rb @@ -0,0 +1,12 @@ +ActiveRecord::Schema[7.2].define(version: 1) do + create_table "solid_cache_entries", force: :cascade do |t| + t.binary "key", limit: 1024, null: false + t.binary "value", limit: 536870912, null: false + t.datetime "created_at", null: false + t.integer "key_hash", limit: 8, null: false + t.integer "byte_size", limit: 4, null: false + t.index ["byte_size"], name: "index_solid_cache_entries_on_byte_size" + t.index ["key_hash", "byte_size"], name: "index_solid_cache_entries_on_key_hash_and_byte_size" + t.index ["key_hash"], name: "index_solid_cache_entries_on_key_hash", unique: true + end +end diff --git a/db/migrate/20260527234832_create_departamentos.rb b/db/migrate/20260527234832_create_departamentos.rb new file mode 100644 index 0000000000..d68e988470 --- /dev/null +++ b/db/migrate/20260527234832_create_departamentos.rb @@ -0,0 +1,11 @@ +class CreateDepartamentos < ActiveRecord::Migration[8.1] + def change + create_table :departamentos do |t| + t.string :codigo + t.string :nome + + t.timestamps + end + add_index :departamentos, :codigo, unique: true + end +end diff --git a/db/migrate/20260527234834_create_cursos.rb b/db/migrate/20260527234834_create_cursos.rb new file mode 100644 index 0000000000..df00ece751 --- /dev/null +++ b/db/migrate/20260527234834_create_cursos.rb @@ -0,0 +1,12 @@ +class CreateCursos < ActiveRecord::Migration[8.1] + def change + create_table :cursos do |t| + t.string :codigo + t.string :nome + t.references :departamento, null: false, foreign_key: true + + t.timestamps + end + add_index :cursos, :codigo, unique: true + end +end diff --git a/db/migrate/20260527234836_create_disciplinas.rb b/db/migrate/20260527234836_create_disciplinas.rb new file mode 100644 index 0000000000..3792bd4359 --- /dev/null +++ b/db/migrate/20260527234836_create_disciplinas.rb @@ -0,0 +1,12 @@ +class CreateDisciplinas < ActiveRecord::Migration[8.1] + def change + create_table :disciplinas do |t| + t.string :codigo + t.string :nome + t.references :departamento, null: false, foreign_key: true + + t.timestamps + end + add_index :disciplinas, :codigo, unique: true + end +end diff --git a/db/migrate/20260527234838_create_turmas.rb b/db/migrate/20260527234838_create_turmas.rb new file mode 100644 index 0000000000..6cebbbbf67 --- /dev/null +++ b/db/migrate/20260527234838_create_turmas.rb @@ -0,0 +1,12 @@ +class CreateTurmas < ActiveRecord::Migration[8.1] + def change + create_table :turmas do |t| + t.string :numero_da_turma + t.string :semestre + t.string :horario + t.references :disciplina, null: false, foreign_key: true + + t.timestamps + end + end +end diff --git a/db/migrate/20260527235010_create_usuarios.rb b/db/migrate/20260527235010_create_usuarios.rb new file mode 100644 index 0000000000..0810d70635 --- /dev/null +++ b/db/migrate/20260527235010_create_usuarios.rb @@ -0,0 +1,17 @@ +class CreateUsuarios < ActiveRecord::Migration[8.1] + def change + create_table :usuarios do |t| + t.string :matricula + t.string :senha_hash + t.string :email + t.string :nome + t.string :formacao + t.string :type + t.references :curso, null: false, foreign_key: true + t.references :departamento, null: false, foreign_key: true + + t.timestamps + end + add_index :usuarios, :matricula, unique: true + end +end diff --git a/db/migrate/20260527235026_create_templates.rb b/db/migrate/20260527235026_create_templates.rb new file mode 100644 index 0000000000..0170a38e2c --- /dev/null +++ b/db/migrate/20260527235026_create_templates.rb @@ -0,0 +1,9 @@ +class CreateTemplates < ActiveRecord::Migration[8.1] + def change + create_table :templates do |t| + t.string :nome + + t.timestamps + end + end +end diff --git a/db/migrate/20260527235028_create_elementos.rb b/db/migrate/20260527235028_create_elementos.rb new file mode 100644 index 0000000000..0f606f6609 --- /dev/null +++ b/db/migrate/20260527235028_create_elementos.rb @@ -0,0 +1,11 @@ +class CreateElementos < ActiveRecord::Migration[8.1] + def change + create_table :elementos do |t| + t.integer :ordem + t.string :enunciado + t.references :template, null: false, foreign_key: true + + t.timestamps + end + end +end diff --git a/db/migrate/20260527235031_create_campos.rb b/db/migrate/20260527235031_create_campos.rb new file mode 100644 index 0000000000..2eed8b9a65 --- /dev/null +++ b/db/migrate/20260527235031_create_campos.rb @@ -0,0 +1,12 @@ +class CreateCampos < ActiveRecord::Migration[8.1] + def change + create_table :campos do |t| + t.integer :ordem + t.string :enunciado + t.string :tipo_elemento + t.references :elemento, null: false, foreign_key: true + + t.timestamps + end + end +end diff --git a/db/migrate/20260527235053_create_formularios.rb b/db/migrate/20260527235053_create_formularios.rb new file mode 100644 index 0000000000..a0db30072f --- /dev/null +++ b/db/migrate/20260527235053_create_formularios.rb @@ -0,0 +1,9 @@ +class CreateFormularios < ActiveRecord::Migration[8.1] + def change + create_table :formularios do |t| + t.references :turma, null: false, foreign_key: true + + t.timestamps + end + end +end diff --git a/db/migrate/20260527235055_create_elemento_forms.rb b/db/migrate/20260527235055_create_elemento_forms.rb new file mode 100644 index 0000000000..af930be937 --- /dev/null +++ b/db/migrate/20260527235055_create_elemento_forms.rb @@ -0,0 +1,11 @@ +class CreateElementoForms < ActiveRecord::Migration[8.1] + def change + create_table :elemento_forms do |t| + t.integer :ordem + t.string :enunciado + t.references :formulario, null: false, foreign_key: true + + t.timestamps + end + end +end diff --git a/db/migrate/20260527235057_create_campo_forms.rb b/db/migrate/20260527235057_create_campo_forms.rb new file mode 100644 index 0000000000..383ec9749f --- /dev/null +++ b/db/migrate/20260527235057_create_campo_forms.rb @@ -0,0 +1,11 @@ +class CreateCampoForms < ActiveRecord::Migration[8.1] + def change + create_table :campo_forms do |t| + t.integer :ordem + t.string :enunciado + t.references :elemento_form, null: false, foreign_key: true + + t.timestamps + end + end +end diff --git a/db/migrate/20260527235101_create_resposta_forms.rb b/db/migrate/20260527235101_create_resposta_forms.rb new file mode 100644 index 0000000000..6e8b112723 --- /dev/null +++ b/db/migrate/20260527235101_create_resposta_forms.rb @@ -0,0 +1,11 @@ +class CreateRespostaForms < ActiveRecord::Migration[8.1] + def change + create_table :resposta_forms do |t| + t.date :data_submissao + t.references :formulario, null: false, foreign_key: true + t.references :usuario, null: false, foreign_key: true + + t.timestamps + end + end +end diff --git a/db/migrate/20260527235104_create_resposta_elems.rb b/db/migrate/20260527235104_create_resposta_elems.rb new file mode 100644 index 0000000000..8c9aa6fba9 --- /dev/null +++ b/db/migrate/20260527235104_create_resposta_elems.rb @@ -0,0 +1,12 @@ +class CreateRespostaElems < ActiveRecord::Migration[8.1] + def change + create_table :resposta_elems do |t| + t.text :texto_resposta + t.references :resposta_form, null: false, foreign_key: true + t.references :elemento_form, null: false, foreign_key: true + t.references :campo_form, null: false, foreign_key: true + + t.timestamps + end + end +end diff --git a/db/migrate/20260528000107_create_join_table_discente_turma.rb b/db/migrate/20260528000107_create_join_table_discente_turma.rb new file mode 100644 index 0000000000..caf907c424 --- /dev/null +++ b/db/migrate/20260528000107_create_join_table_discente_turma.rb @@ -0,0 +1,8 @@ +class CreateJoinTableDiscenteTurma < ActiveRecord::Migration[8.1] + def change + create_join_table :discentes, :turmas do |t| + # t.index [:discente_id, :turma_id] + # t.index [:turma_id, :discente_id] + end + end +end diff --git a/db/migrate/20260528000109_create_join_table_docente_turma.rb b/db/migrate/20260528000109_create_join_table_docente_turma.rb new file mode 100644 index 0000000000..962b882b0c --- /dev/null +++ b/db/migrate/20260528000109_create_join_table_docente_turma.rb @@ -0,0 +1,8 @@ +class CreateJoinTableDocenteTurma < ActiveRecord::Migration[8.1] + def change + create_join_table :docentes, :turmas do |t| + # t.index [:docente_id, :turma_id] + # t.index [:turma_id, :docente_id] + end + end +end diff --git a/db/migrate/20260528002258_ajusta_nulos_para_sti.rb b/db/migrate/20260528002258_ajusta_nulos_para_sti.rb new file mode 100644 index 0000000000..c6d3c678ec --- /dev/null +++ b/db/migrate/20260528002258_ajusta_nulos_para_sti.rb @@ -0,0 +1,7 @@ +class AjustaNulosParaSti < ActiveRecord::Migration[8.1] + def change + change_column_null :usuarios, :curso_id, true + change_column_null :usuarios, :departamento_id, true + change_column_null :resposta_elems, :campo_form_id, true + end +end diff --git a/db/migrate/20260601120000_add_definicao_senha_to_usuarios.rb b/db/migrate/20260601120000_add_definicao_senha_to_usuarios.rb new file mode 100644 index 0000000000..8a8f0ed497 --- /dev/null +++ b/db/migrate/20260601120000_add_definicao_senha_to_usuarios.rb @@ -0,0 +1,8 @@ +class AddDefinicaoSenhaToUsuarios < ActiveRecord::Migration[8.1] + def change + add_column :usuarios, :definicao_senha_token, :string + add_column :usuarios, :definicao_senha_sent_at, :datetime + + add_index :usuarios, :definicao_senha_token, unique: true + end +end diff --git a/db/migrate/20260602090000_add_redefinicao_senha_to_usuarios.rb b/db/migrate/20260602090000_add_redefinicao_senha_to_usuarios.rb new file mode 100644 index 0000000000..11ab0be88e --- /dev/null +++ b/db/migrate/20260602090000_add_redefinicao_senha_to_usuarios.rb @@ -0,0 +1,8 @@ +class AddRedefinicaoSenhaToUsuarios < ActiveRecord::Migration[8.1] + def change + add_column :usuarios, :redefinicao_senha_token, :string + add_column :usuarios, :redefinicao_senha_sent_at, :datetime + + add_index :usuarios, :redefinicao_senha_token, unique: true + end +end diff --git a/db/migrate/20260615105458_add_usuario_to_templates.rb b/db/migrate/20260615105458_add_usuario_to_templates.rb new file mode 100644 index 0000000000..ae90001208 --- /dev/null +++ b/db/migrate/20260615105458_add_usuario_to_templates.rb @@ -0,0 +1,5 @@ +class AddUsuarioToTemplates < ActiveRecord::Migration[8.1] + def change + add_reference :templates, :usuario, null: false, foreign_key: true + end +end diff --git a/db/migrate/20260616193744_add_titulo_to_formularios_and_make_turma_optional.rb b/db/migrate/20260616193744_add_titulo_to_formularios_and_make_turma_optional.rb new file mode 100644 index 0000000000..f7a355427b --- /dev/null +++ b/db/migrate/20260616193744_add_titulo_to_formularios_and_make_turma_optional.rb @@ -0,0 +1,6 @@ +class AddTituloToFormulariosAndMakeTurmaOptional < ActiveRecord::Migration[8.1] + def change + add_column :formularios, :titulo, :string unless column_exists?(:formularios, :titulo) + change_column_null :formularios, :turma_id, true + end +end diff --git a/db/migrate/20260616201400_add_tipo_to_elemento_forms.rb b/db/migrate/20260616201400_add_tipo_to_elemento_forms.rb new file mode 100644 index 0000000000..fbdf527578 --- /dev/null +++ b/db/migrate/20260616201400_add_tipo_to_elemento_forms.rb @@ -0,0 +1,5 @@ +class AddTipoToElementoForms < ActiveRecord::Migration[8.1] + def change + add_column :elemento_forms, :tipo, :string unless column_exists?(:elemento_forms, :tipo) + end +end diff --git a/db/queue_schema.rb b/db/queue_schema.rb new file mode 100644 index 0000000000..85194b6a88 --- /dev/null +++ b/db/queue_schema.rb @@ -0,0 +1,129 @@ +ActiveRecord::Schema[7.1].define(version: 1) do + create_table "solid_queue_blocked_executions", force: :cascade do |t| + t.bigint "job_id", null: false + t.string "queue_name", null: false + t.integer "priority", default: 0, null: false + t.string "concurrency_key", null: false + t.datetime "expires_at", null: false + t.datetime "created_at", null: false + t.index [ "concurrency_key", "priority", "job_id" ], name: "index_solid_queue_blocked_executions_for_release" + t.index [ "expires_at", "concurrency_key" ], name: "index_solid_queue_blocked_executions_for_maintenance" + t.index [ "job_id" ], name: "index_solid_queue_blocked_executions_on_job_id", unique: true + end + + create_table "solid_queue_claimed_executions", force: :cascade do |t| + t.bigint "job_id", null: false + t.bigint "process_id" + t.datetime "created_at", null: false + t.index [ "job_id" ], name: "index_solid_queue_claimed_executions_on_job_id", unique: true + t.index [ "process_id", "job_id" ], name: "index_solid_queue_claimed_executions_on_process_id_and_job_id" + end + + create_table "solid_queue_failed_executions", force: :cascade do |t| + t.bigint "job_id", null: false + t.text "error" + t.datetime "created_at", null: false + t.index [ "job_id" ], name: "index_solid_queue_failed_executions_on_job_id", unique: true + end + + create_table "solid_queue_jobs", force: :cascade do |t| + t.string "queue_name", null: false + t.string "class_name", null: false + t.text "arguments" + t.integer "priority", default: 0, null: false + t.string "active_job_id" + t.datetime "scheduled_at" + t.datetime "finished_at" + t.string "concurrency_key" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index [ "active_job_id" ], name: "index_solid_queue_jobs_on_active_job_id" + t.index [ "class_name" ], name: "index_solid_queue_jobs_on_class_name" + t.index [ "finished_at" ], name: "index_solid_queue_jobs_on_finished_at" + t.index [ "queue_name", "finished_at" ], name: "index_solid_queue_jobs_for_filtering" + t.index [ "scheduled_at", "finished_at" ], name: "index_solid_queue_jobs_for_alerting" + end + + create_table "solid_queue_pauses", force: :cascade do |t| + t.string "queue_name", null: false + t.datetime "created_at", null: false + t.index [ "queue_name" ], name: "index_solid_queue_pauses_on_queue_name", unique: true + end + + create_table "solid_queue_processes", force: :cascade do |t| + t.string "kind", null: false + t.datetime "last_heartbeat_at", null: false + t.bigint "supervisor_id" + t.integer "pid", null: false + t.string "hostname" + t.text "metadata" + t.datetime "created_at", null: false + t.string "name", null: false + t.index [ "last_heartbeat_at" ], name: "index_solid_queue_processes_on_last_heartbeat_at" + t.index [ "name", "supervisor_id" ], name: "index_solid_queue_processes_on_name_and_supervisor_id", unique: true + t.index [ "supervisor_id" ], name: "index_solid_queue_processes_on_supervisor_id" + end + + create_table "solid_queue_ready_executions", force: :cascade do |t| + t.bigint "job_id", null: false + t.string "queue_name", null: false + t.integer "priority", default: 0, null: false + t.datetime "created_at", null: false + t.index [ "job_id" ], name: "index_solid_queue_ready_executions_on_job_id", unique: true + t.index [ "priority", "job_id" ], name: "index_solid_queue_poll_all" + t.index [ "queue_name", "priority", "job_id" ], name: "index_solid_queue_poll_by_queue" + end + + create_table "solid_queue_recurring_executions", force: :cascade do |t| + t.bigint "job_id", null: false + t.string "task_key", null: false + t.datetime "run_at", null: false + t.datetime "created_at", null: false + t.index [ "job_id" ], name: "index_solid_queue_recurring_executions_on_job_id", unique: true + t.index [ "task_key", "run_at" ], name: "index_solid_queue_recurring_executions_on_task_key_and_run_at", unique: true + end + + create_table "solid_queue_recurring_tasks", force: :cascade do |t| + t.string "key", null: false + t.string "schedule", null: false + t.string "command", limit: 2048 + t.string "class_name" + t.text "arguments" + t.string "queue_name" + t.integer "priority", default: 0 + t.boolean "static", default: true, null: false + t.text "description" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index [ "key" ], name: "index_solid_queue_recurring_tasks_on_key", unique: true + t.index [ "static" ], name: "index_solid_queue_recurring_tasks_on_static" + end + + create_table "solid_queue_scheduled_executions", force: :cascade do |t| + t.bigint "job_id", null: false + t.string "queue_name", null: false + t.integer "priority", default: 0, null: false + t.datetime "scheduled_at", null: false + t.datetime "created_at", null: false + t.index [ "job_id" ], name: "index_solid_queue_scheduled_executions_on_job_id", unique: true + t.index [ "scheduled_at", "priority", "job_id" ], name: "index_solid_queue_dispatch_all" + end + + create_table "solid_queue_semaphores", force: :cascade do |t| + t.string "key", null: false + t.integer "value", default: 1, null: false + t.datetime "expires_at", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index [ "expires_at" ], name: "index_solid_queue_semaphores_on_expires_at" + t.index [ "key", "value" ], name: "index_solid_queue_semaphores_on_key_and_value" + t.index [ "key" ], name: "index_solid_queue_semaphores_on_key", unique: true + end + + add_foreign_key "solid_queue_blocked_executions", "solid_queue_jobs", column: "job_id", on_delete: :cascade + add_foreign_key "solid_queue_claimed_executions", "solid_queue_jobs", column: "job_id", on_delete: :cascade + add_foreign_key "solid_queue_failed_executions", "solid_queue_jobs", column: "job_id", on_delete: :cascade + add_foreign_key "solid_queue_ready_executions", "solid_queue_jobs", column: "job_id", on_delete: :cascade + add_foreign_key "solid_queue_recurring_executions", "solid_queue_jobs", column: "job_id", on_delete: :cascade + add_foreign_key "solid_queue_scheduled_executions", "solid_queue_jobs", column: "job_id", on_delete: :cascade +end diff --git a/db/schema.rb b/db/schema.rb new file mode 100644 index 0000000000..2358a57d3b --- /dev/null +++ b/db/schema.rb @@ -0,0 +1,180 @@ +# This file is auto-generated from the current state of the database. Instead +# of editing this file, please use the migrations feature of Active Record to +# incrementally modify your database, and then regenerate this schema definition. +# +# This file is the source Rails uses to define your schema when running `bin/rails +# db:schema:load`. When creating a new database, `bin/rails db:schema:load` tends to +# be faster and is potentially less error prone than running all of your +# migrations from scratch. Old migrations may fail to apply correctly if those +# migrations use external dependencies or application code. +# +# It's strongly recommended that you check this file into your version control system. + +ActiveRecord::Schema[8.1].define(version: 2026_06_16_201400) do + create_table "campo_forms", charset: "utf8mb4", collation: "utf8mb4_0900_ai_ci", force: :cascade do |t| + t.datetime "created_at", null: false + t.bigint "elemento_form_id", null: false + t.string "enunciado" + t.integer "ordem" + t.string "tipo_elemento" + t.datetime "updated_at", null: false + t.index ["elemento_form_id"], name: "index_campo_forms_on_elemento_form_id" + end + + create_table "campos", charset: "utf8mb4", collation: "utf8mb4_0900_ai_ci", force: :cascade do |t| + t.datetime "created_at", null: false + t.bigint "elemento_id", null: false + t.string "enunciado" + t.integer "ordem" + t.string "tipo_elemento" + t.datetime "updated_at", null: false + t.index ["elemento_id"], name: "index_campos_on_elemento_id" + end + + create_table "cursos", charset: "utf8mb4", collation: "utf8mb4_0900_ai_ci", force: :cascade do |t| + t.string "codigo" + t.datetime "created_at", null: false + t.bigint "departamento_id", null: false + t.string "nome" + t.datetime "updated_at", null: false + t.index ["codigo"], name: "index_cursos_on_codigo", unique: true + t.index ["departamento_id"], name: "index_cursos_on_departamento_id" + end + + create_table "departamentos", charset: "utf8mb4", collation: "utf8mb4_0900_ai_ci", force: :cascade do |t| + t.string "codigo" + t.datetime "created_at", null: false + t.string "nome" + t.datetime "updated_at", null: false + t.index ["codigo"], name: "index_departamentos_on_codigo", unique: true + end + + create_table "discentes_turmas", id: false, charset: "utf8mb4", collation: "utf8mb4_0900_ai_ci", force: :cascade do |t| + t.bigint "discente_id", null: false + t.bigint "turma_id", null: false + end + + create_table "disciplinas", charset: "utf8mb4", collation: "utf8mb4_0900_ai_ci", force: :cascade do |t| + t.string "codigo" + t.datetime "created_at", null: false + t.bigint "departamento_id", null: false + t.string "nome" + t.datetime "updated_at", null: false + t.index ["codigo"], name: "index_disciplinas_on_codigo", unique: true + t.index ["departamento_id"], name: "index_disciplinas_on_departamento_id" + end + + create_table "docentes_turmas", id: false, charset: "utf8mb4", collation: "utf8mb4_0900_ai_ci", force: :cascade do |t| + t.bigint "docente_id", null: false + t.bigint "turma_id", null: false + end + + create_table "elemento_forms", charset: "utf8mb4", collation: "utf8mb4_0900_ai_ci", force: :cascade do |t| + t.datetime "created_at", null: false + t.string "enunciado" + t.bigint "formulario_id", null: false + t.integer "ordem" + t.string "tipo" + t.datetime "updated_at", null: false + t.index ["formulario_id"], name: "index_elemento_forms_on_formulario_id" + end + + create_table "elementos", charset: "utf8mb4", collation: "utf8mb4_0900_ai_ci", force: :cascade do |t| + t.datetime "created_at", null: false + t.string "enunciado" + t.integer "ordem" + t.bigint "template_id", null: false + t.datetime "updated_at", null: false + t.index ["template_id"], name: "index_elementos_on_template_id" + end + + create_table "formularios", charset: "utf8mb4", collation: "utf8mb4_0900_ai_ci", force: :cascade do |t| + t.datetime "created_at", null: false + t.date "data_fim" + t.date "data_inicio" + t.string "nome" + t.string "titulo" + t.bigint "turma_id" + t.datetime "updated_at", null: false + t.index ["turma_id"], name: "index_formularios_on_turma_id" + end + + create_table "resposta_elems", charset: "utf8mb4", collation: "utf8mb4_0900_ai_ci", force: :cascade do |t| + t.bigint "campo_form_id" + t.datetime "created_at", null: false + t.bigint "elemento_form_id", null: false + t.bigint "resposta_form_id", null: false + t.text "texto_resposta" + t.datetime "updated_at", null: false + t.index ["campo_form_id"], name: "index_resposta_elems_on_campo_form_id" + t.index ["elemento_form_id"], name: "index_resposta_elems_on_elemento_form_id" + t.index ["resposta_form_id"], name: "index_resposta_elems_on_resposta_form_id" + end + + create_table "resposta_forms", charset: "utf8mb4", collation: "utf8mb4_0900_ai_ci", force: :cascade do |t| + t.datetime "created_at", null: false + t.date "data_submissao" + t.bigint "formulario_id", null: false + t.datetime "updated_at", null: false + t.bigint "usuario_id", null: false + t.index ["formulario_id"], name: "index_resposta_forms_on_formulario_id" + t.index ["usuario_id"], name: "index_resposta_forms_on_usuario_id" + end + + create_table "templates", charset: "utf8mb4", collation: "utf8mb4_0900_ai_ci", force: :cascade do |t| + t.datetime "created_at", null: false + t.string "nome" + t.datetime "updated_at", null: false + t.bigint "usuario_id", null: false + t.index ["usuario_id"], name: "index_templates_on_usuario_id" + end + + create_table "turmas", charset: "utf8mb4", collation: "utf8mb4_0900_ai_ci", force: :cascade do |t| + t.datetime "created_at", null: false + t.bigint "disciplina_id", null: false + t.string "horario" + t.string "numero_da_turma" + t.string "semestre" + t.datetime "updated_at", null: false + t.index ["disciplina_id"], name: "index_turmas_on_disciplina_id" + end + + create_table "usuarios", charset: "utf8mb4", collation: "utf8mb4_0900_ai_ci", force: :cascade do |t| + t.datetime "created_at", null: false + t.bigint "curso_id" + t.datetime "definicao_senha_sent_at" + t.string "definicao_senha_token" + t.bigint "departamento_id" + t.string "email" + t.string "formacao" + t.string "matricula" + t.string "nome" + t.datetime "redefinicao_senha_sent_at" + t.string "redefinicao_senha_token" + t.string "senha_hash" + t.string "type" + t.datetime "updated_at", null: false + t.index ["curso_id"], name: "index_usuarios_on_curso_id" + t.index ["definicao_senha_token"], name: "index_usuarios_on_definicao_senha_token", unique: true + t.index ["departamento_id"], name: "index_usuarios_on_departamento_id" + t.index ["matricula"], name: "index_usuarios_on_matricula", unique: true + t.index ["redefinicao_senha_token"], name: "index_usuarios_on_redefinicao_senha_token", unique: true + end + + add_foreign_key "campo_forms", "elemento_forms" + add_foreign_key "campos", "elementos" + add_foreign_key "cursos", "departamentos" + add_foreign_key "disciplinas", "departamentos" + add_foreign_key "elemento_forms", "formularios" + add_foreign_key "elementos", "templates" + add_foreign_key "formularios", "turmas" + add_foreign_key "resposta_elems", "campo_forms" + add_foreign_key "resposta_elems", "elemento_forms" + add_foreign_key "resposta_elems", "resposta_forms" + add_foreign_key "resposta_forms", "formularios" + add_foreign_key "resposta_forms", "usuarios" + add_foreign_key "templates", "usuarios" + add_foreign_key "turmas", "disciplinas" + add_foreign_key "usuarios", "cursos" + add_foreign_key "usuarios", "departamentos" +end diff --git a/db/seeds.rb b/db/seeds.rb new file mode 100644 index 0000000000..9b33b22940 --- /dev/null +++ b/db/seeds.rb @@ -0,0 +1,271 @@ +# This file should ensure the existence of records required to run the application in every environment. +# The code here should be idempotent so that it can be executed at any point in every environment. + +# Departamentos +dept_cic = Departamento.find_or_create_by!(codigo: "CIC") do |d| + d.nome = "Ciência da Computação" +end + +dept_mat = Departamento.find_or_create_by!(codigo: "MAT") do |d| + d.nome = "Matemática" +end + +# Cursos +curso_cc = Curso.find_or_create_by!(codigo: "CC") do |c| + c.nome = "Bacharelado em Ciência da Computação" + c.departamento = dept_cic +end + +# Disciplinas +disc_ed = Disciplina.find_or_create_by!(codigo: "CIC0001") do |d| + d.nome = "Estrutura de Dados" + d.departamento = dept_cic +end + +disc_isc = Disciplina.find_or_create_by!(codigo: "CIC0002") do |d| + d.nome = "Introdução aos Sistemas de Computação" + d.departamento = dept_cic +end + +disc_apc = Disciplina.find_or_create_by!(codigo: "CIC0003") do |d| + d.nome = "Algoritmos e Programação de Computadores" + d.departamento = dept_cic +end + +# Turmas +turma_ed_a = Turma.find_or_create_by!(numero_da_turma: "A", semestre: "2026.1", disciplina: disc_ed) do |t| + t.horario = "35T23" +end + +turma_ed_b = Turma.find_or_create_by!(numero_da_turma: "B", semestre: "2026.1", disciplina: disc_ed) do |t| + t.horario = "35M23" +end + +# Introdução aos Sistemas de Computação - Turma A +turma_isc_a = Turma.find_or_create_by!(numero_da_turma: "A", semestre: "2026.1", disciplina: disc_isc) do |t| + t.horario = "24T23" +end + +# Usuários (Docente, Discente, Admin) +# A migration AjustaNulosParaSti permite que curso e departamento sejam nulos, +# mas vamos associá-los aos nossos testes para dados mais ricos. + +# Docentes +docente_1 = Docente.find_or_initialize_by(email: "docente1@teste.com") +docente_1.nome ||= "Professor de ED" +docente_1.matricula ||= "241000001" +docente_1.senha = "teste123" +docente_1.senha_confirmation = "teste123" +docente_1.departamento = dept_cic +docente_1.formacao = "doutorado" +docente_1.save! + +docente_2 = Docente.find_or_initialize_by(email: "docente2@teste.com") +docente_2.nome ||= "Professor de ISC" +docente_2.matricula ||= "241000011" +docente_2.senha = "teste123" +docente_2.senha_confirmation = "teste123" +docente_2.departamento = dept_cic +docente_2.formacao = "doutorado" +docente_2.save! + +docente_3 = Docente.find_or_initialize_by(email: "docente3@teste.com") +docente_3.nome ||= "Zequinha Banana" +docente_3.matricula ||= "241000069" +docente_3.senha = "teste123" +docente_3.senha_confirmation = "teste123" +docente_3.departamento = dept_cic +docente_3.formacao = "doutorado" +docente_3.save! + +# Admin +admin = Administrador.find_or_initialize_by(email: "admin@teste.com") +admin.nome ||= "Admin Teste" +admin.matricula ||= "240000003" +admin.senha = "teste123" +admin.senha_confirmation = "teste123" +admin.departamento = dept_cic +admin.save! + +# Discentes (Lista de novos alunos) +alunos_dados = [ + { email: "discente1@teste.com", nome: "Ana Silva", matricula: "241000002" }, + { email: "discente2@teste.com", nome: "Bruno Santos", matricula: "241000004" }, + { email: "discente3@teste.com", nome: "Carlos Oliveira", matricula: "241000005" }, + { email: "discente4@teste.com", nome: "Diana Costa", matricula: "241000006" }, + { email: "discente5@teste.com", nome: "Eduardo Ribeiro", matricula: "241000007" } +] + +alunos = alunos_dados.map do |dados| + aluno = Discente.find_or_initialize_by(email: dados[:email]) + aluno.nome ||= dados[:nome] + aluno.matricula ||= dados[:matricula] + aluno.senha = "teste123" + aluno.senha_confirmation = "teste123" + aluno.curso = curso_cc + aluno.save! + aluno +end +docente = Docente.find_or_initialize_by(email: "gusfring.a@gmail.com") +docente.nome ||= "GUS" +docente.matricula ||= "241000067" +docente.senha = "teste123" +docente.senha_confirmation = "teste123" +docente.departamento = dept_cic +docente.formacao = "doutorado" +docente.save! + +# ========================================== +# VINCULANDO USUÁRIOS ÀS TURMAS +# ========================================== + +# Professores nas turmas +docente_1.turmas << turma_ed_a unless docente_1.turmas.include?(turma_ed_a) +docente_1.turmas << turma_ed_b unless docente_1.turmas.include?(turma_ed_b) +docente_2.turmas << turma_isc_a unless docente_2.turmas.include?(turma_isc_a) +docente_3.turmas << turma_ed_a unless docente_3.turmas.include?(turma_ed_a) + +# Distribuindo alunos nas turmas para gerar variação de dados +# Turma ED A: Alunos 1, 2 e 3 +[ alunos[0], alunos[1], alunos[2] ].each do |aluno| + aluno.turmas << turma_ed_a unless aluno.turmas.include?(turma_ed_a) +end + +# Turma ED B: Alunos 3, 4 e 5 +[ alunos[2], alunos[3], alunos[4] ].each do |aluno| + aluno.turmas << turma_ed_b unless aluno.turmas.include?(turma_ed_b) +end + +# Turma ISC A: Alunos 1, 4 e 5 +[ alunos[0], alunos[4], alunos[3] ].each do |aluno| + aluno.turmas << turma_isc_a unless aluno.turmas.include?(turma_isc_a) +end + +# ========================================== +# TEMPLATES E ESTRUTURA BASE DE FORMULÁRIOS +# ========================================== +# Usamos find_or_initialize_by para evitar o salvamento imediato e não quebrar a validação +template = Template.find_or_initialize_by(nome: "Avaliação de Disciplina Padrão") + +if template.new_record? + template.administrador = admin + + # --------------------------------------------------------- + # Elemento 1: Múltipla Escolha (1 a 5) + # --------------------------------------------------------- + elemento_nota = template.elementos.build(enunciado: "Avalie a didática do professor", ordem: 1) + + (1..5).each do |valor| + elemento_nota.campos.build(enunciado: valor.to_s, ordem: valor, tipo_elemento: "Múltipla Escolha") + end + + # --------------------------------------------------------- + # Elemento 2: Múltipla Escolha (Dificuldade) + # --------------------------------------------------------- + elemento_opcoes = template.elementos.build(enunciado: "Como você avalia a dificuldade das listas de exercícios?", ordem: 2) + + [ "Muito Fácil", "Adequada", "Muito Difícil" ].each_with_index do |opcao, index| + elemento_opcoes.campos.build(enunciado: opcao, ordem: index + 1, tipo_elemento: "Múltipla Escolha") + end + + # --------------------------------------------------------- + # Elemento 3: Texto Livre + # --------------------------------------------------------- + elemento_texto = template.elementos.build(enunciado: "Deixe um comentário ou sugestão sobre a disciplina", ordem: 3) + + elemento_texto.campos.build(enunciado: nil, ordem: 1, tipo_elemento: "Texto") + + # Salva o bloco inteiro (Template + Elementos + Campos) de uma vez, satisfazendo a validação + template.save! +end + +# ========================================== +# FORMULÁRIOS DAS TURMAS E RESPOSTAS +# ========================================== + +# Método auxiliar corrigido para clonar TODOS os campos e associar a resposta ao campo correto +def configurar_formulario_e_respostas(turma, template_base, dados_alunos) + formulario = Formulario.find_or_create_by!(turma: turma) + + # 1. Clona todos os elementos e TODOS os seus respectivos campos para o formulário + template_base.elementos.order(:ordem).each do |elemento_base| + tipo_do_elemento = elemento_base.campos.first&.tipo_elemento || "Múltipla Escolha" + + ef = ElementoForm.find_or_create_by!(enunciado: elemento_base.enunciado, formulario: formulario) do |e| + e.ordem = elemento_base.ordem + e.tipo = tipo_do_elemento + end + + ef.update!(tipo: tipo_do_elemento) if ef.tipo.nil? + + next if tipo_do_elemento == "Texto" + + # Cria os campos (opções) apenas para elementos de múltipla escolha + elemento_base.campos.order(:ordem).each do |campo_base| + CampoForm.find_or_create_by!(enunciado: campo_base.enunciado, elemento_form: ef) do |c| + c.ordem = campo_base.ordem + end + end + end + + # 2. Cria as respostas baseadas nos dados fornecidos + dados_alunos.each do |dado| + aluno = dado[:aluno] + respostas = dado[:respostas] # Array com as strings das respostas na ordem das perguntas + + resposta_form = RespostaForm.find_or_create_by!(formulario: formulario, usuario: aluno) do |rf| + rf.data_submissao = Date.today + end + + # Itera sobre os elementos criados no formulário para salvar cada resposta + formulario.elemento_forms.order(:ordem).each_with_index do |ef, index| + texto_respondido = respostas[index].to_s + + # Busca o campo correspondente: + # - Se for Múltipla Escolha, acha o campo que tem o enunciado igual à opção marcada (ex: "5" ou "Adequada") + # - Se for Texto, pega o único campo disponível (onde o enunciado é nil) + cf = ef.campo_forms.find_by(enunciado: texto_respondido) || ef.campo_forms.first + + RespostaElem.find_or_create_by!(resposta_form: resposta_form, elemento_form: ef) do |re| + re.texto_resposta = texto_respondido + re.campo_form = cf + end + end + end +end + +# Configurando dados para Estrutura de Dados - Turma A +configurar_formulario_e_respostas( + turma_ed_a, + template, + [ + { aluno: alunos[0], respostas: [ "5", "Adequada", "Ótima didática, recomendo!" ] }, + { aluno: alunos[1], respostas: [ "4", "Muito Difícil", "As listas poderiam ter mais exemplos práticos." ] }, + { aluno: alunos[2], respostas: [ "5", "Adequada", "Sem reclamações, matéria excelente." ] } + ] +) + +# Configurando dados para Estrutura de Dados - Turma B +configurar_formulario_e_respostas( + turma_ed_b, + template, + [ + { aluno: alunos[2], respostas: [ "3", "Muito Difícil", "O ritmo das aulas está muito acelerado." ] }, + { aluno: alunos[3], respostas: [ "4", "Adequada", "Gostei da metodologia." ] }, + { aluno: alunos[4], respostas: [ "2", "Muito Difícil", "Preciso de mais monitoria para acompanhar." ] } + ] +) + +# Configurando dados para Introdução aos Sistemas de Computação - Turma A +configurar_formulario_e_respostas( + turma_isc_a, + template, + [ + { aluno: alunos[0], respostas: [ "5", "Muito Fácil", "Projetos práticos são muito divertidos!" ] }, + { aluno: alunos[4], respostas: [ "5", "Adequada", "O professor tira todas as dúvidas e os projetos ajudam muito." ] }, + { aluno: alunos[3], respostas: [ "4", "Adequada", "Gostaria de mais exercícios de fixação antes das provas." ] } + ] +) + +puts "Seeds finalizados com sucesso! Campos padronizados como Texto e Múltipla Escolha." +puts "Seeds finalizados com sucesso" diff --git a/doc/AddDefinicaoSenhaToUsuarios.html b/doc/AddDefinicaoSenhaToUsuarios.html new file mode 100644 index 0000000000..c3e1890495 --- /dev/null +++ b/doc/AddDefinicaoSenhaToUsuarios.html @@ -0,0 +1,1773 @@ + + + + + + + +class AddDefinicaoSenhaToUsuarios - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ + + + +

+ class AddDefinicaoSenhaToUsuarios +

+ +
+ +
+ + + + + +
+ + + + + + + + diff --git a/doc/AddRedefinicaoSenhaToUsuarios.html b/doc/AddRedefinicaoSenhaToUsuarios.html new file mode 100644 index 0000000000..2a1a281aef --- /dev/null +++ b/doc/AddRedefinicaoSenhaToUsuarios.html @@ -0,0 +1,1773 @@ + + + + + + + +class AddRedefinicaoSenhaToUsuarios - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ + + + +

+ class AddRedefinicaoSenhaToUsuarios +

+ +
+ +
+ + + + + +
+ + + + + + + + diff --git a/doc/AddTipoToElementoForms.html b/doc/AddTipoToElementoForms.html new file mode 100644 index 0000000000..921a5242a9 --- /dev/null +++ b/doc/AddTipoToElementoForms.html @@ -0,0 +1,1770 @@ + + + + + + + +class AddTipoToElementoForms - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ + + + +

+ class AddTipoToElementoForms +

+ +
+ +
+ + + + + +
+ + + + + + + + diff --git a/doc/AddTituloToFormulariosAndMakeTurmaOptional.html b/doc/AddTituloToFormulariosAndMakeTurmaOptional.html new file mode 100644 index 0000000000..d482d0617d --- /dev/null +++ b/doc/AddTituloToFormulariosAndMakeTurmaOptional.html @@ -0,0 +1,1771 @@ + + + + + + + +class AddTituloToFormulariosAndMakeTurmaOptional - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ + + + +

+ class AddTituloToFormulariosAndMakeTurmaOptional +

+ +
+ +
+ + + + + +
+ + + + + + + + diff --git a/doc/AddUsuarioToTemplates.html b/doc/AddUsuarioToTemplates.html new file mode 100644 index 0000000000..f1c14bcb0d --- /dev/null +++ b/doc/AddUsuarioToTemplates.html @@ -0,0 +1,1770 @@ + + + + + + + +class AddUsuarioToTemplates - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ + + + +

+ class AddUsuarioToTemplates +

+ +
+ +
+ + + + + +
+ + + + + + + + diff --git a/doc/AdminAutenticavel.html b/doc/AdminAutenticavel.html new file mode 100644 index 0000000000..b6d87e447e --- /dev/null +++ b/doc/AdminAutenticavel.html @@ -0,0 +1,1706 @@ + + + + + + + +module AdminAutenticavel - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ + + + +

+ module AdminAutenticavel +

+ +
+ +

Verifica e disponibiliza o administrador autenticado referenciado pela rota.

+ +

Redireciona para a página inicial com alerta se o administrador da rota for diferente do usuário autenticado na sessão.

+ +
+ + + + + +
+ + + + + + + + diff --git a/doc/AdminController.html b/doc/AdminController.html new file mode 100644 index 0000000000..d9a6f01d95 --- /dev/null +++ b/doc/AdminController.html @@ -0,0 +1,2077 @@ + + + + + + + +class AdminController - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ + + + +

+ class AdminController +

+ +
+ +

Gerencia as funcionalidades exclusivas do administrador do sistema.

+ +

Agrupa as ações restritas ao perfil Administrador: visualização e exportação de avaliações, envio de formulários a turmas a partir de templates, tela de gerenciamento geral e sincronização de dados com o SIGAA (importação e atualização via arquivos JSON). Utiliza o layout “gerenciamento” e valida que o administrador autenticado acessa apenas as suas próprias páginas.

+ +
+ + + + + +
+ + + + + + + + diff --git a/doc/AdminHelper.html b/doc/AdminHelper.html new file mode 100644 index 0000000000..e99ec973da --- /dev/null +++ b/doc/AdminHelper.html @@ -0,0 +1,1686 @@ + + + + + + + +module AdminHelper - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ + + + +

+ module AdminHelper +

+ +
+ +
+ + + + + +
+ + + + + + + + diff --git a/doc/Administrador.html b/doc/Administrador.html new file mode 100644 index 0000000000..bd74023547 --- /dev/null +++ b/doc/Administrador.html @@ -0,0 +1,1699 @@ + + + + + + + +class Administrador - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ + + + +

+ class Administrador +

+ +
+ +

Representa um usuário com perfil de administrador do sistema.

+ +

Herda de Usuario e adiciona a obrigatoriedade de estar vinculado a um Departamento. Possui acesso exclusivo às funcionalidades de gerenciamento, envio de formulários e sincronização com o SIGAA, além de poder criar e gerenciar +Template+s de avaliação.

+ +
+ + + + + +
+ + + + + + + + diff --git a/doc/AjustaNulosParaSti.html b/doc/AjustaNulosParaSti.html new file mode 100644 index 0000000000..4df2f7c225 --- /dev/null +++ b/doc/AjustaNulosParaSti.html @@ -0,0 +1,1772 @@ + + + + + + + +class AjustaNulosParaSti - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ + + + +

+ class AjustaNulosParaSti +

+ +
+ +
+ + + + + +
+ + + + + + + + diff --git a/doc/ApplicationController.html b/doc/ApplicationController.html new file mode 100644 index 0000000000..0cb52a8d48 --- /dev/null +++ b/doc/ApplicationController.html @@ -0,0 +1,1866 @@ + + + + + + + +class ApplicationController - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ + + + +

+ class ApplicationController +

+ +
+ +

Controller base da aplicação do qual todos os demais controllers herdam.

+ +

Define os helpers e filtros de autenticação e autorização compartilhados: current_user (disponível nas views via helper_method), require_login (exige sessão ativa) e require_admin (exige perfil de administrador).

+ +
+ + + + + +
+ + + + + + + + diff --git a/doc/ApplicationHelper.html b/doc/ApplicationHelper.html new file mode 100644 index 0000000000..29b3c48ce3 --- /dev/null +++ b/doc/ApplicationHelper.html @@ -0,0 +1,1769 @@ + + + + + + + +module ApplicationHelper - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ + + + +

+ module ApplicationHelper +

+ +
+ +
+ + + + + +
+ + + + + + + + diff --git a/doc/ApplicationJob.html b/doc/ApplicationJob.html new file mode 100644 index 0000000000..8bcaf0e471 --- /dev/null +++ b/doc/ApplicationJob.html @@ -0,0 +1,1701 @@ + + + + + + + +class ApplicationJob - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ + + + +

+ class ApplicationJob +

+ +
+ +
+ + + + + +
+ + + + + + + + diff --git a/doc/ApplicationMailer.html b/doc/ApplicationMailer.html new file mode 100644 index 0000000000..1aefc44e9f --- /dev/null +++ b/doc/ApplicationMailer.html @@ -0,0 +1,1701 @@ + + + + + + + +class ApplicationMailer - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ + + + +

+ class ApplicationMailer +

+ +
+ +
+ + + + + +
+ + + + + + + + diff --git a/doc/ApplicationRecord.html b/doc/ApplicationRecord.html new file mode 100644 index 0000000000..54a4b50803 --- /dev/null +++ b/doc/ApplicationRecord.html @@ -0,0 +1,1701 @@ + + + + + + + +class ApplicationRecord - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ + + + +

+ class ApplicationRecord +

+ +
+ +
+ + + + + +
+ + + + + + + + diff --git a/doc/Camaar.html b/doc/Camaar.html new file mode 100644 index 0000000000..c19ec64742 --- /dev/null +++ b/doc/Camaar.html @@ -0,0 +1,1686 @@ + + + + + + + +module Camaar - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ + + + +

+ module Camaar +

+ +
+ +
+ + + + + +
+ + + + + + + + diff --git a/doc/Camaar/Application.html b/doc/Camaar/Application.html new file mode 100644 index 0000000000..d21c7554a0 --- /dev/null +++ b/doc/Camaar/Application.html @@ -0,0 +1,1717 @@ + + + + + + + +class Camaar::Application - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ + + + + + +

+ class Camaar::Application +

+ +
+ +
+ + + + + +
+ + + + + + + + diff --git a/doc/Campo.html b/doc/Campo.html new file mode 100644 index 0000000000..817edd1b65 --- /dev/null +++ b/doc/Campo.html @@ -0,0 +1,1699 @@ + + + + + + + +class Campo - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ + + + +

+ class Campo +

+ +
+ +

Representa uma opção de resposta ou configuração de tipo dentro de um Elemento.

+ +

Cada campo pertence a um Elemento de template e define o tipo_elemento (“Texto”, “Múltipla Escolha”, etc.) e o enunciado da opção. A ordem é única dentro do escopo do elemento pai.

+ +
+ + + + + +
+ + + + + + + + diff --git a/doc/CampoForm.html b/doc/CampoForm.html new file mode 100644 index 0000000000..241fe2271f --- /dev/null +++ b/doc/CampoForm.html @@ -0,0 +1,1699 @@ + + + + + + + +class CampoForm - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ + + + +

+ class CampoForm +

+ +
+ +

Representa uma opção de resposta instanciada em um ElementoForm.

+ +

É criado a partir de um Campo de template no momento em que o formulário é enviado a uma turma. Quando um usuário seleciona esta opção, um RespostaElem é criado referenciando este campo.

+ +
+ + + + + +
+ + + + + + + + diff --git a/doc/CampoFormsController.html b/doc/CampoFormsController.html new file mode 100644 index 0000000000..8fc555f5a0 --- /dev/null +++ b/doc/CampoFormsController.html @@ -0,0 +1,2071 @@ + + + + + + + +class CampoFormsController - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ + + + +

+ class CampoFormsController +

+ +
+ +

Gerencia o CRUD de campos instanciados em elementos de formulários de avaliação.

+ +

CampoForm é a representação de uma opção de resposta dentro de um ElementoForm concreto, criada a partir de um Campo de template no momento do envio da avaliação. Este controller expõe as operações individuais de CRUD sobre essas instâncias.

+ +
+ + + + + +
+ + + + + + + + diff --git a/doc/CampoFormsHelper.html b/doc/CampoFormsHelper.html new file mode 100644 index 0000000000..247c71c4f2 --- /dev/null +++ b/doc/CampoFormsHelper.html @@ -0,0 +1,1686 @@ + + + + + + + +module CampoFormsHelper - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ + + + +

+ module CampoFormsHelper +

+ +
+ +
+ + + + + +
+ + + + + + + + diff --git a/doc/CamposController.html b/doc/CamposController.html new file mode 100644 index 0000000000..e24159d14a --- /dev/null +++ b/doc/CamposController.html @@ -0,0 +1,2071 @@ + + + + + + + +class CamposController - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ + + + +

+ class CamposController +

+ +
+ +

Gerencia o CRUD de campos (opções de resposta) de elementos de template.

+ +

Campos definem as opções disponíveis para resposta em um elemento, bem como o tipo da questão (texto livre, múltipla escolha etc.). Normalmente são gerenciados via nested attributes no TemplatesController; este controller expõe as operações individuais de CRUD.

+ +
+ + + + + +
+ + + + + + + + diff --git a/doc/CamposHelper.html b/doc/CamposHelper.html new file mode 100644 index 0000000000..949a810d8e --- /dev/null +++ b/doc/CamposHelper.html @@ -0,0 +1,1686 @@ + + + + + + + +module CamposHelper - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ + + + +

+ module CamposHelper +

+ +
+ +
+ + + + + +
+ + + + + + + + diff --git a/doc/CreateCampoForms.html b/doc/CreateCampoForms.html new file mode 100644 index 0000000000..5c8287f9e1 --- /dev/null +++ b/doc/CreateCampoForms.html @@ -0,0 +1,1776 @@ + + + + + + + +class CreateCampoForms - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ + + + +

+ class CreateCampoForms +

+ +
+ +
+ + + + + +
+ + + + + + + + diff --git a/doc/CreateCampos.html b/doc/CreateCampos.html new file mode 100644 index 0000000000..2bfccaad3c --- /dev/null +++ b/doc/CreateCampos.html @@ -0,0 +1,1777 @@ + + + + + + + +class CreateCampos - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ + + + +

+ class CreateCampos +

+ +
+ +
+ + + + + +
+ + + + + + + + diff --git a/doc/CreateCursos.html b/doc/CreateCursos.html new file mode 100644 index 0000000000..916927e928 --- /dev/null +++ b/doc/CreateCursos.html @@ -0,0 +1,1777 @@ + + + + + + + +class CreateCursos - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ + + + +

+ class CreateCursos +

+ +
+ +
+ + + + + +
+ + + + + + + + diff --git a/doc/CreateDepartamentos.html b/doc/CreateDepartamentos.html new file mode 100644 index 0000000000..ea9454572b --- /dev/null +++ b/doc/CreateDepartamentos.html @@ -0,0 +1,1776 @@ + + + + + + + +class CreateDepartamentos - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ + + + +

+ class CreateDepartamentos +

+ +
+ +
+ + + + + +
+ + + + + + + + diff --git a/doc/CreateDisciplinas.html b/doc/CreateDisciplinas.html new file mode 100644 index 0000000000..61b6c01f2f --- /dev/null +++ b/doc/CreateDisciplinas.html @@ -0,0 +1,1777 @@ + + + + + + + +class CreateDisciplinas - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ + + + +

+ class CreateDisciplinas +

+ +
+ +
+ + + + + +
+ + + + + + + + diff --git a/doc/CreateElementoForms.html b/doc/CreateElementoForms.html new file mode 100644 index 0000000000..a47baf247b --- /dev/null +++ b/doc/CreateElementoForms.html @@ -0,0 +1,1776 @@ + + + + + + + +class CreateElementoForms - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ + + + +

+ class CreateElementoForms +

+ +
+ +
+ + + + + +
+ + + + + + + + diff --git a/doc/CreateElementos.html b/doc/CreateElementos.html new file mode 100644 index 0000000000..0ef413081e --- /dev/null +++ b/doc/CreateElementos.html @@ -0,0 +1,1776 @@ + + + + + + + +class CreateElementos - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ + + + +

+ class CreateElementos +

+ +
+ +
+ + + + + +
+ + + + + + + + diff --git a/doc/CreateFormularios.html b/doc/CreateFormularios.html new file mode 100644 index 0000000000..0e92d41202 --- /dev/null +++ b/doc/CreateFormularios.html @@ -0,0 +1,1774 @@ + + + + + + + +class CreateFormularios - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ + + + +

+ class CreateFormularios +

+ +
+ +
+ + + + + +
+ + + + + + + + diff --git a/doc/CreateJoinTableDiscenteTurma.html b/doc/CreateJoinTableDiscenteTurma.html new file mode 100644 index 0000000000..f33f931d9f --- /dev/null +++ b/doc/CreateJoinTableDiscenteTurma.html @@ -0,0 +1,1773 @@ + + + + + + + +class CreateJoinTableDiscenteTurma - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ + + + +

+ class CreateJoinTableDiscenteTurma +

+ +
+ +
+ + + + + +
+ + + + + + + + diff --git a/doc/CreateJoinTableDocenteTurma.html b/doc/CreateJoinTableDocenteTurma.html new file mode 100644 index 0000000000..7e6ff91254 --- /dev/null +++ b/doc/CreateJoinTableDocenteTurma.html @@ -0,0 +1,1773 @@ + + + + + + + +class CreateJoinTableDocenteTurma - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ + + + +

+ class CreateJoinTableDocenteTurma +

+ +
+ +
+ + + + + +
+ + + + + + + + diff --git a/doc/CreateRespostaElems.html b/doc/CreateRespostaElems.html new file mode 100644 index 0000000000..e2a190b703 --- /dev/null +++ b/doc/CreateRespostaElems.html @@ -0,0 +1,1777 @@ + + + + + + + +class CreateRespostaElems - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ + + + +

+ class CreateRespostaElems +

+ +
+ +
+ + + + + +
+ + + + + + + + diff --git a/doc/CreateRespostaForms.html b/doc/CreateRespostaForms.html new file mode 100644 index 0000000000..cba8dcc617 --- /dev/null +++ b/doc/CreateRespostaForms.html @@ -0,0 +1,1776 @@ + + + + + + + +class CreateRespostaForms - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ + + + +

+ class CreateRespostaForms +

+ +
+ +
+ + + + + +
+ + + + + + + + diff --git a/doc/CreateTemplates.html b/doc/CreateTemplates.html new file mode 100644 index 0000000000..19a6d5f148 --- /dev/null +++ b/doc/CreateTemplates.html @@ -0,0 +1,1774 @@ + + + + + + + +class CreateTemplates - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ + + + +

+ class CreateTemplates +

+ +
+ +
+ + + + + +
+ + + + + + + + diff --git a/doc/CreateTurmas.html b/doc/CreateTurmas.html new file mode 100644 index 0000000000..40375555a9 --- /dev/null +++ b/doc/CreateTurmas.html @@ -0,0 +1,1777 @@ + + + + + + + +class CreateTurmas - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ + + + +

+ class CreateTurmas +

+ +
+ +
+ + + + + +
+ + + + + + + + diff --git a/doc/CreateUsuarios.html b/doc/CreateUsuarios.html new file mode 100644 index 0000000000..ff751146a6 --- /dev/null +++ b/doc/CreateUsuarios.html @@ -0,0 +1,1782 @@ + + + + + + + +class CreateUsuarios - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ + + + +

+ class CreateUsuarios +

+ +
+ +
+ + + + + +
+ + + + + + + + diff --git a/doc/Curso.html b/doc/Curso.html new file mode 100644 index 0000000000..55f2848556 --- /dev/null +++ b/doc/Curso.html @@ -0,0 +1,1699 @@ + + + + + + + +class Curso - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ + + + +

+ class Curso +

+ +
+ +

Representa um curso de graduação ou pós-graduação.

+ +

Pertence a um Departamento e agrega os +Discente+s nele matriculados. Identificado de forma única pelo atributo codigo.

+ +
+ + + + + +
+ + + + + + + + diff --git a/doc/CursosController.html b/doc/CursosController.html new file mode 100644 index 0000000000..c743dd8aee --- /dev/null +++ b/doc/CursosController.html @@ -0,0 +1,2071 @@ + + + + + + + +class CursosController - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ + + + +

+ class CursosController +

+ +
+ +

Gerencia o CRUD de cursos de graduação e pós-graduação.

+ +

Cursos pertencem a um Departamento e agrupam +Discente+s. Normalmente são criados automaticamente durante a sincronização com o SIGAA; este controller expõe as operações individuais de CRUD para manutenção manual dos registros.

+ +
+ + + + + +
+ + + + + + + + diff --git a/doc/CursosHelper.html b/doc/CursosHelper.html new file mode 100644 index 0000000000..1c5cf0b659 --- /dev/null +++ b/doc/CursosHelper.html @@ -0,0 +1,1686 @@ + + + + + + + +module CursosHelper - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ + + + +

+ module CursosHelper +

+ +
+ +
+ + + + + +
+ + + + + + + + diff --git a/doc/DefinicaoSenhasController.html b/doc/DefinicaoSenhasController.html new file mode 100644 index 0000000000..d6f79bf81f --- /dev/null +++ b/doc/DefinicaoSenhasController.html @@ -0,0 +1,1838 @@ + + + + + + + +class DefinicaoSenhasController - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ + + + +

+ class DefinicaoSenhasController +

+ +
+ +

Gerencia o fluxo de definição de senha inicial para novos usuários.

+ +

Novos usuários recebem um email com um link contendo um token único. Este controller valida o token, exibe o formulário de definição de senha e persiste a nova senha quando as validações são satisfeitas. Após a definição bem-sucedida, o token é invalidado para evitar reutilização.

+ +
+ + + + + +
+ + + + + + + + diff --git a/doc/Departamento.html b/doc/Departamento.html new file mode 100644 index 0000000000..1b67ee481e --- /dev/null +++ b/doc/Departamento.html @@ -0,0 +1,1699 @@ + + + + + + + +class Departamento - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ + + + +

+ class Departamento +

+ +
+ +

Representa um departamento acadêmico da instituição.

+ +

Agrupa +Curso+s, +Disciplina+s e +Administrador+es. Não pode ser excluído enquanto houver cursos ou disciplinas vinculados (restrict_with_error). Identificado de forma única pelo atributo codigo.

+ +
+ + + + + +
+ + + + + + + + diff --git a/doc/DepartamentosController.html b/doc/DepartamentosController.html new file mode 100644 index 0000000000..8131846fb1 --- /dev/null +++ b/doc/DepartamentosController.html @@ -0,0 +1,2071 @@ + + + + + + + +class DepartamentosController - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ + + + +

+ class DepartamentosController +

+ +
+ +

Gerencia o CRUD de departamentos acadêmicos da instituição.

+ +

Departamentos agrupam +Curso+s, +Disciplina+s e +Administrador+es. Não podem ser excluídos enquanto possuírem cursos ou disciplinas vinculados. Normalmente são criados durante a sincronização com o SIGAA; este controller expõe as operações individuais de CRUD para manutenção manual dos registros.

+ +
+ + + + + +
+ + + + + + + + diff --git a/doc/DepartamentosHelper.html b/doc/DepartamentosHelper.html new file mode 100644 index 0000000000..d1f15dde67 --- /dev/null +++ b/doc/DepartamentosHelper.html @@ -0,0 +1,1686 @@ + + + + + + + +module DepartamentosHelper - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ + + + +

+ module DepartamentosHelper +

+ +
+ +
+ + + + + +
+ + + + + + + + diff --git a/doc/Discente.html b/doc/Discente.html new file mode 100644 index 0000000000..7fe2c85300 --- /dev/null +++ b/doc/Discente.html @@ -0,0 +1,1699 @@ + + + + + + + +class Discente - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ + + + +

+ class Discente +

+ +
+ +

Representa um estudante (aluno) cadastrado no sistema.

+ +

Herda de Usuario e obrigatoriamente pertence a um Curso. Pode estar matriculado em múltiplas +Turma+s, nas quais receberá formulários de avaliação para responder.

+ +
+ + + + + +
+ + + + + + + + diff --git a/doc/DiscentesController.html b/doc/DiscentesController.html new file mode 100644 index 0000000000..cd9052fea1 --- /dev/null +++ b/doc/DiscentesController.html @@ -0,0 +1,2071 @@ + + + + + + + +class DiscentesController - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ + + + +

+ class DiscentesController +

+ +
+ +

Gerencia o CRUD de discentes (alunos) cadastrados no sistema.

+ +

Discentes são usuários com perfil de aluno, vinculados a um Curso e a uma ou mais +Turma+s. Normalmente são importados via +AdminController#sincronizar_sigaa+; este controller expõe as operações individuais de CRUD para manutenção manual dos registros.

+ +
+ + + + + +
+ + + + + + + + diff --git a/doc/DiscentesHelper.html b/doc/DiscentesHelper.html new file mode 100644 index 0000000000..7df45fbbce --- /dev/null +++ b/doc/DiscentesHelper.html @@ -0,0 +1,1686 @@ + + + + + + + +module DiscentesHelper - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ + + + +

+ module DiscentesHelper +

+ +
+ +
+ + + + + +
+ + + + + + + + diff --git a/doc/Disciplina.html b/doc/Disciplina.html new file mode 100644 index 0000000000..7547fc0c47 --- /dev/null +++ b/doc/Disciplina.html @@ -0,0 +1,1699 @@ + + + + + + + +class Disciplina - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ + + + +

+ class Disciplina +

+ +
+ +

Representa uma disciplina ofertada por um Departamento.

+ +

Pode ter múltiplas +Turma+s associadas (uma por semestre/oferta). Identificada de forma única pelo atributo codigo, que corresponde ao código do SIGAA.

+ +
+ + + + + +
+ + + + + + + + diff --git a/doc/DisciplinasController.html b/doc/DisciplinasController.html new file mode 100644 index 0000000000..1dc4ef5ed0 --- /dev/null +++ b/doc/DisciplinasController.html @@ -0,0 +1,2071 @@ + + + + + + + +class DisciplinasController - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ + + + +

+ class DisciplinasController +

+ +
+ +

Gerencia o CRUD de disciplinas ofertadas pelos departamentos.

+ +

Disciplinas pertencem a um Departamento e possuem múltiplas +Turma+s (uma por semestre/oferta). Normalmente são importadas via sincronização com o SIGAA; este controller expõe as operações individuais de CRUD para manutenção manual dos registros.

+ +
+ + + + + +
+ + + + + + + + diff --git a/doc/DisciplinasHelper.html b/doc/DisciplinasHelper.html new file mode 100644 index 0000000000..3a889819e9 --- /dev/null +++ b/doc/DisciplinasHelper.html @@ -0,0 +1,1686 @@ + + + + + + + +module DisciplinasHelper - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ + + + +

+ module DisciplinasHelper +

+ +
+ +
+ + + + + +
+ + + + + + + + diff --git a/doc/Docente.html b/doc/Docente.html new file mode 100644 index 0000000000..0872e9cbbf --- /dev/null +++ b/doc/Docente.html @@ -0,0 +1,1699 @@ + + + + + + + +class Docente - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ + + + +

+ class Docente +

+ +
+ +

Representa um professor vinculado a uma ou mais turmas.

+ +

Herda de Usuario e exige que o atributo formacao esteja preenchido. Pode estar associado a múltiplas +Turma+s e é alvo das avaliações respondidas pelos discentes via Formulario.

+ +
+ + + + + +
+ + + + + + + + diff --git a/doc/DocentesController.html b/doc/DocentesController.html new file mode 100644 index 0000000000..8229cb9fcb --- /dev/null +++ b/doc/DocentesController.html @@ -0,0 +1,2071 @@ + + + + + + + +class DocentesController - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ + + + +

+ class DocentesController +

+ +
+ +

Gerencia o CRUD de docentes (professores) cadastrados no sistema.

+ +

Docentes são usuários com perfil de professor, vinculados a uma ou mais +Turma+s e a um Departamento. Normalmente são importados via +AdminController#sincronizar_sigaa+; este controller expõe as operações individuais de CRUD para manutenção manual dos registros.

+ +
+ + + + + +
+ + + + + + + + diff --git a/doc/DocentesHelper.html b/doc/DocentesHelper.html new file mode 100644 index 0000000000..e732ee2ce4 --- /dev/null +++ b/doc/DocentesHelper.html @@ -0,0 +1,1686 @@ + + + + + + + +module DocentesHelper - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ + + + +

+ module DocentesHelper +

+ +
+ +
+ + + + + +
+ + + + + + + + diff --git a/doc/Dockerfile.html b/doc/Dockerfile.html new file mode 100644 index 0000000000..bd25c348e3 --- /dev/null +++ b/doc/Dockerfile.html @@ -0,0 +1,1686 @@ + + + + + + + +Dockerfile - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

# syntax=docker/dockerfile:1 # check=error=true

+ +

# This Dockerfile is designed for production, not development. Use with Kamal or build’n’run by hand: # docker build -t camaar . # docker run -d -p 80:80 -e RAILS_MASTER_KEY=<value from config/master.key> –name camaar camaar

+ +

# For a containerized dev environment, see Dev Containers: guides.rubyonrails.org/getting_started_with_devcontainer.html

+ +

# Make sure RUBY_VERSION matches the Ruby version in .ruby-version ARG RUBY_VERSION=4.0.2 FROM docker.io/library/ruby:$RUBY_VERSION-slim AS base

+ +

# Rails app lives here WORKDIR /rails

+ +

# Install base packages RUN apt-get update -qq && \

+ +
apt-get install --no-install-recommends -y curl default-mysql-client libjemalloc2 libvips && \
+ln -s /usr/lib/$(uname -m)-linux-gnu/libjemalloc.so.2 /usr/local/lib/libjemalloc.so && \
+rm -rf /var/lib/apt/lists /var/cache/apt/archives
+ +

# Set production environment variables and enable jemalloc for reduced memory usage and latency. ENV RAILS_ENV=“production” \

+ +
BUNDLE_DEPLOYMENT="1" \
+BUNDLE_PATH="/usr/local/bundle" \
+BUNDLE_WITHOUT="development" \
+LD_PRELOAD="/usr/local/lib/libjemalloc.so"
+ +

# Throw-away build stage to reduce size of final image FROM base AS build

+ +

# Install packages needed to build gems RUN apt-get update -qq && \

+ +
apt-get install --no-install-recommends -y build-essential default-libmysqlclient-dev git libvips libyaml-dev pkg-config && \
+rm -rf /var/lib/apt/lists /var/cache/apt/archives
+ +

# Install application gems COPY vendor/* ./vendor/ COPY Gemfile Gemfile.lock ./

+ +

RUN bundle install && \

+ +
rm -rf ~/.bundle/ "${BUNDLE_PATH}"/ruby/*/cache "${BUNDLE_PATH}"/ruby/*/bundler/gems/*/.git && \
+# -j 1 disable parallel compilation to avoid a QEMU bug: https://github.com/rails/bootsnap/issues/495
+bundle exec bootsnap precompile -j 1 --gemfile
+ +

# Copy application code COPY . .

+ +

# Precompile bootsnap code for faster boot times. # -j 1 disable parallel compilation to avoid a QEMU bug: github.com/rails/bootsnap/issues/495 RUN bundle exec bootsnap precompile -j 1 app/ lib/

+ +

# Precompiling assets for production without requiring secret RAILS_MASTER_KEY RUN SECRET_KEY_BASE_DUMMY=1 ./bin/rails assets:precompile

+ +

# Final stage for app image FROM base

+ +

# Run and own only the runtime files as a non-root user for security RUN groupadd –system –gid 1000 rails && \

+ +
useradd rails --uid 1000 --gid 1000 --create-home --shell /bin/bash
+ +

USER 1000:1000

+ +

# Copy built artifacts: gems, application COPY –chown=rails:rails –from=build “${BUNDLE_PATH}” “${BUNDLE_PATH}” COPY –chown=rails:rails –from=build /rails /rails

+ +

# Entrypoint prepares the database. ENTRYPOINT [“/rails/bin/docker-entrypoint”]

+ +

# Start server via Thruster by default, this can be overwritten at runtime EXPOSE 80 CMD [“./bin/thrust”, “./bin/rails”, “server”]

+ +
+ + + + + + + + diff --git a/doc/Elemento.html b/doc/Elemento.html new file mode 100644 index 0000000000..ba7a28fa20 --- /dev/null +++ b/doc/Elemento.html @@ -0,0 +1,1699 @@ + + + + + + + +class Elemento - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ + + + +

+ class Elemento +

+ +
+ +

Representa uma questão dentro de um Template de avaliação.

+ +

Contém um enunciado e uma ordem de exibição, além de possuir múltiplos +Campo+s que definem as opções de resposta (para questões de múltipla escolha) ou configuram o tipo da questão.

+ +
+ + + + + +
+ + + + + + + + diff --git a/doc/ElementoForm.html b/doc/ElementoForm.html new file mode 100644 index 0000000000..319316b9de --- /dev/null +++ b/doc/ElementoForm.html @@ -0,0 +1,1699 @@ + + + + + + + +class ElementoForm - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ + + + +

+ class ElementoForm +

+ +
+ +

Representa uma questão instanciada em um Formulario de avaliação.

+ +

É criado a partir de um Elemento de template no momento em que o formulário é enviado a uma turma. Contém o enunciado e o tipo da questão, e agrupa os +CampoForm+s com as opções de resposta disponíveis.

+ +
+ + + + + +
+ + + + + + + + diff --git a/doc/ElementoFormsController.html b/doc/ElementoFormsController.html new file mode 100644 index 0000000000..ff634653b7 --- /dev/null +++ b/doc/ElementoFormsController.html @@ -0,0 +1,2071 @@ + + + + + + + +class ElementoFormsController - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ + + + +

+ class ElementoFormsController +

+ +
+ +

Gerencia o CRUD de elementos instanciados em formulários de avaliação.

+ +

ElementoForm é a representação de uma questão dentro de um Formulario concreto, criada a partir de um Elemento de template no momento do envio da avaliação. Este controller expõe as operações individuais de CRUD sobre essas instâncias.

+ +
+ + + + + +
+ + + + + + + + diff --git a/doc/ElementoFormsHelper.html b/doc/ElementoFormsHelper.html new file mode 100644 index 0000000000..261082024b --- /dev/null +++ b/doc/ElementoFormsHelper.html @@ -0,0 +1,1686 @@ + + + + + + + +module ElementoFormsHelper - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ + + + +

+ module ElementoFormsHelper +

+ +
+ +
+ + + + + +
+ + + + + + + + diff --git a/doc/ElementosController.html b/doc/ElementosController.html new file mode 100644 index 0000000000..ba5624a9dc --- /dev/null +++ b/doc/ElementosController.html @@ -0,0 +1,2071 @@ + + + + + + + +class ElementosController - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ + + + +

+ class ElementosController +

+ +
+ +

Gerencia o CRUD de elementos (questões) de templates de avaliação.

+ +

Elementos são as questões que compõem um template. Normalmente são criados e editados de forma encadeada via nested attributes no TemplatesController; este controller expõe as operações individuais de CRUD para cada elemento.

+ +
+ + + + + +
+ + + + + + + + diff --git a/doc/ElementosHelper.html b/doc/ElementosHelper.html new file mode 100644 index 0000000000..a93a27a236 --- /dev/null +++ b/doc/ElementosHelper.html @@ -0,0 +1,1686 @@ + + + + + + + +module ElementosHelper - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ + + + +

+ module ElementosHelper +

+ +
+ +
+ + + + + +
+ + + + + + + + diff --git a/doc/Formulario.html b/doc/Formulario.html new file mode 100644 index 0000000000..91a97b9d1c --- /dev/null +++ b/doc/Formulario.html @@ -0,0 +1,1699 @@ + + + + + + + +class Formulario - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ + + + +

+ class Formulario +

+ +
+ +

Representa um formulário de avaliação enviado a uma turma.

+ +

É criado a partir de um Template e associado a uma Turma. Contém os +ElementoForm+s (questões) que os usuários respondem, e agrega as +RespostaForm+s submetidas pelos participantes.

+ +
+ + + + + +
+ + + + + + + + diff --git a/doc/FormulariosController.html b/doc/FormulariosController.html new file mode 100644 index 0000000000..bce43de46f --- /dev/null +++ b/doc/FormulariosController.html @@ -0,0 +1,2071 @@ + + + + + + + +class FormulariosController - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ + + + +

+ class FormulariosController +

+ +
+ +

Gerencia o CRUD de formulários de avaliação.

+ +

Formulários são instâncias de avaliação enviadas a turmas específicas, geradas a partir de templates pelo AdminController. Este controller oferece as operações básicas de listagem, visualização, criação, edição e exclusão de formulários.

+ +
+ + + + + +
+ + + + + + + + diff --git a/doc/FormulariosHelper.html b/doc/FormulariosHelper.html new file mode 100644 index 0000000000..748017b963 --- /dev/null +++ b/doc/FormulariosHelper.html @@ -0,0 +1,1686 @@ + + + + + + + +module FormulariosHelper - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ + + + +

+ module FormulariosHelper +

+ +
+ +
+ + + + + +
+ + + + + + + + diff --git a/doc/Gemfile.html b/doc/Gemfile.html new file mode 100644 index 0000000000..a78558f13f --- /dev/null +++ b/doc/Gemfile.html @@ -0,0 +1,1694 @@ + + + + + + + +Gemfile - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

source “rubygems.org

+ +

# Bundle edge Rails instead: gem “rails”, github: “rails/rails”, branch: “main” gem “rails”, “~> 8.1.3” # The modern asset pipeline for Rails [github.com/rails/propshaft] gem “propshaft” # Use mysql as the database for Active Record gem “mysql2”, “~> 0.5” # Use the Puma web server [github.com/puma/puma] gem “puma”, “>= 5.0” # Use JavaScript with ESM import maps [github.com/rails/importmap-rails] gem “importmap-rails” # Hotwire’s SPA-like page accelerator [turbo.hotwired.dev] gem “turbo-rails” # Hotwire’s modest JavaScript framework [stimulus.hotwired.dev] gem “stimulus-rails” # Build JSON APIs with ease [github.com/rails/jbuilder] gem “jbuilder”

+ +

gem “rdoc”, “>= 6.3.1”

+ +

# Use Active Model has_secure_password [guides.rubyonrails.org/active_model_basics.html#securepassword] gem “bcrypt”, “~> 3.1.7”

+ +

# Windows does not include zoneinfo files, so bundle the tzinfo-data gem gem “tzinfo-data”, platforms: %i[ windows jruby ]

+ +

# Use the database-backed adapters for Rails.cache, Active Job, and Action Cable gem “solid_cache” gem “solid_queue” gem “solid_cable”

+ +

# Reduces boot times through caching; required in config/boot.rb gem “bootsnap”, require: false

+ +

gem “csv”

+ +

# Deploy this application anywhere as a Docker container [kamal-deploy.org] gem “kamal”, require: false

+ +

# Add HTTP asset caching/compression and X-Sendfile acceleration to Puma [github.com/basecamp/thruster/] gem “thruster”, require: false

+ +

# Use Active Storage variants [guides.rubyonrails.org/active_storage_overview.html#transforming-images] gem “image_processing”, “~> 1.2”

+ +

group :development, :test do

+ +
# See https://guides.rubyonrails.org/debugging_rails_applications.html#debugging-with-the-debug-gem
+gem "debug", platforms: %i[ mri windows ], require: "debug/prelude"
+
+# Load environment variables from .env file
+gem "dotenv-rails"
+
+# Audits gems for known security defects (use config/bundler-audit.yml to ignore issues)
+gem "bundler-audit", require: false
+
+# Static analysis for security vulnerabilities [https://brakemanscanner.org/]
+gem "brakeman", require: false
+
+# Omakase Ruby styling [https://github.com/rails/rubocop-rails-omakase/]
+gem "rubocop-rails-omakase", require: false
+
+gem "rspec-rails"
+
+gem "rubycritic", require: false
+
+ +

end

+ +

group :development do

+ +
# Use console on exceptions pages [https://github.com/rails/web-console]
+gem "web-console"
+
+ +

end

+ +

group :test do

+ +
# Use system testing [https://guides.rubyonrails.org/testing.html#system-testing]
+gem "capybara"
+gem "selenium-webdriver"
+gem "cucumber-rails", require: false
+gem "database_cleaner"
+gem "simplecov", require: false
+
+ +

end

+ +
+ + + + + + + + diff --git a/doc/Gemfile_lock.html b/doc/Gemfile_lock.html new file mode 100644 index 0000000000..00205e41b5 --- /dev/null +++ b/doc/Gemfile_lock.html @@ -0,0 +1,2418 @@ + + + + + + + +Gemfile.lock - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

GEM

+ +
remote: https://rubygems.org/
+specs:
+  action_text-trix (2.1.19)
+    railties
+  actioncable (8.1.3)
+    actionpack (= 8.1.3)
+    activesupport (= 8.1.3)
+    nio4r (~> 2.0)
+    websocket-driver (>= 0.6.1)
+    zeitwerk (~> 2.6)
+  actionmailbox (8.1.3)
+    actionpack (= 8.1.3)
+    activejob (= 8.1.3)
+    activerecord (= 8.1.3)
+    activestorage (= 8.1.3)
+    activesupport (= 8.1.3)
+    mail (>= 2.8.0)
+  actionmailer (8.1.3)
+    actionpack (= 8.1.3)
+    actionview (= 8.1.3)
+    activejob (= 8.1.3)
+    activesupport (= 8.1.3)
+    mail (>= 2.8.0)
+    rails-dom-testing (~> 2.2)
+  actionpack (8.1.3)
+    actionview (= 8.1.3)
+    activesupport (= 8.1.3)
+    nokogiri (>= 1.8.5)
+    rack (>= 2.2.4)
+    rack-session (>= 1.0.1)
+    rack-test (>= 0.6.3)
+    rails-dom-testing (~> 2.2)
+    rails-html-sanitizer (~> 1.6)
+    useragent (~> 0.16)
+  actiontext (8.1.3)
+    action_text-trix (~> 2.1.15)
+    actionpack (= 8.1.3)
+    activerecord (= 8.1.3)
+    activestorage (= 8.1.3)
+    activesupport (= 8.1.3)
+    globalid (>= 0.6.0)
+    nokogiri (>= 1.8.5)
+  actionview (8.1.3)
+    activesupport (= 8.1.3)
+    builder (~> 3.1)
+    erubi (~> 1.11)
+    rails-dom-testing (~> 2.2)
+    rails-html-sanitizer (~> 1.6)
+  activejob (8.1.3)
+    activesupport (= 8.1.3)
+    globalid (>= 0.3.6)
+  activemodel (8.1.3)
+    activesupport (= 8.1.3)
+  activerecord (8.1.3)
+    activemodel (= 8.1.3)
+    activesupport (= 8.1.3)
+    timeout (>= 0.4.0)
+  activestorage (8.1.3)
+    actionpack (= 8.1.3)
+    activejob (= 8.1.3)
+    activerecord (= 8.1.3)
+    activesupport (= 8.1.3)
+    marcel (~> 1.0)
+  activesupport (8.1.3)
+    base64
+    bigdecimal
+    concurrent-ruby (~> 1.0, >= 1.3.1)
+    connection_pool (>= 2.2.5)
+    drb
+    i18n (>= 1.6, < 2)
+    json
+    logger (>= 1.4.2)
+    minitest (>= 5.1)
+    securerandom (>= 0.3)
+    tzinfo (~> 2.0, >= 2.0.5)
+    uri (>= 0.13.1)
+  addressable (2.9.0)
+    public_suffix (>= 2.0.2, < 8.0)
+  ast (2.4.3)
+  axiom-types (0.1.1)
+    descendants_tracker (~> 0.0.4)
+    ice_nine (~> 0.11.0)
+    thread_safe (~> 0.3, >= 0.3.1)
+  base64 (0.3.0)
+  bcrypt (3.1.22)
+  bcrypt_pbkdf (1.1.2)
+  bigdecimal (4.1.2)
+  bindex (0.8.1)
+  bootsnap (1.24.6)
+    msgpack (~> 1.2)
+  brakeman (8.0.5)
+    racc
+  builder (3.3.0)
+  bundler-audit (0.9.3)
+    bundler (>= 1.2.0)
+    thor (~> 1.0)
+  capybara (3.40.0)
+    addressable
+    matrix
+    mini_mime (>= 0.1.3)
+    nokogiri (~> 1.11)
+    rack (>= 1.6.0)
+    rack-test (>= 0.6.3)
+    regexp_parser (>= 1.5, < 3.0)
+    xpath (~> 3.2)
+  childprocess (5.1.0)
+    logger (~> 1.5)
+  coercible (1.0.0)
+    descendants_tracker (~> 0.0.1)
+  concurrent-ruby (1.3.7)
+  connection_pool (3.0.2)
+  crass (1.0.6)
+  csv (3.3.5)
+  cucumber (10.2.0)
+    base64 (~> 0.2)
+    builder (~> 3.2)
+    cucumber-ci-environment (> 9, < 12)
+    cucumber-core (> 15, < 17)
+    cucumber-cucumber-expressions (> 17, < 20)
+    cucumber-html-formatter (> 21, < 23)
+    diff-lcs (~> 1.5)
+    logger (~> 1.6)
+    mini_mime (~> 1.1)
+    multi_test (~> 1.1)
+    sys-uname (~> 1.3)
+  cucumber-ci-environment (11.0.0)
+  cucumber-core (16.2.0)
+    cucumber-gherkin (> 36, < 40)
+    cucumber-messages (> 31, < 33)
+    cucumber-tag-expressions (> 6, < 9)
+  cucumber-cucumber-expressions (19.0.1)
+    bigdecimal
+  cucumber-gherkin (39.1.0)
+    cucumber-messages (>= 31, < 33)
+  cucumber-html-formatter (22.3.0)
+    cucumber-messages (> 23, < 33)
+  cucumber-messages (32.3.1)
+  cucumber-rails (4.0.1)
+    capybara (>= 3.25, < 4)
+    cucumber (>= 7, < 11)
+    railties (>= 6.1, < 9)
+  cucumber-tag-expressions (8.1.0)
+  database_cleaner (2.1.0)
+    database_cleaner-active_record (>= 2, < 3)
+  database_cleaner-active_record (2.2.2)
+    activerecord (>= 5.a)
+    database_cleaner-core (~> 2.0)
+  database_cleaner-core (2.1.0)
+  date (3.5.1)
+  debug (1.11.1)
+    irb (~> 1.10)
+    reline (>= 0.3.8)
+  descendants_tracker (0.0.4)
+    thread_safe (~> 0.3, >= 0.3.1)
+  diff-lcs (1.6.2)
+  docile (1.4.1)
+  dotenv (3.2.0)
+  dotenv-rails (3.2.0)
+    dotenv (= 3.2.0)
+    railties (>= 6.1)
+  drb (2.2.3)
+  dry-configurable (1.3.0)
+    dry-core (~> 1.1)
+    zeitwerk (~> 2.6)
+  dry-core (1.2.0)
+    concurrent-ruby (~> 1.0)
+    logger
+    zeitwerk (~> 2.6)
+  dry-inflector (1.3.1)
+  dry-initializer (3.2.0)
+  dry-logic (1.6.0)
+    bigdecimal
+    concurrent-ruby (~> 1.0)
+    dry-core (~> 1.1)
+    zeitwerk (~> 2.6)
+  dry-schema (1.16.0)
+    concurrent-ruby (~> 1.0)
+    dry-configurable (~> 1.0, >= 1.0.1)
+    dry-core (~> 1.1)
+    dry-initializer (~> 3.2)
+    dry-logic (~> 1.6)
+    dry-types (~> 1.9, >= 1.9.1)
+    zeitwerk (~> 2.6)
+  dry-types (1.9.1)
+    bigdecimal (>= 3.0)
+    concurrent-ruby (~> 1.0)
+    dry-core (~> 1.0)
+    dry-inflector (~> 1.0)
+    dry-logic (~> 1.4)
+    zeitwerk (~> 2.6)
+  ed25519 (1.4.0)
+  erb (6.0.4)
+  erubi (1.13.1)
+  et-orbi (1.4.0)
+    tzinfo
+  ffi (1.17.4-aarch64-linux-gnu)
+  ffi (1.17.4-aarch64-linux-musl)
+  ffi (1.17.4-arm-linux-gnu)
+  ffi (1.17.4-arm-linux-musl)
+  ffi (1.17.4-arm64-darwin)
+  ffi (1.17.4-x64-mingw-ucrt)
+  ffi (1.17.4-x86_64-linux-gnu)
+  ffi (1.17.4-x86_64-linux-musl)
+  flay (2.14.4)
+    erubi (~> 1.10)
+    path_expander (~> 2.0)
+    prism (~> 1.7)
+    sexp_processor (~> 4.0)
+  flog (4.9.4)
+    path_expander (~> 2.0)
+    prism (~> 1.7)
+    sexp_processor (~> 4.8)
+  fugit (1.12.2)
+    et-orbi (~> 1.4)
+    raabro (~> 1.4)
+  globalid (1.3.0)
+    activesupport (>= 6.1)
+  i18n (1.15.0)
+    concurrent-ruby (~> 1.0)
+  ice_nine (0.11.2)
+  image_processing (1.14.0)
+    mini_magick (>= 4.9.5, < 6)
+    ruby-vips (>= 2.0.17, < 3)
+  importmap-rails (2.2.3)
+    actionpack (>= 6.0.0)
+    activesupport (>= 6.0.0)
+    railties (>= 6.0.0)
+  io-console (0.8.2)
+  irb (1.18.0)
+    pp (>= 0.6.0)
+    prism (>= 1.3.0)
+    rdoc (>= 4.0.0)
+    reline (>= 0.4.2)
+  jbuilder (2.15.1)
+    actionview (>= 7.0.0)
+    activesupport (>= 7.0.0)
+  json (2.19.9)
+  kamal (2.11.0)
+    activesupport (>= 7.0)
+    base64 (~> 0.2)
+    bcrypt_pbkdf (~> 1.0)
+    concurrent-ruby (~> 1.2)
+    dotenv (~> 3.1)
+    ed25519 (~> 1.4)
+    net-ssh (~> 7.3)
+    sshkit (>= 1.23.0, < 2.0)
+    thor (~> 1.3)
+    zeitwerk (>= 2.6.18, < 3.0)
+  language_server-protocol (3.17.0.5)
+  launchy (3.1.1)
+    addressable (~> 2.8)
+    childprocess (~> 5.0)
+    logger (~> 1.6)
+  lint_roller (1.1.0)
+  logger (1.7.0)
+  loofah (2.25.1)
+    crass (~> 1.0.2)
+    nokogiri (>= 1.12.0)
+  mail (2.9.0)
+    logger
+    mini_mime (>= 0.1.1)
+    net-imap
+    net-pop
+    net-smtp
+  marcel (1.2.1)
+  matrix (0.4.3)
+  memoist3 (1.0.0)
+  mini_magick (5.3.1)
+    logger
+  mini_mime (1.1.5)
+  minitest (6.0.6)
+    drb (~> 2.0)
+    prism (~> 1.5)
+  msgpack (1.8.3)
+  multi_test (1.1.0)
+  mysql2 (0.5.7)
+    bigdecimal
+  net-imap (0.6.4.1)
+    date
+    net-protocol
+  net-pop (0.1.2)
+    net-protocol
+  net-protocol (0.2.2)
+    timeout
+  net-scp (4.1.0)
+    net-ssh (>= 2.6.5, < 8.0.0)
+  net-sftp (4.0.0)
+    net-ssh (>= 5.0.0, < 8.0.0)
+  net-smtp (0.5.1)
+    net-protocol
+  net-ssh (7.3.2)
+  nio4r (2.7.5)
+  nokogiri (1.19.3-aarch64-linux-gnu)
+    racc (~> 1.4)
+  nokogiri (1.19.3-aarch64-linux-musl)
+    racc (~> 1.4)
+  nokogiri (1.19.3-arm-linux-gnu)
+    racc (~> 1.4)
+  nokogiri (1.19.3-arm-linux-musl)
+    racc (~> 1.4)
+  nokogiri (1.19.3-arm64-darwin)
+    racc (~> 1.4)
+  nokogiri (1.19.3-x64-mingw-ucrt)
+    racc (~> 1.4)
+  nokogiri (1.19.3-x86_64-linux-gnu)
+    racc (~> 1.4)
+  nokogiri (1.19.3-x86_64-linux-musl)
+    racc (~> 1.4)
+  ostruct (0.6.3)
+  parallel (1.28.0)
+  parser (3.3.11.1)
+    ast (~> 2.4.1)
+    racc
+  path_expander (2.0.1)
+  pp (0.6.3)
+    prettyprint
+  prettyprint (0.2.0)
+  prism (1.9.0)
+  propshaft (1.3.2)
+    actionpack (>= 7.0.0)
+    activesupport (>= 7.0.0)
+    rack
+  psych (5.4.0)
+    date
+    stringio
+  public_suffix (7.0.5)
+  puma (8.0.2)
+    nio4r (~> 2.0)
+  raabro (1.4.0)
+  racc (1.8.1)
+  rack (3.2.6)
+  rack-session (2.1.2)
+    base64 (>= 0.1.0)
+    rack (>= 3.0.0)
+  rack-test (2.2.0)
+    rack (>= 1.3)
+  rackup (2.3.1)
+    rack (>= 3)
+  rails (8.1.3)
+    actioncable (= 8.1.3)
+    actionmailbox (= 8.1.3)
+    actionmailer (= 8.1.3)
+    actionpack (= 8.1.3)
+    actiontext (= 8.1.3)
+    actionview (= 8.1.3)
+    activejob (= 8.1.3)
+    activemodel (= 8.1.3)
+    activerecord (= 8.1.3)
+    activestorage (= 8.1.3)
+    activesupport (= 8.1.3)
+    bundler (>= 1.15.0)
+    railties (= 8.1.3)
+  rails-dom-testing (2.3.0)
+    activesupport (>= 5.0.0)
+    minitest
+    nokogiri (>= 1.6)
+  rails-html-sanitizer (1.7.0)
+    loofah (~> 2.25)
+    nokogiri (>= 1.15.7, != 1.16.7, != 1.16.6, != 1.16.5, != 1.16.4, != 1.16.3, != 1.16.2, != 1.16.1, != 1.16.0.rc1, != 1.16.0)
+  railties (8.1.3)
+    actionpack (= 8.1.3)
+    activesupport (= 8.1.3)
+    irb (~> 1.13)
+    rackup (>= 1.0.0)
+    rake (>= 12.2)
+    thor (~> 1.0, >= 1.2.2)
+    tsort (>= 0.2)
+    zeitwerk (~> 2.6)
+  rainbow (3.1.1)
+  rake (13.4.2)
+  rdoc (7.2.0)
+    erb
+    psych (>= 4.0.0)
+    tsort
+  reek (6.5.0)
+    dry-schema (~> 1.13)
+    logger (~> 1.6)
+    parser (~> 3.3.0)
+    rainbow (>= 2.0, < 4.0)
+    rexml (~> 3.1)
+  regexp_parser (2.12.0)
+  reline (0.6.3)
+    io-console (~> 0.5)
+  rexml (3.4.4)
+  rspec-core (3.13.6)
+    rspec-support (~> 3.13.0)
+  rspec-expectations (3.13.5)
+    diff-lcs (>= 1.2.0, < 2.0)
+    rspec-support (~> 3.13.0)
+  rspec-mocks (3.13.8)
+    diff-lcs (>= 1.2.0, < 2.0)
+    rspec-support (~> 3.13.0)
+  rspec-rails (8.0.4)
+    actionpack (>= 7.2)
+    activesupport (>= 7.2)
+    railties (>= 7.2)
+    rspec-core (>= 3.13.0, < 5.0.0)
+    rspec-expectations (>= 3.13.0, < 5.0.0)
+    rspec-mocks (>= 3.13.0, < 5.0.0)
+    rspec-support (>= 3.13.0, < 5.0.0)
+  rspec-support (3.13.7)
+  rubocop (1.88.0)
+    json (~> 2.3)
+    language_server-protocol (~> 3.17.0.2)
+    lint_roller (~> 1.1.0)
+    parallel (>= 1.10)
+    parser (>= 3.3.0.2)
+    rainbow (>= 2.2.2, < 4.0)
+    regexp_parser (>= 2.9.3, < 3.0)
+    rubocop-ast (>= 1.49.0, < 2.0)
+    ruby-progressbar (~> 1.7)
+    unicode-display_width (>= 2.4.0, < 4.0)
+  rubocop-ast (1.49.1)
+    parser (>= 3.3.7.2)
+    prism (~> 1.7)
+  rubocop-performance (1.26.1)
+    lint_roller (~> 1.1)
+    rubocop (>= 1.75.0, < 2.0)
+    rubocop-ast (>= 1.47.1, < 2.0)
+  rubocop-rails (2.35.4)
+    activesupport (>= 4.2.0)
+    lint_roller (~> 1.1)
+    rack (>= 1.1)
+    rubocop (>= 1.75.0, < 2.0)
+    rubocop-ast (>= 1.44.0, < 2.0)
+  rubocop-rails-omakase (1.1.0)
+    rubocop (>= 1.72)
+    rubocop-performance (>= 1.24)
+    rubocop-rails (>= 2.30)
+  ruby-progressbar (1.13.0)
+  ruby-vips (2.3.0)
+    ffi (~> 1.12)
+    logger
+  ruby_parser (3.22.0)
+    racc (~> 1.5)
+    sexp_processor (~> 4.16)
+  rubycritic (5.0.0)
+    flay (~> 2.13)
+    flog (~> 4.7)
+    launchy (>= 2.5.2)
+    ostruct
+    parser (>= 3.3.0.5)
+    prism (>= 1.6.0)
+    rainbow (~> 3.1.1)
+    reek (~> 6.5.0, < 7.0)
+    rexml
+    ruby_parser (~> 3.21)
+    simplecov (>= 0.22.0)
+    tty-which (~> 0.5.0)
+    virtus (~> 2.0)
+  rubyzip (3.4.0)
+  securerandom (0.4.1)
+  selenium-webdriver (4.44.0)
+    base64 (~> 0.2)
+    logger (~> 1.4)
+    rexml (~> 3.2, >= 3.2.5)
+    rubyzip (>= 1.2.2, < 4.0)
+    websocket (~> 1.0)
+  sexp_processor (4.17.5)
+  simplecov (0.22.0)
+    docile (~> 1.1)
+    simplecov-html (~> 0.11)
+    simplecov_json_formatter (~> 0.1)
+  simplecov-html (0.13.2)
+  simplecov_json_formatter (0.1.4)
+  solid_cable (3.0.12)
+    actioncable (>= 7.2)
+    activejob (>= 7.2)
+    activerecord (>= 7.2)
+    railties (>= 7.2)
+  solid_cache (1.0.10)
+    activejob (>= 7.2)
+    activerecord (>= 7.2)
+    railties (>= 7.2)
+  solid_queue (1.4.0)
+    activejob (>= 7.1)
+    activerecord (>= 7.1)
+    concurrent-ruby (>= 1.3.1)
+    fugit (~> 1.11)
+    railties (>= 7.1)
+    thor (>= 1.3.1)
+  sshkit (1.25.0)
+    base64
+    logger
+    net-scp (>= 1.1.2)
+    net-sftp (>= 2.1.2)
+    net-ssh (>= 2.8.0)
+    ostruct
+  stimulus-rails (1.3.4)
+    railties (>= 6.0.0)
+  stringio (3.2.0)
+  sys-uname (1.5.1)
+    ffi (~> 1.1)
+    memoist3 (~> 1.0.0)
+  sys-uname (1.5.1-universal-mingw32)
+    ffi (~> 1.1)
+    memoist3 (~> 1.0.0)
+    win32ole
+  thor (1.5.0)
+  thread_safe (0.3.6)
+  thruster (0.1.21)
+  thruster (0.1.21-aarch64-linux)
+  thruster (0.1.21-arm64-darwin)
+  thruster (0.1.21-x86_64-linux)
+  timeout (0.6.1)
+  tsort (0.2.0)
+  tty-which (0.5.0)
+  turbo-rails (2.0.23)
+    actionpack (>= 7.1.0)
+    railties (>= 7.1.0)
+  tzinfo (2.0.6)
+    concurrent-ruby (~> 1.0)
+  tzinfo-data (1.2026.2)
+    tzinfo (>= 1.0.0)
+  unicode-display_width (3.2.0)
+    unicode-emoji (~> 4.1)
+  unicode-emoji (4.2.0)
+  uri (1.1.1)
+  useragent (0.16.11)
+  virtus (2.0.0)
+    axiom-types (~> 0.1)
+    coercible (~> 1.0)
+    descendants_tracker (~> 0.0, >= 0.0.3)
+  web-console (4.3.0)
+    actionview (>= 8.0.0)
+    bindex (>= 0.4.0)
+    railties (>= 8.0.0)
+  websocket (1.2.11)
+  websocket-driver (0.8.1)
+    base64
+    websocket-extensions (>= 0.1.0)
+  websocket-extensions (0.1.5)
+  win32ole (1.9.3)
+  xpath (3.2.0)
+    nokogiri (~> 1.8)
+  zeitwerk (2.8.2)
+ +

PLATFORMS

+ +
aarch64-linux
+aarch64-linux-gnu
+aarch64-linux-musl
+arm-linux-gnu
+arm-linux-musl
+arm64-darwin-25
+x64-mingw-ucrt
+x86_64-linux
+x86_64-linux-gnu
+x86_64-linux-musl
+
+ +

DEPENDENCIES

+ +
bcrypt (~> 3.1.7)
+bootsnap
+brakeman
+bundler-audit
+capybara
+csv
+cucumber-rails
+database_cleaner
+debug
+dotenv-rails
+image_processing (~> 1.2)
+importmap-rails
+jbuilder
+kamal
+mysql2 (~> 0.5)
+propshaft
+puma (>= 5.0)
+rails (~> 8.1.3)
+rdoc (>= 6.3.1)
+rspec-rails
+rubocop-rails-omakase
+rubycritic
+selenium-webdriver
+simplecov
+solid_cable
+solid_cache
+solid_queue
+stimulus-rails
+thruster
+turbo-rails
+tzinfo-data
+web-console
+ +

CHECKSUMS

+ +
action_text-trix (2.1.19) sha256=7012f59421009cf284aa651294896414d653a61a2417c9b8714c8476d2f74009
+actioncable (8.1.3) sha256=e5bc7f75e44e6a22de29c4f43176927c3a9ce4824464b74ed18d8226e75a80f0
+actionmailbox (8.1.3) sha256=df7da474eaa0e70df4ed5a6fef66eb3b3b0f2dbf7f14518deee8d77f1b4aae59
+actionmailer (8.1.3) sha256=831f724891bb70d0aaa4d76581a6321124b6a752cb655c9346aae5479318448d
+actionpack (8.1.3) sha256=af998cae4d47c5d581a2cc363b5c77eb718b7c4b45748d81b1887b25621c29a3
+actiontext (8.1.3) sha256=d291019c00e1ea9e6463011fa214f6081a56d7b9a1d224e7d3f6384c1dafc7d2
+actionview (8.1.3) sha256=1347c88c7f3edb38100c5ce0e9fb5e62d7755f3edc1b61cce2eb0b2c6ea2fd5d
+activejob (8.1.3) sha256=a149b1766aa8204c3c3da7309e4becd40fcd5529c348cffbf6c9b16b565fe8d3
+activemodel (8.1.3) sha256=90c05cbe4cef3649b8f79f13016191ea94c4525ce4a5c0fb7ef909c4b91c8219
+activerecord (8.1.3) sha256=8003be7b2466ba0a2a670e603eeb0a61dd66058fccecfc49901e775260ac70ab
+activestorage (8.1.3) sha256=0564ce9309143951a67615e1bb4e090ee54b8befed417133cae614479b46384d
+activesupport (8.1.3) sha256=21a5e0dfbd4c3ddd9e1317ec6a4d782fa226e7867dc70b0743acda81a1dca20e
+addressable (2.9.0) sha256=7fdf6ac3660f7f4e867a0838be3f6cf722ace541dd97767fa42bc6cfa980c7af
+ast (2.4.3) sha256=954615157c1d6a382bc27d690d973195e79db7f55e9765ac7c481c60bdb4d383
+axiom-types (0.1.1) sha256=c1ff113f3de516fa195b2db7e0a9a95fd1b08475a502ff660d04507a09980383
+base64 (0.3.0) sha256=27337aeabad6ffae05c265c450490628ef3ebd4b67be58257393227588f5a97b
+bcrypt (3.1.22) sha256=1f0072e88c2d705d94aff7f2c5cb02eb3f1ec4b8368671e19112527489f29032
+bcrypt_pbkdf (1.1.2) sha256=c2414c23ce66869b3eb9f643d6a3374d8322dfb5078125c82792304c10b94cf6
+bigdecimal (4.1.2) sha256=53d217666027eab4280346fba98e7d5b66baaae1b9c3c1c0ffe89d48188a3fbd
+bindex (0.8.1) sha256=7b1ecc9dc539ed8bccfc8cb4d2732046227b09d6f37582ff12e50a5047ceb17e
+bootsnap (1.24.6) sha256=c60bab88c70332290f0a2636a288f675299eb4f804a02a3c085b42eca9da164a
+brakeman (8.0.5) sha256=03735f9690d3fd4b32d66aacbf0a6d15a84266bdd06b32c05c8ecc8f6021d2be
+builder (3.3.0) sha256=497918d2f9dca528fdca4b88d84e4ef4387256d984b8154e9d5d3fe5a9c8835f
+bundler-audit (0.9.3) sha256=81c8766c71e47d0d28a0f98c7eed028539f21a6ea3cd8f685eb6f42333c9b4e9
+capybara (3.40.0) sha256=42dba720578ea1ca65fd7a41d163dd368502c191804558f6e0f71b391054aeef
+childprocess (5.1.0) sha256=9a8d484be2fd4096a0e90a0cd3e449a05bc3aa33f8ac9e4d6dcef6ac1455b6ec
+coercible (1.0.0) sha256=5081ad24352cc8435ce5472bc2faa30260c7ea7f2102cc6a9f167c4d9bffaadc
+concurrent-ruby (1.3.7) sha256=4412caec3a5ea2e5fdc52076724c071a81f2c0593d83b2ac8cbb8ca63b3151b0
+connection_pool (3.0.2) sha256=33fff5ba71a12d2aa26cb72b1db8bba2a1a01823559fb01d29eb74c286e62e0a
+crass (1.0.6) sha256=dc516022a56e7b3b156099abc81b6d2b08ea1ed12676ac7a5657617f012bd45d
+csv (3.3.5) sha256=6e5134ac3383ef728b7f02725d9872934f523cb40b961479f69cf3afa6c8e73f
+cucumber (10.2.0) sha256=fdedbd31ecf40858b60f04853f2aa15c44f5c30bbac29c6a227fa1e7005a8158
+cucumber-ci-environment (11.0.0) sha256=0df79a9e1d0b015b3d9def680f989200d96fef206f4d19ccf86a338c4f71d1e2
+cucumber-core (16.2.0) sha256=592b58a95cf42feef8e5a349f68e363784ba3b6568ffbcf6776e38e136cf970b
+cucumber-cucumber-expressions (19.0.1) sha256=648ec09045190d818fb797af46e1648148599fd67a086a34a7f0e647d9e36c8c
+cucumber-gherkin (39.1.0) sha256=aed12a0c955d8563d80a012633c1a72075525f4d64d4cc983001df2181b379ed
+cucumber-html-formatter (22.3.0) sha256=f9768ed05588dbd73a5f3824c2cc648bd86b00206e6972d743af8051281d0729
+cucumber-messages (32.3.1) sha256=ddc88e4c1cf7afb96c06005b92a4a6f221a2fa435a8b4ca04677d215fd82771c
+cucumber-rails (4.0.1) sha256=bd3513ec47dc06188cc05703648cbc3560fb115f3f5cfb8b616065b4d6e8024d
+cucumber-tag-expressions (8.1.0) sha256=9bd8c4b6654f8e5bf2a9c99329b6f32136a75e50cd39d4cfb3927d0fa9f52e21
+database_cleaner (2.1.0) sha256=1dcba26e3b1576da692fc6bac10136a4744da5bcc293d248aae19640c65d89cd
+database_cleaner-active_record (2.2.2) sha256=88296b9f3088c31f7c0d4fcec10f68e4b71c96698043916de59b04debec10388
+database_cleaner-core (2.1.0) sha256=b2875266d9b26b716e8b669c883e01c5250839f6f2ec56422b5e79aa97fb6927
+date (3.5.1) sha256=750d06384d7b9c15d562c76291407d89e368dda4d4fff957eb94962d325a0dc0
+debug (1.11.1) sha256=2e0b0ac6119f2207a6f8ac7d4a73ca8eb4e440f64da0a3136c30343146e952b6
+descendants_tracker (0.0.4) sha256=e9c41dd4cfbb85829a9301ea7e7c48c2a03b26f09319db230e6479ccdc780897
+diff-lcs (1.6.2) sha256=9ae0d2cba7d4df3075fe8cd8602a8604993efc0dfa934cff568969efb1909962
+docile (1.4.1) sha256=96159be799bfa73cdb721b840e9802126e4e03dfc26863db73647204c727f21e
+dotenv (3.2.0) sha256=e375b83121ea7ca4ce20f214740076129ab8514cd81378161f11c03853fe619d
+dotenv-rails (3.2.0) sha256=657e25554ba622ffc95d8c4f1670286510f47f2edda9f68293c3f661b303beab
+drb (2.2.3) sha256=0b00d6fdb50995fe4a45dea13663493c841112e4068656854646f418fda13373
+dry-configurable (1.3.0) sha256=882d862858567fc1210d2549d4c090f34370fc1bb7c5c1933de3fe792e18afa8
+dry-core (1.2.0) sha256=0cc5a7da88df397f153947eeeae42e876e999c1e30900f3c536fb173854e96a1
+dry-inflector (1.3.1) sha256=7fb0c2bb04f67638f25c52e7ba39ab435d922a3a5c3cd196120f63accb682dcc
+dry-initializer (3.2.0) sha256=37d59798f912dc0a1efe14a4db4a9306989007b302dcd5f25d0a2a20c166c4e3
+dry-logic (1.6.0) sha256=da6fedbc0f90fc41f9b0cc7e6f05f5d529d1efaef6c8dcc8e0733f685745cea2
+dry-schema (1.16.0) sha256=cd3aaeabc0f1af66ec82a29096d4c4fb92a0a58b9dae29a22b1bbceb78985727
+dry-types (1.9.1) sha256=baebeecdb9f8395d6c9d227b62011279440943e3ef2468fe8ccc1ba11467f178
+ed25519 (1.4.0) sha256=16e97f5198689a154247169f3453ef4cfd3f7a47481fde0ae33206cdfdcac506
+erb (6.0.4) sha256=38e3803694be357fe2bfe312487c74beaf9fb4e5beb3e22498952fe1645b95d9
+erubi (1.13.1) sha256=a082103b0885dbc5ecf1172fede897f9ebdb745a4b97a5e8dc63953db1ee4ad9
+et-orbi (1.4.0) sha256=6c7e3c90779821f9e3b324c5e96fda9767f72995d6ae435b96678a4f3e2de8bc
+ffi (1.17.4-aarch64-linux-gnu) sha256=b208f06f91ffd8f5e1193da3cae3d2ccfc27fc36fba577baf698d26d91c080df
+ffi (1.17.4-aarch64-linux-musl) sha256=9286b7a615f2676245283aef0a0a3b475ae3aae2bb5448baace630bb77b91f39
+ffi (1.17.4-arm-linux-gnu) sha256=d6dbddf7cb77bf955411af5f187a65b8cd378cb003c15c05697f5feee1cb1564
+ffi (1.17.4-arm-linux-musl) sha256=9d4838ded0465bef6e2426935f6bcc93134b6616785a84ffd2a3d82bc3cf6f95
+ffi (1.17.4-arm64-darwin) sha256=19071aaf1419251b0a46852abf960e77330a3b334d13a4ab51d58b31a937001b
+ffi (1.17.4-x64-mingw-ucrt) sha256=f6ff9618cfccc494138bddade27aa06c74c6c7bc367a1ea1103d80c2fcb9ed35
+ffi (1.17.4-x86_64-linux-gnu) sha256=9d3db14c2eae074b382fa9c083fe95aec6e0a1451da249eab096c34002bc752d
+ffi (1.17.4-x86_64-linux-musl) sha256=3fdf9888483de005f8ef8d1cf2d3b20d86626af206cbf780f6a6a12439a9c49e
+flay (2.14.4) sha256=a62d96a51d1da185aa41ba95b696966df9f7d1d91a457709277f24515895de77
+flog (4.9.4) sha256=12cc054fab7a2cbd2a906514397c4d7788954d530564782d6f14939dc2dfbcbb
+fugit (1.12.2) sha256=643f2bf28db263bd400cbf8e0dd8b76b2c9b94bdb130e12d2394de04d9c20e5e
+globalid (1.3.0) sha256=05c639ad6eb4594522a0b07983022f04aa7254626ab69445a0e493aa3786ff11
+i18n (1.15.0) sha256=ed20037ed7ca75dd36ec486b5fb9696e8e0cfe48f4f80980017932d93e70527f
+ice_nine (0.11.2) sha256=5d506a7d2723d5592dc121b9928e4931742730131f22a1a37649df1c1e2e63db
+image_processing (1.14.0) sha256=754cc169c9c262980889bec6bfd325ed1dafad34f85242b5a07b60af004742fb
+importmap-rails (2.2.3) sha256=7101be2a4dc97cf1558fb8f573a718404c5f6bcfe94f304bf1f39e444feeb16a
+io-console (0.8.2) sha256=d6e3ae7a7cc7574f4b8893b4fca2162e57a825b223a177b7afa236c5ef9814cc
+irb (1.18.0) sha256=de9454a0703a54704b9811a5ef31a60c86949fbf4013fcf244fabc7c775248e3
+jbuilder (2.15.1) sha256=2430bec28fb0cebacb5875b1009cf9d8bc3c303ccb810c4c8b062a4b51457637
+json (2.19.9) sha256=9b9025b7cdddafa38d316eca0b2358488e42d417045c1b90d216a9fefe46b79a
+kamal (2.11.0) sha256=1408864425e0dec7e0a14d712a3b13f614e9f3a425b7661d3f9d287a51d7dd75
+language_server-protocol (3.17.0.5) sha256=fd1e39a51a28bf3eec959379985a72e296e9f9acfce46f6a79d31ca8760803cc
+launchy (3.1.1) sha256=72b847b5cc961589dde2c395af0108c86ff0119f42d4648d25b5440ebb10059e
+lint_roller (1.1.0) sha256=2c0c845b632a7d172cb849cc90c1bce937a28c5c8ccccb50dfd46a485003cc87
+logger (1.7.0) sha256=196edec7cc44b66cfb40f9755ce11b392f21f7967696af15d274dde7edff0203
+loofah (2.25.1) sha256=d436c73dbd0c1147b16c4a41db097942d217303e1f7728704b37e4df9f6d2e04
+mail (2.9.0) sha256=6fa6673ecd71c60c2d996260f9ee3dd387d4673b8169b502134659ece6d34941
+marcel (1.2.1) sha256=1678e9360e32f9eafa917c80029e2f6d10b2715c66a4b87b6d0da9b9cd1f859f
+matrix (0.4.3) sha256=a0d5ab7ddcc1973ff690ab361b67f359acbb16958d1dc072b8b956a286564c5b
+memoist3 (1.0.0) sha256=686e42402cf150a362050c23143dc57b0ef88f8c344943ff8b7845792b50d56f
+mini_magick (5.3.1) sha256=29395dfd76badcabb6403ee5aff6f681e867074f8f28ce08d78661e9e4a351c4
+mini_mime (1.1.5) sha256=8681b7e2e4215f2a159f9400b5816d85e9d8c6c6b491e96a12797e798f8bccef
+minitest (6.0.6) sha256=153ea36d1d987a62942382b61075745042a2b3123b1cd48f4c3675af9cc7d6f1
+msgpack (1.8.3) sha256=8bda4a6428d3244e50d6bd55854d354edbada88a4e1f4f5731a39a0f86bee6a1
+multi_test (1.1.0) sha256=e9e550cdd863fb72becfe344aefdcd4cbd26ebf307847f4a6c039a4082324d10
+mysql2 (0.5.7) sha256=ba09ede515a0ae8a7192040a1b778c0fb0f025fa5877e9be895cd325fa5e9d7b
+net-imap (0.6.4.1) sha256=29f0360d75a7efd3539f16ac1957dea5c0a51ddeceb348db4553c3120914ea0d
+net-pop (0.1.2) sha256=848b4e982013c15b2f0382792268763b748cce91c9e91e36b0f27ed26420dff3
+net-protocol (0.2.2) sha256=aa73e0cba6a125369de9837b8d8ef82a61849360eba0521900e2c3713aa162a8
+net-scp (4.1.0) sha256=a99b0b92a1e5d360b0de4ffbf2dc0c91531502d3d4f56c28b0139a7c093d1a5d
+net-sftp (4.0.0) sha256=65bb91c859c2f93b09826757af11b69af931a3a9155050f50d1b06d384526364
+net-smtp (0.5.1) sha256=ed96a0af63c524fceb4b29b0d352195c30d82dd916a42f03c62a3a70e5b70736
+net-ssh (7.3.2) sha256=65029e213c380e20e5fd92ece663934ab0a0fe888e0cd7cc6a5b664074362dd4
+nio4r (2.7.5) sha256=6c90168e48fb5f8e768419c93abb94ba2b892a1d0602cb06eef16d8b7df1dca1
+nokogiri (1.19.3-aarch64-linux-gnu) sha256=46b89e5d7b9e844c2ee360794240c6ea2a4e6fa0c5892a4ed487db621224b639
+nokogiri (1.19.3-aarch64-linux-musl) sha256=8392dfdcd21be7a94dbbe9ccc138dea01b97b24cb2dc02a114ca98bfb1d9a0b7
+nokogiri (1.19.3-arm-linux-gnu) sha256=3919d5ffc334ad778a4a9eb88fda7dcb8b1fb58c8a52ac640c6dcd2f038e774f
+nokogiri (1.19.3-arm-linux-musl) sha256=9ce1cb6346bb9c67b1550eb537aa183ead91e4b6eadb2f36ade02d8dd2a79fb6
+nokogiri (1.19.3-arm64-darwin) sha256=71b9bd424b1b7abc18b05052a1a3cfd3627abdca62be280854cc411791357e42
+nokogiri (1.19.3-x64-mingw-ucrt) sha256=8bb7132cad356c879a1286eaabcb5e68326cb2490317984280fbc62f456d506a
+nokogiri (1.19.3-x86_64-linux-gnu) sha256=2f5078620fe12e83669b5b17311b32532a8153d02eee7ad06948b926d6080976
+nokogiri (1.19.3-x86_64-linux-musl) sha256=248c906d2166eca5efb56d52fdee5f9a1f51d69a72e2b64fdac647b4ce39ea3f
+ostruct (0.6.3) sha256=95a2ed4a4bd1d190784e666b47b2d3f078e4a9efda2fccf18f84ddc6538ed912
+parallel (1.28.0) sha256=33e6de1484baf2524792d178b0913fc8eb94c628d6cfe45599ad4458c638c970
+parser (3.3.11.1) sha256=d17ace7aabe3e72c3cc94043714be27cc6f852f104d81aa284c2281aecc65d54
+path_expander (2.0.1) sha256=2de201164bff4719cc4d0b3767286e9977cc832a59c4d70abab571ec86cb41e4
+pp (0.6.3) sha256=2951d514450b93ccfeb1df7d021cae0da16e0a7f95ee1e2273719669d0ab9df6
+prettyprint (0.2.0) sha256=2bc9e15581a94742064a3cc8b0fb9d45aae3d03a1baa6ef80922627a0766f193
+prism (1.9.0) sha256=7b530c6a9f92c24300014919c9dcbc055bf4cdf51ec30aed099b06cd6674ef85
+propshaft (1.3.2) sha256=1d56a3e56a92c21bfc29caf07406b5386b00d4c47ddf357cf989a5a234b1389e
+psych (5.4.0) sha256=14f72d69a611af663d7d70e4a7b67d9eb1f3ae9f8d916b478961d5a0075ba5b7
+public_suffix (7.0.5) sha256=1a8bb08f1bbea19228d3bed6e5ed908d1cb4f7c2726d18bd9cadf60bc676f623
+puma (8.0.2) sha256=c8ed871dfbbe66448ea9ffd46692342d9804d4071522b52b5331b7b6e7b686fb
+raabro (1.4.0) sha256=d4fa9ff5172391edb92b242eed8be802d1934b1464061ae5e70d80962c5da882
+racc (1.8.1) sha256=4a7f6929691dbec8b5209a0b373bc2614882b55fc5d2e447a21aaa691303d62f
+rack (3.2.6) sha256=5ed78e1f73b2e25679bec7d45ee2d4483cc4146eb1be0264fc4d94cb5ef212c2
+rack-session (2.1.2) sha256=595434f8c0c3473ae7d7ac56ecda6cc6dfd9d37c0b2b5255330aa1576967ffe8
+rack-test (2.2.0) sha256=005a36692c306ac0b4a9350355ee080fd09ddef1148a5f8b2ac636c720f5c463
+rackup (2.3.1) sha256=6c79c26753778e90983761d677a48937ee3192b3ffef6bc963c0950f94688868
+rails (8.1.3) sha256=6d017ba5348c98fc909753a8169b21d44de14d2a0b92d140d1a966834c3c9cd3
+rails-dom-testing (2.3.0) sha256=8acc7953a7b911ca44588bf08737bc16719f431a1cc3091a292bca7317925c1d
+rails-html-sanitizer (1.7.0) sha256=28b145cceaf9cc214a9874feaa183c3acba036c9592b19886e0e45efc62b1e89
+railties (8.1.3) sha256=913eb0e0cb520aac687ffd74916bd726d48fa21f47833c6292576ef6a286de22
+rainbow (3.1.1) sha256=039491aa3a89f42efa1d6dec2fc4e62ede96eb6acd95e52f1ad581182b79bc6a
+rake (13.4.2) sha256=cb825b2bd5f1f8e91ca37bddb4b9aaf345551b4731da62949be002fa89283701
+rdoc (7.2.0) sha256=8650f76cd4009c3b54955eb5d7e3a075c60a57276766ebf36f9085e8c9f23192
+reek (6.5.0) sha256=d26d3a492773b2bbc228888067a21afe33ac07954a17dbd64cdeae42c4c69be1
+regexp_parser (2.12.0) sha256=35a916a1d63190ab5c9009457136ae5f3c0c7512d60291d0d1378ba18ce08ebb
+reline (0.6.3) sha256=1198b04973565b36ec0f11542ab3f5cfeeec34823f4e54cebde90968092b1835
+rexml (3.4.4) sha256=19e0a2c3425dfbf2d4fc1189747bdb2f849b6c5e74180401b15734bc97b5d142
+rspec-core (3.13.6) sha256=a8823c6411667b60a8bca135364351dda34cd55e44ff94c4be4633b37d828b2d
+rspec-expectations (3.13.5) sha256=33a4d3a1d95060aea4c94e9f237030a8f9eae5615e9bd85718fe3a09e4b58836
+rspec-mocks (3.13.8) sha256=086ad3d3d17533f4237643de0b5c42f04b66348c28bf6b9c2d3f4a3b01af1d47
+rspec-rails (8.0.4) sha256=06235692fc0892683d3d34977e081db867434b3a24ae0dd0c6f3516bad4e22df
+rspec-support (3.13.7) sha256=0640e5570872aafefd79867901deeeeb40b0c9875a36b983d85f54fb7381c47c
+rubocop (1.88.0) sha256=e420ddf1662d0ef34bc8a2910ac4b396a7ddda0b51a708264405241734b08e0b
+rubocop-ast (1.49.1) sha256=4412f3ee70f6fe4546cc489548e0f6fcf76cafcfa80fa03af67098ffed755035
+rubocop-performance (1.26.1) sha256=cd19b936ff196df85829d264b522fd4f98b6c89ad271fa52744a8c11b8f71834
+rubocop-rails (2.35.4) sha256=3aeaa325439c89950e8327565682ea794065d08e2ecbbfe95032bfa295a35df5
+rubocop-rails-omakase (1.1.0) sha256=2af73ac8ee5852de2919abbd2618af9c15c19b512c4cfc1f9a5d3b6ef009109d
+ruby-progressbar (1.13.0) sha256=80fc9c47a9b640d6834e0dc7b3c94c9df37f08cb072b7761e4a71e22cff29b33
+ruby-vips (2.3.0) sha256=e685ec02c13969912debbd98019e50492e12989282da5f37d05f5471442f5374
+ruby_parser (3.22.0) sha256=1eb4937cd9eb220aa2d194e352a24dba90aef00751e24c8dfffdb14000f15d23
+rubycritic (5.0.0) sha256=7f3877556d7f52bf0980496b7c907a827a9592ba690b80a593403a60bd6cfb42
+rubyzip (3.4.0) sha256=6de39bc9eba302b635a476d16c9e16b0872ad24517c2f98f2b3a7ea23caff57b
+securerandom (0.4.1) sha256=cc5193d414a4341b6e225f0cb4446aceca8e50d5e1888743fac16987638ea0b1
+selenium-webdriver (4.44.0) sha256=6f1df072529af369589c46f0e01132952aabb250cfd683c274d74dc1eb5d8477
+sexp_processor (4.17.5) sha256=ae2b48ba98353d5d465ce8759836b7a05f2e12c5879fcd14d7815b026de32f0e
+simplecov (0.22.0) sha256=fe2622c7834ff23b98066bb0a854284b2729a569ac659f82621fc22ef36213a5
+simplecov-html (0.13.2) sha256=bd0b8e54e7c2d7685927e8d6286466359b6f16b18cb0df47b508e8d73c777246
+simplecov_json_formatter (0.1.4) sha256=529418fbe8de1713ac2b2d612aa3daa56d316975d307244399fa4838c601b428
+solid_cable (3.0.12) sha256=a168a54731a455d5627af48d8441ea3b554b8c1f6e6cd6074109de493e6b0460
+solid_cache (1.0.10) sha256=bc05a2fb3ac78a6f43cbb5946679cf9db67dd30d22939ededc385cb93e120d41
+solid_queue (1.4.0) sha256=e6a18d196f0b27cb6e3c77c5b31258b05fb634f8ed64fb1866ed164047216c2a
+sshkit (1.25.0) sha256=c8c6543cdb60f91f1d277306d585dd11b6a064cb44eab0972827e4311ff96744
+stimulus-rails (1.3.4) sha256=765676ffa1f33af64ce026d26b48e8ffb2e0b94e0f50e9119e11d6107d67cb06
+stringio (3.2.0) sha256=c37cb2e58b4ffbd33fe5cd948c05934af997b36e0b6ca6fdf43afa234cf222e1
+sys-uname (1.5.1) sha256=784d7e6491b0393c25cbbe5ac38324ac7be9fda083a6094832648af669386d7b
+sys-uname (1.5.1-universal-mingw32) sha256=aceb618e3276da5eae0ce368e9f6fae8c1f3e9ef23a0595cb88db7b6ecd45f62
+thor (1.5.0) sha256=e3a9e55fe857e44859ce104a84675ab6e8cd59c650a49106a05f55f136425e73
+thread_safe (0.3.6) sha256=9ed7072821b51c57e8d6b7011a8e282e25aeea3a4065eab326e43f66f063b05a
+thruster (0.1.21) sha256=dc67928f36e5894844579a95e45637a5091db7a7ea05468ee8c2c6eb0a3f77cf
+thruster (0.1.21-aarch64-linux) sha256=f5aff78fb7a6431ed3d6ab4bde03a89c461e9a73981dbc97d6990d85c3db235c
+thruster (0.1.21-arm64-darwin) sha256=bd8db9f57fae2cbb3fe08ebab49cb47fe49608122dac23daf0ce709adfb9bfc8
+thruster (0.1.21-x86_64-linux) sha256=6e2fbcf826540a72d3710ae4db072c2333287ac2ee57e7e52f35bc10900d74a7
+timeout (0.6.1) sha256=78f57368a7e7bbadec56971f78a3f5ecbcfb59b7fcbb0a3ed6ddc08a5094accb
+tsort (0.2.0) sha256=9650a793f6859a43b6641671278f79cfead60ac714148aabe4e3f0060480089f
+tty-which (0.5.0) sha256=5824055f0d6744c97e7c4426544f01d519c40d1806ef2ef47d9854477993f466
+turbo-rails (2.0.23) sha256=ee0d90733aafff056cf51ff11e803d65e43cae258cc55f6492020ec1f9f9315f
+tzinfo (2.0.6) sha256=8daf828cc77bcf7d63b0e3bdb6caa47e2272dcfaf4fbfe46f8c3a9df087a829b
+tzinfo-data (1.2026.2) sha256=7db0d3d3d53b8d7601fc183fccc8c6d056a3004e14eb59ea995bf6aec4ae10bc
+unicode-display_width (3.2.0) sha256=0cdd96b5681a5949cdbc2c55e7b420facae74c4aaf9a9815eee1087cb1853c42
+unicode-emoji (4.2.0) sha256=519e69150f75652e40bf736106cfbc8f0f73aa3fb6a65afe62fefa7f80b0f80f
+uri (1.1.1) sha256=379fa58d27ffb1387eaada68c749d1426738bd0f654d812fcc07e7568f5c57c6
+useragent (0.16.11) sha256=700e6413ad4bb954bb63547fa098dddf7b0ebe75b40cc6f93b8d54255b173844
+virtus (2.0.0) sha256=8841dae4eb7fcc097320ba5ea516bf1839e5d056c61ee27138aa4bddd6e3d1c2
+web-console (4.3.0) sha256=e13b71301cdfc2093f155b5aa3a622db80b4672d1f2f713119cc7ec7ac6a6da4
+websocket (1.2.11) sha256=b7e7a74e2410b5e85c25858b26b3322f29161e300935f70a0e0d3c35e0462737
+websocket-driver (0.8.1) sha256=5ab238238ce230e5d4b262d2be39624c867914eab99171dc4952b58b577c2d96
+websocket-extensions (0.1.5) sha256=1c6ba63092cda343eb53fc657110c71c754c56484aad42578495227d717a8241
+win32ole (1.9.3) sha256=01f43dc5dc13806e6e58204f538b4a28f3d85968ea89074abc9a3cd118e94d96
+xpath (3.2.0) sha256=6dfda79d91bb3b949b947ecc5919f042ef2f399b904013eb3ef6d20dd3a4082e
+zeitwerk (2.8.2) sha256=7212a61311083c604184b1ea2574b9aa05cd14f855a0841c06985cabe9181d12
+ +

BUNDLED WITH

+ +
4.0.10
+ +
+ + + + + + + + diff --git a/doc/HomeController.html b/doc/HomeController.html new file mode 100644 index 0000000000..df577c7807 --- /dev/null +++ b/doc/HomeController.html @@ -0,0 +1,1769 @@ + + + + + + + +class HomeController - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ + + + +

+ class HomeController +

+ +
+ +

Exibe a página inicial da aplicação após o login.

+ +

Requer que o usuário esteja autenticado. Serve como ponto de entrada genérico após o redirecionamento pós-login, quando o perfil do usuário ainda não foi determinado pelo SessionsController.

+ +
+ + + + + +
+ + + + + + + + diff --git a/doc/Object.html b/doc/Object.html new file mode 100644 index 0000000000..36be7227da --- /dev/null +++ b/doc/Object.html @@ -0,0 +1,1893 @@ + + + + + + + +class Object - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ + + + +

+ class Object +

+ +
+ +
+ + + + + +
+ + + + + + + + diff --git a/doc/README_md.html b/doc/README_md.html new file mode 100644 index 0000000000..2d7d2e8027 --- /dev/null +++ b/doc/README_md.html @@ -0,0 +1,1633 @@ + + + + + + + +README - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ + +

CAMAAR

+ +

Sistema para avaliação de atividades acadêmicas remotas do CIC

+ +
+ + + + + + + + diff --git a/doc/Rakefile.html b/doc/Rakefile.html new file mode 100644 index 0000000000..e607be43c3 --- /dev/null +++ b/doc/Rakefile.html @@ -0,0 +1,1634 @@ + + + + + + + +Rakefile - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

# Add your own tasks in files placed in lib/tasks ending in .rake, # for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.

+ +

require_relative “config/application”

+ +

Rails.application.load_tasks

+ +
+ + + + + + + + diff --git a/doc/RedefinicaoSenhasController.html b/doc/RedefinicaoSenhasController.html new file mode 100644 index 0000000000..feae7afee5 --- /dev/null +++ b/doc/RedefinicaoSenhasController.html @@ -0,0 +1,1967 @@ + + + + + + + +class RedefinicaoSenhasController - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ + + + +

+ class RedefinicaoSenhasController +

+ +
+ +

Gerencia o fluxo de redefinição de senha para usuários que já possuem conta ativa.

+ +

O usuário informa seu email (new/create), recebe um link por email com token único e utiliza esse token para acessar o formulário de nova senha (edit/update). Após a redefinição bem-sucedida, o token é invalidado para evitar reutilização.

+ +
+ + + + + +
+ + + + + + + + diff --git a/doc/RespostaElem.html b/doc/RespostaElem.html new file mode 100644 index 0000000000..22d213cb07 --- /dev/null +++ b/doc/RespostaElem.html @@ -0,0 +1,1699 @@ + + + + + + + +class RespostaElem - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ + + + +

+ class RespostaElem +

+ +
+ +

Representa a resposta de um usuário a um elemento (questão) específico do formulário.

+ +

Pertence a uma RespostaForm e ao ElementoForm respondido. Para questões de múltipla escolha, também referencia o CampoForm selecionado. Para questões de texto livre, campo_form é opcional e o conteúdo fica em texto_resposta.

+ +
+ + + + + +
+ + + + + + + + diff --git a/doc/RespostaElemsController.html b/doc/RespostaElemsController.html new file mode 100644 index 0000000000..9af62289b2 --- /dev/null +++ b/doc/RespostaElemsController.html @@ -0,0 +1,2071 @@ + + + + + + + +class RespostaElemsController - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ + + + +

+ class RespostaElemsController +

+ +
+ +

Gerencia o CRUD de respostas individuais a questões de formulários de avaliação.

+ +

Uma RespostaElem representa a resposta de um usuário a um ElementoForm específico, vinculada a uma RespostaForm. O fluxo principal de criação ocorre via +UsuariosController#submeter_resposta+; este controller expõe as operações individuais de CRUD para administração direta dos registros.

+ +
+ + + + + +
+ + + + + + + + diff --git a/doc/RespostaElemsHelper.html b/doc/RespostaElemsHelper.html new file mode 100644 index 0000000000..20c48c4e15 --- /dev/null +++ b/doc/RespostaElemsHelper.html @@ -0,0 +1,1686 @@ + + + + + + + +module RespostaElemsHelper - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ + + + +

+ module RespostaElemsHelper +

+ +
+ +
+ + + + + +
+ + + + + + + + diff --git a/doc/RespostaForm.html b/doc/RespostaForm.html new file mode 100644 index 0000000000..ad6555ea33 --- /dev/null +++ b/doc/RespostaForm.html @@ -0,0 +1,1699 @@ + + + + + + + +class RespostaForm - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ + + + +

+ class RespostaForm +

+ +
+ +

Representa a submissão completa de um formulário de avaliação por um usuário.

+ +

Registra qual Usuario respondeu qual Formulario e em que data. Um usuário só pode submeter uma resposta por formulário (unicidade do par usuario_id + formulario_id). Agrega os +RespostaElem+s com as respostas individuais a cada questão.

+ +
+ + + + + +
+ + + + + + + + diff --git a/doc/RespostaFormsController.html b/doc/RespostaFormsController.html new file mode 100644 index 0000000000..9f87bdcfa3 --- /dev/null +++ b/doc/RespostaFormsController.html @@ -0,0 +1,2071 @@ + + + + + + + +class RespostaFormsController - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ + + + +

+ class RespostaFormsController +

+ +
+ +

Gerencia o CRUD de respostas completas submetidas por usuários a formulários.

+ +

Uma RespostaForm representa a submissão de um usuário a um Formulario inteiro. O fluxo principal de submissão é tratado pelo UsuariosController; este controller expõe as operações individuais de CRUD para administração direta dos registros de resposta.

+ +
+ + + + + +
+ + + + + + + + diff --git a/doc/RespostaFormsHelper.html b/doc/RespostaFormsHelper.html new file mode 100644 index 0000000000..57a0e7194a --- /dev/null +++ b/doc/RespostaFormsHelper.html @@ -0,0 +1,1686 @@ + + + + + + + +module RespostaFormsHelper - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ + + + +

+ module RespostaFormsHelper +

+ +
+ +
+ + + + + +
+ + + + + + + + diff --git a/doc/SessionsController.html b/doc/SessionsController.html new file mode 100644 index 0000000000..35d405cd62 --- /dev/null +++ b/doc/SessionsController.html @@ -0,0 +1,1901 @@ + + + + + + + +class SessionsController - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ + + + +

+ class SessionsController +

+ +
+ +

Gerencia o ciclo de vida da sessão de autenticação do usuário.

+ +

Responsável pelo login (criação de sessão com verificação de credenciais via email ou matrícula) e pelo logout (destruição da sessão). Redireciona o usuário para a página correta de acordo com o seu perfil (Administrador ou demais).

+ +
+ + + + + +
+ + + + + + + + diff --git a/doc/SigaaImporter.html b/doc/SigaaImporter.html new file mode 100644 index 0000000000..5c27d6e121 --- /dev/null +++ b/doc/SigaaImporter.html @@ -0,0 +1,1991 @@ + + + + + + + +class SigaaImporter - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ + + + +

+ class SigaaImporter +

+ +
+ +

Serviço responsável pela importação e atualização de dados acadêmicos a partir dos arquivos JSON exportados pelo SIGAA (Sistema Integrado de Gestão de Atividades Acadêmicas).

+ +

Processa dois arquivos: o de turmas/disciplinas (classes.json) e o de membros (class_members.json), criando ou atualizando +Departamento+s, +Disciplina+s, +Turma+s, +Docente+s, +Discente+s e +Curso+s dentro de uma única transação. Toda a lógica de persistência é encapsulada em métodos privados especializados, mantendo os métodos públicos enxutos.

+ +

Os métodos de classe (self.import_from_files, self.update_from_files) são a interface pública recomendada; eles delegam para instâncias privadas para facilitar testes e reutilização interna.

+ +
+ + + + + +
+ + + + + + + + diff --git a/doc/Template.html b/doc/Template.html new file mode 100644 index 0000000000..bb4b74cb81 --- /dev/null +++ b/doc/Template.html @@ -0,0 +1,1699 @@ + + + + + + + +class Template - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ + + + +

+ class Template +

+ +
+ +

Representa um modelo reutilizável de formulário criado por um Administrador.

+ +

Contém um conjunto ordenado de +Elemento+s (questões), cada um com seus +Campo+s (opções). Ao ser enviado a turmas, o template é instanciado em +Formulario+s com +ElementoForm+s e +CampoForm+s correspondentes.

+ +
+ + + + + +
+ + + + + + + + diff --git a/doc/TemplatesController.html b/doc/TemplatesController.html new file mode 100644 index 0000000000..6353c456ec --- /dev/null +++ b/doc/TemplatesController.html @@ -0,0 +1,2107 @@ + + + + + + + +class TemplatesController - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ + + + +

+ class TemplatesController +

+ +
+ +

Gerencia o CRUD de templates de formulário de avaliação.

+ +

Templates são modelos reutilizáveis criados por administradores que definem a estrutura de uma avaliação (questões e opções de resposta). Cada administrador só pode gerenciar seus próprios templates. Utiliza o layout “gerenciamento” e suporta criação e edição de elementos e campos via nested attributes.

+ +
+ + + + + +
+ + + + + + + + diff --git a/doc/TemplatesHelper.html b/doc/TemplatesHelper.html new file mode 100644 index 0000000000..baba7c4503 --- /dev/null +++ b/doc/TemplatesHelper.html @@ -0,0 +1,1686 @@ + + + + + + + +module TemplatesHelper - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ + + + +

+ module TemplatesHelper +

+ +
+ +
+ + + + + +
+ + + + + + + + diff --git a/doc/Turma.html b/doc/Turma.html new file mode 100644 index 0000000000..ff0b50127d --- /dev/null +++ b/doc/Turma.html @@ -0,0 +1,1699 @@ + + + + + + + +class Turma - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ + + + +

+ class Turma +

+ +
+ +

Representa uma oferta de disciplina em um determinado semestre.

+ +

Agrupa +Discente+s e +Docente+s que cursam/ministram uma Disciplina em um semestre específico. Cada turma pode ter múltiplos +Formulario+s de avaliação associados. O número da turma é único dentro do escopo de semestre e disciplina.

+ +
+ + + + + +
+ + + + + + + + diff --git a/doc/TurmasController.html b/doc/TurmasController.html new file mode 100644 index 0000000000..5b2b75e075 --- /dev/null +++ b/doc/TurmasController.html @@ -0,0 +1,2071 @@ + + + + + + + +class TurmasController - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ + + + +

+ class TurmasController +

+ +
+ +

Gerencia o CRUD de turmas.

+ +

Turmas representam a oferta de uma disciplina em um semestre, agrupando docentes e discentes. Este controller oferece as operações básicas de listagem, visualização, criação, edição e exclusão de turmas.

+ +
+ + + + + +
+ + + + + + + + diff --git a/doc/TurmasHelper.html b/doc/TurmasHelper.html new file mode 100644 index 0000000000..32565c8aed --- /dev/null +++ b/doc/TurmasHelper.html @@ -0,0 +1,1686 @@ + + + + + + + +module TurmasHelper - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ + + + +

+ module TurmasHelper +

+ +
+ +
+ + + + + +
+ + + + + + + + diff --git a/doc/Usuario.html b/doc/Usuario.html new file mode 100644 index 0000000000..71c24bcd2e --- /dev/null +++ b/doc/Usuario.html @@ -0,0 +1,2202 @@ + + + + + + + +class Usuario - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ + + + +

+ class Usuario +

+ +
+ +

Classe base para todos os usuários do sistema (STI).

+ +

Gerencia autenticação via BCrypt e tokens de email para definição e redefinição de senha. As subclasses concretas são Administrador, Docente e Discente, diferenciadas pela coluna type (Single Table Inheritance).

+ +
+ + + + + +
+ + + + + + + + diff --git a/doc/UsuarioMailer.html b/doc/UsuarioMailer.html new file mode 100644 index 0000000000..c7aed73c96 --- /dev/null +++ b/doc/UsuarioMailer.html @@ -0,0 +1,1824 @@ + + + + + + + +class UsuarioMailer - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ + + + +

+ class UsuarioMailer +

+ +
+ +
+ + + + + +
+ + + + + + + + diff --git a/doc/UsuariosController.html b/doc/UsuariosController.html new file mode 100644 index 0000000000..adb4e28f19 --- /dev/null +++ b/doc/UsuariosController.html @@ -0,0 +1,2288 @@ + + + + + + + +class UsuariosController - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ + + + +

+ class UsuariosController +

+ +
+ +

Gerencia o cadastro de usuários e o fluxo de resposta a formulários de avaliação.

+ +

As ações de CRUD (index, show, new, edit, create, update, destroy) são restritas a administradores. As ações avaliacoes, responder_formulario e submeter_resposta são acessíveis a qualquer usuário autenticado e compõem o fluxo pelo qual docentes e discentes visualizam e respondem formulários de avaliação das suas turmas.

+ +
+ + + + + +
+ + + + + + + + diff --git a/doc/UsuariosHelper.html b/doc/UsuariosHelper.html new file mode 100644 index 0000000000..41af8b6efe --- /dev/null +++ b/doc/UsuariosHelper.html @@ -0,0 +1,1686 @@ + + + + + + + +module UsuariosHelper - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ + + + +

+ module UsuariosHelper +

+ +
+ +
+ + + + + +
+ + + + + + + + diff --git a/doc/app/assets/stylesheets/application_css.html b/doc/app/assets/stylesheets/application_css.html new file mode 100644 index 0000000000..a7ba1523a5 --- /dev/null +++ b/doc/app/assets/stylesheets/application_css.html @@ -0,0 +1,1640 @@ + + + + + + + +application.css - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

/*

+ +
* This is a manifest file that'll be compiled into application.css.
+*
+* With Propshaft, assets are served efficiently without preprocessing steps. You can still include
+* application-wide styles in this file, but keep in mind that CSS precedence will follow the standard
+* cascading order, meaning styles declared later in the document or manifest will override earlier ones,
+* depending on specificity.
+*
+* Consider organizing styles into separate files for maintainability.
+*/
+ +
+ + + + + + + + diff --git a/doc/app/assets/stylesheets/gerenciamento_css.html b/doc/app/assets/stylesheets/gerenciamento_css.html new file mode 100644 index 0000000000..1dca12d4b5 --- /dev/null +++ b/doc/app/assets/stylesheets/gerenciamento_css.html @@ -0,0 +1,2160 @@ + + + + + + + +gerenciamento.css - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

body, html {

+ +
margin: 0;
+padding: 0;
+height: 100vh;
+font-family: 'Roboto', 'Poppins', sans-serif;
+background: #DBDBDB;
+ +

}

+ +

.admin-container {

+ +
display: flex;
+flex-direction: column;
+height: 100vh;
+overflow: hidden;
+ +

}

+ +

.admin-header {

+ +
height: 60px;
+min-height: 60px;
+background: #FFFFFF;
+box-shadow: 0px 11px 10.7px rgba(0, 0, 0, 0.05);
+display: flex;
+justify-content: space-between;
+align-items: center;
+padding: 0 20px;
+z-index: 10;
+ +

}

+ +

.header-left, .header-right {

+ +
display: flex;
+align-items: center;
+gap: 24px;
+ +

}

+ +

.tab-name {

+ +
font-size: 24px;
+font-weight: 400;
+color: #000000;
+margin: 0;
+ +

}

+ +

.search-container {

+ +
width: 271px;
+height: 40px;
+border: 1px solid #8E8E8E;
+border-radius: 47px;
+display: flex;
+align-items: center;
+padding: 0 15px;
+box-sizing: border-box;
+ +

}

+ +

.search-input {

+ +
border: none;
+background: transparent;
+outline: none;
+width: 100%;
+font-family: 'Roboto', sans-serif;
+font-size: 14px;
+ +

}

+ +

.user-avatar {

+ +
width: 44px;
+height: 44px;
+background: #6C2365;
+border-radius: 50%;
+display: flex;
+justify-content: center;
+align-items: center;
+color: #FFFFFF;
+font-size: 24px;
+font-weight: 500;
+ +

}

+ +

.admin-body {

+ +
display: flex;
+flex: 1;
+overflow: hidden;
+ +

}

+ +

.admin-sidebar {

+ +
width: 257px;
+min-width: 257px;
+background: #FFFFFF;
+display: flex;
+flex-direction: column;
+border-right: 1px solid #D9D9D9;
+padding-top: 10px;
+ +

}

+ +

.menu-item {

+ +
height: 46px;
+display: flex;
+justify-content: center;
+align-items: center;
+border-bottom: 1px solid #D9D9D9;
+text-decoration: none;
+color: #000000;
+font-size: 16px;
+ +

}

+ +

.menu-item.active {

+ +
background: #6C2365;
+color: #FFFFFF;
+ +

}

+ +

.admin-content {

+ +
flex: 1;
+background: #DBDBDB;
+padding: 25px 43px;
+display: flex;
+flex-direction: column;
+align-items: center;
+gap: 50px;
+overflow-y: auto;
+ +

}

+ +

.figma-card {

+ +
width: 462px;
+height: 655px; 
+background: #FFFFFF;
+border-radius: 8px;
+display: flex;
+flex-direction: column;
+justify-content: flex-start; 
+align-items: center;
+padding-top: 40px; 
+gap: 15px;
+ +

}

+ +

.btn-figma {

+ +
width: 302px;
+height: 43px;
+display: flex;
+justify-content: center;
+align-items: center;
+border-radius: 6px;
+font-family: 'Poppins', sans-serif;
+font-weight: 500;
+font-size: 16px;
+text-decoration: none;
+border: none;
+cursor: pointer;
+box-shadow: 0px 1px 2px rgba(105, 81, 255, 0.05);
+background: #86EFAC; 
+color: #1e1e1e; 
+transition: background-color 0.2s ease-in-out, color 0.2s ease-in-out;
+ +

}

+ +

.btn-figma:hover {

+ +
background: #22C55E;
+color: #F0FDF4;
+ +

}

+ +

.flash-message.notice {

+ +
background-color: #d1fae5; 
+color: #065f46;
+border: 1px solid #10b981;
+ +

}

+ +

.flash-message.alert {

+ +
background-color: #fee2e2; 
+color: #991b1b;
+border: 1px solid #ef4444;
+ +

}

+ +

.templates-grid {

+ +
display: grid;
+grid-template-columns: repeat(auto-fill, 278px);
+gap: 50px;
+padding: 25px 43px;
+width: 100%;
+justify-content: flex-start;
+ +

}

+ +

.card {

+ +
width: 278px;
+height: 82px;
+background: #FFFFFF;
+border-radius: 8px;
+padding: 24px;
+display: flex;
+justify-content: space-between;
+align-items: center;
+box-sizing: border-box;
+ +

}

+ +

.template-title {

+ +
font-family: 'Roboto', sans-serif;
+font-size: 24px;
+font-weight: 500;
+margin: 0;
+color: #000000;
+ +

}

+ +

.template-semester {

+ +
font-family: 'Roboto', sans-serif;
+font-size: 16px;
+font-weight: 400;
+margin: 5px 0 0 0;
+color: #000000;
+ +

}

+ +

.card-actions {

+ +
display: flex;
+gap: 10px;
+ +

}

+ +

.action-btn {

+ +
background: none;
+border: none;
+cursor: pointer;
+font-size: 16px;
+ +

}

+ +

.card-create-new {

+ +
width: 278px;
+height: 82px;
+background: #FFFFFF;
+border-radius: 8px;
+display: flex;
+justify-content: center;
+align-items: center;
+text-decoration: none;
+color: #000;
+border: 2px dashed #000000;
+box-sizing: border-box;
+ +

}

+ +

.plus-icon {

+ +
font-size: 30px;
+font-weight: bold;
+ +

}

+ +

.icon-wrapper svg {

+ +
width: 14px;
+height: 14px;
+fill: #000000; 
+transition: fill 0.2s;
+ +

}

+ +

.action-btn:hover .icon-wrapper svg {

+ +
fill: #6C2365;
+ +

}

+ +

.template-modal {

+ +
width: 453px;
+background: #FFFFFF;
+box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.5);
+padding: 20px;
+margin: 85px auto;
+border-radius: 8px;
+ +

}

+ +

.form-group {

+ +
display: flex;
+align-items: center;
+gap: 10px;
+margin-bottom: 20px;
+ +

}

+ +

input, .dropdown {

+ +
border: none;
+border-bottom: 1px solid #000;
+width: 280px;
+padding: 5px;
+ +

}

+ +

.btn-save {

+ +
background: #22C55E;
+color: #F0FDF4;
+border: none;
+padding: 12px 18px;
+border-radius: 6px;
+width: 125px;
+margin: 0 auto;
+display: block;
+cursor: pointer;
+ +

}

+ +

.modal-overlay {

+ +
position: fixed;
+top: 0;
+left: 0;
+width: 100vw;
+height: 100vh;
+background: rgba(0, 0, 0, 0.3);
+display: flex;
+justify-content: center;
+align-items: center;
+z-index: 1000;
+ +

}

+ +

.figma-form-card {

+ +
width: 453px;
+background: #FFFFFF;
+box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.5);
+border-radius: 8px; 
+padding: 20px 24px;
+display: flex;
+flex-direction: column;
+gap: 20px;
+ +

}

+ +

.figma-form-content {

+ +
display: flex;
+flex-direction: column;
+gap: 20px;
+ +

}

+ +

/* Nome do template */ .form-header-group {

+ +
display: flex;
+align-items: center;
+gap: 15px;
+ +

}

+ +

.figma-label {

+ +
font-family: 'Inter', sans-serif;
+font-size: 14px;
+color: #000000;
+white-space: nowrap;
+ +

}

+ +

.figma-input-line {

+ +
border: none;
+border-bottom: 1px solid #000000;
+width: 100%;
+font-family: 'Roboto', sans-serif;
+font-size: 13px;
+padding: 5px 0;
+outline: none;
+background: transparent;
+ +

}

+ +

.figma-input-line::placeholder {

+ +
color: #8E8E8E;
+ +

}

+ +

/* Blocos de Questão */ .question-block {

+ +
display: flex;
+flex-direction: column;
+gap: 14px;
+ +

}

+ +

.question-title {

+ +
font-family: 'Roboto', sans-serif;
+font-size: 16px;
+font-weight: 500;
+color: #000000;
+margin: 0;
+ +

}

+ +

.question-row {

+ +
display: flex;
+align-items: center;
+gap: 15px;
+ +

}

+ +

.figma-label-small {

+ +
font-family: 'Inter', sans-serif;
+font-size: 12px;
+color: #000000;
+width: 50px;
+ +

}

+ +

.figma-dropdown {

+ +
background: #FFFFFF;
+border: 1px solid #E0E0E0;
+border-radius: 8px;
+padding: 6px 12px;
+font-family: 'Inter', sans-serif;
+font-size: 12px;
+color: #828282;
+width: 163px;
+outline: none;
+ +

}

+ +

.figma-input-line-full {

+ +
border: none;
+border-bottom: 1px solid #000000;
+flex-grow: 1;
+font-family: 'Roboto', sans-serif;
+font-size: 13px;
+padding: 5px 0;
+outline: none;
+ +

}

+ +

/* Botão roxo de adicionar (+) */ .add-question-btn {

+ +
width: 34px;
+height: 34px;
+background: #6C2365;
+color: #FFF;
+display: flex;
+justify-content: center;
+align-items: center;
+font-size: 20px;
+font-weight: bold;
+border-radius: 4px;
+cursor: pointer;
+margin: 0 auto;
+ +

}

+ +

.submit-row {

+ +
display: flex;
+justify-content: center;
+margin-top: 10px;
+ +

}

+ +

.btn-figma-success {

+ +
background: #22C55E;
+color: #F0FDF4;
+font-family: 'Poppins', sans-serif;
+font-weight: 500;
+font-size: 16px;
+border: none;
+border-radius: 6px;
+padding: 10px 30px;
+cursor: pointer;
+box-shadow: 0px 1px 2px rgba(105, 81, 255, 0.05);
+ +

}

+ +

.cancel-row {

+ +
display: flex;
+justify-content: center;
+ +

}

+ +

.btn-cancel {

+ +
font-family: 'Inter', sans-serif;
+font-size: 12px;
+color: #828282;
+text-decoration: underline;
+ +

}

+ +
+ + + + + + + + diff --git a/doc/app/assets/stylesheets/login_css.html b/doc/app/assets/stylesheets/login_css.html new file mode 100644 index 0000000000..6cdc67162c --- /dev/null +++ b/doc/app/assets/stylesheets/login_css.html @@ -0,0 +1,1747 @@ + + + + + + + +login.css - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

body {

+ +
background: #efefef;
+margin: 0;
+font-family: Arial, sans-serif;
+ +

}

+ +

.login-container {

+ +
width: 90%;
+max-width: 1100px;
+height: 500px;
+
+margin: 40px auto;
+
+display: flex;
+
+background: white;
+border-radius: 10px;
+
+overflow: hidden;
+ +

}

+ +

.login-form {

+ +
flex: 1;
+
+display: flex;
+flex-direction: column;
+justify-content: center;
+
+padding: 50px;
+ +

}

+ +

.login-form h1 {

+ +
text-align: center;
+margin-bottom: 40px;
+ +

}

+ +

.field {

+ +
margin-bottom: 20px;
+ +

}

+ +

.field label {

+ +
display: block;
+margin-bottom: 8px;
+ +

}

+ +

.field input {

+ +
width: 100%;
+box-sizing: border-box;
+
+padding: 12px;
+
+border: 1px solid #ccc;
+border-radius: 6px;
+ +

}

+ +

.btn-login {

+ +
width: 100%;
+
+padding: 12px;
+
+border: none;
+border-radius: 6px;
+
+background: #2ecc71;
+color: white;
+
+cursor: pointer;
+
+font-size: 16px;
+ +

}

+ +

.btn-login:hover {

+ +
opacity: 0.9;
+ +

}

+ +

.btn-forgot {

+ +
margin-top: 15px;
+ +

}

+ +

.login-banner {

+ +
flex: 1;
+
+background: #6d1f6d;
+
+display: flex;
+justify-content: center;
+align-items: center;
+ +

}

+ +

.login-banner h2 {

+ +
color: white;
+text-align: center;
+font-size: 4rem;
+ +

}

+ +
+ + + + + + + + diff --git a/doc/app/assets/stylesheets/redefinir_senha_css.html b/doc/app/assets/stylesheets/redefinir_senha_css.html new file mode 100644 index 0000000000..25f8b84477 --- /dev/null +++ b/doc/app/assets/stylesheets/redefinir_senha_css.html @@ -0,0 +1,1729 @@ + + + + + + + +redefinir_senha.css - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

html, body {

+ +
margin: 0;
+padding: 0;
+height: 100%;
+font-family: Arial, Helvetica, sans-serif;
+background-color: #f5f5f5;
+ +

}

+ +

.password-reset-container {

+ +
height: 100vh;
+
+display: flex;
+justify-content: center;
+align-items: center;
+ +

}

+ +

.password-reset-box {

+ +
width: 100%;
+max-width: 450px;
+
+background: white;
+
+padding: 40px;
+
+border-radius: 10px;
+
+box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
+
+box-sizing: border-box;
+ +

}

+ +

.password-reset-box h1 {

+ +
text-align: center;
+
+margin-top: 0;
+margin-bottom: 30px;
+
+font-size: 2rem;
+font-weight: normal;
+ +

}

+ +

.field {

+ +
display: flex;
+flex-direction: column;
+
+margin-bottom: 20px;
+ +

}

+ +

.field label {

+ +
margin-bottom: 8px;
+ +

}

+ +

.field input {

+ +
padding: 12px;
+
+border: 1px solid #d0d0d0;
+border-radius: 6px;
+
+font-size: 1rem;
+box-sizing: border-box;
+ +

}

+ +

.btn-submit {

+ +
width: 100%;
+
+padding: 12px;
+
+border: none;
+border-radius: 6px;
+
+background-color: #6e1f69;
+color: white;
+
+font-size: 1rem;
+font-weight: bold;
+
+cursor: pointer;
+ +

}

+ +

.btn-submit:hover {

+ +
opacity: 0.9;
+ +

}

+ +
+ + + + + + + + diff --git a/doc/app/javascript/application_js.html b/doc/app/javascript/application_js.html new file mode 100644 index 0000000000..64be1c2e48 --- /dev/null +++ b/doc/app/javascript/application_js.html @@ -0,0 +1,1630 @@ + + + + + + + +application.js - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

// Configure your import map in config/importmap.rb. Read more: github.com/rails/importmap-rails import “@hotwired/turbo-rails” import “controllers”

+ +
+ + + + + + + + diff --git a/doc/app/javascript/controllers/application_js.html b/doc/app/javascript/controllers/application_js.html new file mode 100644 index 0000000000..4445fdee4d --- /dev/null +++ b/doc/app/javascript/controllers/application_js.html @@ -0,0 +1,1636 @@ + + + + + + + +application.js - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

import { Application } from “@hotwired/stimulus”

+ +

const application = Application.start()

+ +

// Configure Stimulus development experience application.debug = false window.Stimulus = application

+ +

export { application }

+ +
+ + + + + + + + diff --git a/doc/app/javascript/controllers/hello_controller_js.html b/doc/app/javascript/controllers/hello_controller_js.html new file mode 100644 index 0000000000..4f725b57e7 --- /dev/null +++ b/doc/app/javascript/controllers/hello_controller_js.html @@ -0,0 +1,1639 @@ + + + + + + + +hello_controller.js - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

import { Controller } from “@hotwired/stimulus”

+ +

export default class extends Controller {

+ +
connect() {
+  this.element.textContent = "Hello World!"
+}
+
+ +

}

+ +
+ + + + + + + + diff --git a/doc/app/javascript/controllers/index_js.html b/doc/app/javascript/controllers/index_js.html new file mode 100644 index 0000000000..b9d7c271ce --- /dev/null +++ b/doc/app/javascript/controllers/index_js.html @@ -0,0 +1,1630 @@ + + + + + + + +index.js - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

// Import and register all your controllers from the importmap via controllers/**/*_controller import { application } from “controllers/application” import { eagerLoadControllersFrom } from “@hotwired/stimulus-loading” eagerLoadControllersFrom(“controllers”, application)

+ +
+ + + + + + + + diff --git a/doc/app/views/campo_forms/_campo_form_json_jbuilder.html b/doc/app/views/campo_forms/_campo_form_json_jbuilder.html new file mode 100644 index 0000000000..4f497ffd1b --- /dev/null +++ b/doc/app/views/campo_forms/_campo_form_json_jbuilder.html @@ -0,0 +1,1630 @@ + + + + + + + +_campo_form.json.jbuilder - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

json.extract! campo_form, :id, :ordem, :enunciado, :elemento_form_id, :created_at, :updated_at json.url campo_form_url(campo_form, format: :json)

+ +
+ + + + + + + + diff --git a/doc/app/views/campo_forms/index_json_jbuilder.html b/doc/app/views/campo_forms/index_json_jbuilder.html new file mode 100644 index 0000000000..0e6ddaf7d4 --- /dev/null +++ b/doc/app/views/campo_forms/index_json_jbuilder.html @@ -0,0 +1,1630 @@ + + + + + + + +index.json.jbuilder - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

json.array! @campo_forms, partial: “campo_forms/campo_form”, as: :campo_form

+ +
+ + + + + + + + diff --git a/doc/app/views/campo_forms/show_json_jbuilder.html b/doc/app/views/campo_forms/show_json_jbuilder.html new file mode 100644 index 0000000000..4103965244 --- /dev/null +++ b/doc/app/views/campo_forms/show_json_jbuilder.html @@ -0,0 +1,1630 @@ + + + + + + + +show.json.jbuilder - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

json.partial! “campo_forms/campo_form”, campo_form: @campo_form

+ +
+ + + + + + + + diff --git a/doc/app/views/campos/_campo_json_jbuilder.html b/doc/app/views/campos/_campo_json_jbuilder.html new file mode 100644 index 0000000000..ded0e5d4c1 --- /dev/null +++ b/doc/app/views/campos/_campo_json_jbuilder.html @@ -0,0 +1,1630 @@ + + + + + + + +_campo.json.jbuilder - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

json.extract! campo, :id, :ordem, :enunciado, :tipo_elemento, :elemento_id, :created_at, :updated_at json.url campo_url(campo, format: :json)

+ +
+ + + + + + + + diff --git a/doc/app/views/campos/index_json_jbuilder.html b/doc/app/views/campos/index_json_jbuilder.html new file mode 100644 index 0000000000..efc9ebe29a --- /dev/null +++ b/doc/app/views/campos/index_json_jbuilder.html @@ -0,0 +1,1630 @@ + + + + + + + +index.json.jbuilder - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

json.array! @campos, partial: “campos/campo”, as: :campo

+ +
+ + + + + + + + diff --git a/doc/app/views/campos/show_json_jbuilder.html b/doc/app/views/campos/show_json_jbuilder.html new file mode 100644 index 0000000000..0ce08fdfc9 --- /dev/null +++ b/doc/app/views/campos/show_json_jbuilder.html @@ -0,0 +1,1630 @@ + + + + + + + +show.json.jbuilder - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

json.partial! “campos/campo”, campo: @campo

+ +
+ + + + + + + + diff --git a/doc/app/views/cursos/_curso_json_jbuilder.html b/doc/app/views/cursos/_curso_json_jbuilder.html new file mode 100644 index 0000000000..ffb4430c29 --- /dev/null +++ b/doc/app/views/cursos/_curso_json_jbuilder.html @@ -0,0 +1,1630 @@ + + + + + + + +_curso.json.jbuilder - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

json.extract! curso, :id, :codigo, :nome, :departamento_id, :created_at, :updated_at json.url curso_url(curso, format: :json)

+ +
+ + + + + + + + diff --git a/doc/app/views/cursos/index_json_jbuilder.html b/doc/app/views/cursos/index_json_jbuilder.html new file mode 100644 index 0000000000..62e50c2868 --- /dev/null +++ b/doc/app/views/cursos/index_json_jbuilder.html @@ -0,0 +1,1630 @@ + + + + + + + +index.json.jbuilder - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

json.array! @cursos, partial: “cursos/curso”, as: :curso

+ +
+ + + + + + + + diff --git a/doc/app/views/cursos/show_json_jbuilder.html b/doc/app/views/cursos/show_json_jbuilder.html new file mode 100644 index 0000000000..0dd24e5626 --- /dev/null +++ b/doc/app/views/cursos/show_json_jbuilder.html @@ -0,0 +1,1630 @@ + + + + + + + +show.json.jbuilder - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

json.partial! “cursos/curso”, curso: @curso

+ +
+ + + + + + + + diff --git a/doc/app/views/departamentos/_departamento_json_jbuilder.html b/doc/app/views/departamentos/_departamento_json_jbuilder.html new file mode 100644 index 0000000000..f2563a3e4b --- /dev/null +++ b/doc/app/views/departamentos/_departamento_json_jbuilder.html @@ -0,0 +1,1630 @@ + + + + + + + +_departamento.json.jbuilder - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

json.extract! departamento, :id, :codigo, :nome, :created_at, :updated_at json.url departamento_url(departamento, format: :json)

+ +
+ + + + + + + + diff --git a/doc/app/views/departamentos/index_json_jbuilder.html b/doc/app/views/departamentos/index_json_jbuilder.html new file mode 100644 index 0000000000..7f601e2874 --- /dev/null +++ b/doc/app/views/departamentos/index_json_jbuilder.html @@ -0,0 +1,1630 @@ + + + + + + + +index.json.jbuilder - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

json.array! @departamentos, partial: “departamentos/departamento”, as: :departamento

+ +
+ + + + + + + + diff --git a/doc/app/views/departamentos/show_json_jbuilder.html b/doc/app/views/departamentos/show_json_jbuilder.html new file mode 100644 index 0000000000..a2cb0cb92a --- /dev/null +++ b/doc/app/views/departamentos/show_json_jbuilder.html @@ -0,0 +1,1630 @@ + + + + + + + +show.json.jbuilder - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

json.partial! “departamentos/departamento”, departamento: @departamento

+ +
+ + + + + + + + diff --git a/doc/app/views/discentes/_discente_json_jbuilder.html b/doc/app/views/discentes/_discente_json_jbuilder.html new file mode 100644 index 0000000000..8ee2f4aad8 --- /dev/null +++ b/doc/app/views/discentes/_discente_json_jbuilder.html @@ -0,0 +1,1630 @@ + + + + + + + +_discente.json.jbuilder - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

json.extract! discente, :id, :matricula, :email, :nome, :formacao, :curso_id, :created_at, :updated_at json.url discente_url(discente, format: :json)

+ +
+ + + + + + + + diff --git a/doc/app/views/discentes/index_json_jbuilder.html b/doc/app/views/discentes/index_json_jbuilder.html new file mode 100644 index 0000000000..218837d128 --- /dev/null +++ b/doc/app/views/discentes/index_json_jbuilder.html @@ -0,0 +1,1630 @@ + + + + + + + +index.json.jbuilder - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

json.array! @discentes, partial: “discentes/discente”, as: :discente

+ +
+ + + + + + + + diff --git a/doc/app/views/discentes/show_json_jbuilder.html b/doc/app/views/discentes/show_json_jbuilder.html new file mode 100644 index 0000000000..c113ae2186 --- /dev/null +++ b/doc/app/views/discentes/show_json_jbuilder.html @@ -0,0 +1,1630 @@ + + + + + + + +show.json.jbuilder - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

json.partial! “discentes/discente”, discente: @discente

+ +
+ + + + + + + + diff --git a/doc/app/views/disciplinas/_disciplina_json_jbuilder.html b/doc/app/views/disciplinas/_disciplina_json_jbuilder.html new file mode 100644 index 0000000000..1458bf742a --- /dev/null +++ b/doc/app/views/disciplinas/_disciplina_json_jbuilder.html @@ -0,0 +1,1630 @@ + + + + + + + +_disciplina.json.jbuilder - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

json.extract! disciplina, :id, :codigo, :nome, :departamento_id, :created_at, :updated_at json.url disciplina_url(disciplina, format: :json)

+ +
+ + + + + + + + diff --git a/doc/app/views/disciplinas/index_json_jbuilder.html b/doc/app/views/disciplinas/index_json_jbuilder.html new file mode 100644 index 0000000000..140e045aa5 --- /dev/null +++ b/doc/app/views/disciplinas/index_json_jbuilder.html @@ -0,0 +1,1630 @@ + + + + + + + +index.json.jbuilder - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

json.array! @disciplinas, partial: “disciplinas/disciplina”, as: :disciplina

+ +
+ + + + + + + + diff --git a/doc/app/views/disciplinas/show_json_jbuilder.html b/doc/app/views/disciplinas/show_json_jbuilder.html new file mode 100644 index 0000000000..ac63d0a320 --- /dev/null +++ b/doc/app/views/disciplinas/show_json_jbuilder.html @@ -0,0 +1,1630 @@ + + + + + + + +show.json.jbuilder - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

json.partial! “disciplinas/disciplina”, disciplina: @disciplina

+ +
+ + + + + + + + diff --git a/doc/app/views/docentes/_docente_json_jbuilder.html b/doc/app/views/docentes/_docente_json_jbuilder.html new file mode 100644 index 0000000000..a4ff3ccb2e --- /dev/null +++ b/doc/app/views/docentes/_docente_json_jbuilder.html @@ -0,0 +1,1630 @@ + + + + + + + +_docente.json.jbuilder - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

json.extract! docente, :id, :matricula, :email, :nome, :formacao, :created_at, :updated_at json.url docente_url(docente, format: :json)

+ +
+ + + + + + + + diff --git a/doc/app/views/docentes/index_json_jbuilder.html b/doc/app/views/docentes/index_json_jbuilder.html new file mode 100644 index 0000000000..381ffd769e --- /dev/null +++ b/doc/app/views/docentes/index_json_jbuilder.html @@ -0,0 +1,1630 @@ + + + + + + + +index.json.jbuilder - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

json.array! @docentes, partial: “docentes/docente”, as: :docente

+ +
+ + + + + + + + diff --git a/doc/app/views/docentes/show_json_jbuilder.html b/doc/app/views/docentes/show_json_jbuilder.html new file mode 100644 index 0000000000..5f5d996bd1 --- /dev/null +++ b/doc/app/views/docentes/show_json_jbuilder.html @@ -0,0 +1,1630 @@ + + + + + + + +show.json.jbuilder - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

json.partial! “docentes/docente”, docente: @docente

+ +
+ + + + + + + + diff --git a/doc/app/views/elemento_forms/_elemento_form_json_jbuilder.html b/doc/app/views/elemento_forms/_elemento_form_json_jbuilder.html new file mode 100644 index 0000000000..cac26faf52 --- /dev/null +++ b/doc/app/views/elemento_forms/_elemento_form_json_jbuilder.html @@ -0,0 +1,1630 @@ + + + + + + + +_elemento_form.json.jbuilder - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

json.extract! elemento_form, :id, :ordem, :enunciado, :formulario_id, :created_at, :updated_at json.url elemento_form_url(elemento_form, format: :json)

+ +
+ + + + + + + + diff --git a/doc/app/views/elemento_forms/index_json_jbuilder.html b/doc/app/views/elemento_forms/index_json_jbuilder.html new file mode 100644 index 0000000000..7d44a64ed1 --- /dev/null +++ b/doc/app/views/elemento_forms/index_json_jbuilder.html @@ -0,0 +1,1630 @@ + + + + + + + +index.json.jbuilder - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

json.array! @elemento_forms, partial: “elemento_forms/elemento_form”, as: :elemento_form

+ +
+ + + + + + + + diff --git a/doc/app/views/elemento_forms/show_json_jbuilder.html b/doc/app/views/elemento_forms/show_json_jbuilder.html new file mode 100644 index 0000000000..9145636ff8 --- /dev/null +++ b/doc/app/views/elemento_forms/show_json_jbuilder.html @@ -0,0 +1,1630 @@ + + + + + + + +show.json.jbuilder - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

json.partial! “elemento_forms/elemento_form”, elemento_form: @elemento_form

+ +
+ + + + + + + + diff --git a/doc/app/views/elementos/_elemento_json_jbuilder.html b/doc/app/views/elementos/_elemento_json_jbuilder.html new file mode 100644 index 0000000000..b9fbda9058 --- /dev/null +++ b/doc/app/views/elementos/_elemento_json_jbuilder.html @@ -0,0 +1,1630 @@ + + + + + + + +_elemento.json.jbuilder - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

json.extract! elemento, :id, :ordem, :enunciado, :template_id, :created_at, :updated_at json.url elemento_url(elemento, format: :json)

+ +
+ + + + + + + + diff --git a/doc/app/views/elementos/index_json_jbuilder.html b/doc/app/views/elementos/index_json_jbuilder.html new file mode 100644 index 0000000000..c427e31f75 --- /dev/null +++ b/doc/app/views/elementos/index_json_jbuilder.html @@ -0,0 +1,1630 @@ + + + + + + + +index.json.jbuilder - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

json.array! @elementos, partial: “elementos/elemento”, as: :elemento

+ +
+ + + + + + + + diff --git a/doc/app/views/elementos/show_json_jbuilder.html b/doc/app/views/elementos/show_json_jbuilder.html new file mode 100644 index 0000000000..903adcb611 --- /dev/null +++ b/doc/app/views/elementos/show_json_jbuilder.html @@ -0,0 +1,1630 @@ + + + + + + + +show.json.jbuilder - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

json.partial! “elementos/elemento”, elemento: @elemento

+ +
+ + + + + + + + diff --git a/doc/app/views/formularios/_formulario_json_jbuilder.html b/doc/app/views/formularios/_formulario_json_jbuilder.html new file mode 100644 index 0000000000..58480a2a66 --- /dev/null +++ b/doc/app/views/formularios/_formulario_json_jbuilder.html @@ -0,0 +1,1630 @@ + + + + + + + +_formulario.json.jbuilder - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

json.extract! formulario, :id, :turma_id, :created_at, :updated_at json.url formulario_url(formulario, format: :json)

+ +
+ + + + + + + + diff --git a/doc/app/views/formularios/index_json_jbuilder.html b/doc/app/views/formularios/index_json_jbuilder.html new file mode 100644 index 0000000000..9c47c30aac --- /dev/null +++ b/doc/app/views/formularios/index_json_jbuilder.html @@ -0,0 +1,1630 @@ + + + + + + + +index.json.jbuilder - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

json.array! @formularios, partial: “formularios/formulario”, as: :formulario

+ +
+ + + + + + + + diff --git a/doc/app/views/formularios/show_json_jbuilder.html b/doc/app/views/formularios/show_json_jbuilder.html new file mode 100644 index 0000000000..26763bdba0 --- /dev/null +++ b/doc/app/views/formularios/show_json_jbuilder.html @@ -0,0 +1,1630 @@ + + + + + + + +show.json.jbuilder - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

json.partial! “formularios/formulario”, formulario: @formulario

+ +
+ + + + + + + + diff --git a/doc/app/views/pwa/service-worker_js.html b/doc/app/views/pwa/service-worker_js.html new file mode 100644 index 0000000000..afa5232e61 --- /dev/null +++ b/doc/app/views/pwa/service-worker_js.html @@ -0,0 +1,1630 @@ + + + + + + + +service-worker.js - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

// Add a service worker for processing Web Push notifications: // // self.addEventListener(“push”, async (event) => { // const { title, options } = await event.data.json() // event.waitUntil(self.registration.showNotification(title, options)) // }) // // self.addEventListener(“notificationclick”, function(event) { // event.notification.close() // event.waitUntil( // clients.matchAll({ type: “window” }).then((clientList) => { // for (let i = 0; i < clientList.length; i++) { // let client = clientList // let clientPath = (new URL(client.url)).pathname // // if (clientPath == event.notification.data.path && “focus” in client) { // return client.focus() // } // } // // if (clients.openWindow) { // return clients.openWindow(event.notification.data.path) // } // }) // ) // })

+ +
+ + + + + + + + diff --git a/doc/app/views/resposta_elems/_resposta_elem_json_jbuilder.html b/doc/app/views/resposta_elems/_resposta_elem_json_jbuilder.html new file mode 100644 index 0000000000..9c51d4c2b9 --- /dev/null +++ b/doc/app/views/resposta_elems/_resposta_elem_json_jbuilder.html @@ -0,0 +1,1630 @@ + + + + + + + +_resposta_elem.json.jbuilder - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

json.extract! resposta_elem, :id, :texto_resposta, :resposta_form_id, :elemento_form_id, :campo_form_id, :created_at, :updated_at json.url resposta_elem_url(resposta_elem, format: :json)

+ +
+ + + + + + + + diff --git a/doc/app/views/resposta_elems/index_json_jbuilder.html b/doc/app/views/resposta_elems/index_json_jbuilder.html new file mode 100644 index 0000000000..9e64da5050 --- /dev/null +++ b/doc/app/views/resposta_elems/index_json_jbuilder.html @@ -0,0 +1,1630 @@ + + + + + + + +index.json.jbuilder - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

json.array! @resposta_elems, partial: “resposta_elems/resposta_elem”, as: :resposta_elem

+ +
+ + + + + + + + diff --git a/doc/app/views/resposta_elems/show_json_jbuilder.html b/doc/app/views/resposta_elems/show_json_jbuilder.html new file mode 100644 index 0000000000..bebc62f590 --- /dev/null +++ b/doc/app/views/resposta_elems/show_json_jbuilder.html @@ -0,0 +1,1630 @@ + + + + + + + +show.json.jbuilder - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

json.partial! “resposta_elems/resposta_elem”, resposta_elem: @resposta_elem

+ +
+ + + + + + + + diff --git a/doc/app/views/resposta_forms/_resposta_form_json_jbuilder.html b/doc/app/views/resposta_forms/_resposta_form_json_jbuilder.html new file mode 100644 index 0000000000..cfe9ee5f11 --- /dev/null +++ b/doc/app/views/resposta_forms/_resposta_form_json_jbuilder.html @@ -0,0 +1,1630 @@ + + + + + + + +_resposta_form.json.jbuilder - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

json.extract! resposta_form, :id, :data_submissao, :formulario_id, :usuario_id, :created_at, :updated_at json.url resposta_form_url(resposta_form, format: :json)

+ +
+ + + + + + + + diff --git a/doc/app/views/resposta_forms/index_json_jbuilder.html b/doc/app/views/resposta_forms/index_json_jbuilder.html new file mode 100644 index 0000000000..ccdb07d366 --- /dev/null +++ b/doc/app/views/resposta_forms/index_json_jbuilder.html @@ -0,0 +1,1630 @@ + + + + + + + +index.json.jbuilder - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

json.array! @resposta_forms, partial: “resposta_forms/resposta_form”, as: :resposta_form

+ +
+ + + + + + + + diff --git a/doc/app/views/resposta_forms/show_json_jbuilder.html b/doc/app/views/resposta_forms/show_json_jbuilder.html new file mode 100644 index 0000000000..7cfc7f185f --- /dev/null +++ b/doc/app/views/resposta_forms/show_json_jbuilder.html @@ -0,0 +1,1630 @@ + + + + + + + +show.json.jbuilder - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

json.partial! “resposta_forms/resposta_form”, resposta_form: @resposta_form

+ +
+ + + + + + + + diff --git a/doc/app/views/templates/_template_json_jbuilder.html b/doc/app/views/templates/_template_json_jbuilder.html new file mode 100644 index 0000000000..756c2446d8 --- /dev/null +++ b/doc/app/views/templates/_template_json_jbuilder.html @@ -0,0 +1,1630 @@ + + + + + + + +_template.json.jbuilder - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

json.extract! template, :id, :nome, :created_at, :updated_at json.url template_url(template, format: :json)

+ +
+ + + + + + + + diff --git a/doc/app/views/templates/index_json_jbuilder.html b/doc/app/views/templates/index_json_jbuilder.html new file mode 100644 index 0000000000..5adcc7fbb6 --- /dev/null +++ b/doc/app/views/templates/index_json_jbuilder.html @@ -0,0 +1,1630 @@ + + + + + + + +index.json.jbuilder - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

json.array! @templates, partial: “templates/template”, as: :template

+ +
+ + + + + + + + diff --git a/doc/app/views/templates/show_json_jbuilder.html b/doc/app/views/templates/show_json_jbuilder.html new file mode 100644 index 0000000000..7a08d15eec --- /dev/null +++ b/doc/app/views/templates/show_json_jbuilder.html @@ -0,0 +1,1630 @@ + + + + + + + +show.json.jbuilder - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

json.partial! “templates/template”, template: @template

+ +
+ + + + + + + + diff --git a/doc/app/views/turmas/_turma_json_jbuilder.html b/doc/app/views/turmas/_turma_json_jbuilder.html new file mode 100644 index 0000000000..88671dc3c1 --- /dev/null +++ b/doc/app/views/turmas/_turma_json_jbuilder.html @@ -0,0 +1,1630 @@ + + + + + + + +_turma.json.jbuilder - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

json.extract! turma, :id, :numero_da_turma, :semestre, :horario, :disciplina_id, :created_at, :updated_at json.url turma_url(turma, format: :json)

+ +
+ + + + + + + + diff --git a/doc/app/views/turmas/index_json_jbuilder.html b/doc/app/views/turmas/index_json_jbuilder.html new file mode 100644 index 0000000000..175095dc86 --- /dev/null +++ b/doc/app/views/turmas/index_json_jbuilder.html @@ -0,0 +1,1630 @@ + + + + + + + +index.json.jbuilder - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

json.array! @turmas, partial: “turmas/turma”, as: :turma

+ +
+ + + + + + + + diff --git a/doc/app/views/turmas/show_json_jbuilder.html b/doc/app/views/turmas/show_json_jbuilder.html new file mode 100644 index 0000000000..60913fc597 --- /dev/null +++ b/doc/app/views/turmas/show_json_jbuilder.html @@ -0,0 +1,1630 @@ + + + + + + + +show.json.jbuilder - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

json.partial! “turmas/turma”, turma: @turma

+ +
+ + + + + + + + diff --git a/doc/app/views/usuarios/_usuario_json_jbuilder.html b/doc/app/views/usuarios/_usuario_json_jbuilder.html new file mode 100644 index 0000000000..14c51daff8 --- /dev/null +++ b/doc/app/views/usuarios/_usuario_json_jbuilder.html @@ -0,0 +1,1630 @@ + + + + + + + +_usuario.json.jbuilder - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

json.extract! usuario, :id, :matricula, :email, :nome, :formacao, :type, :created_at, :updated_at json.url usuario_url(usuario, format: :json)

+ +
+ + + + + + + + diff --git a/doc/app/views/usuarios/index_json_jbuilder.html b/doc/app/views/usuarios/index_json_jbuilder.html new file mode 100644 index 0000000000..8b3dd83284 --- /dev/null +++ b/doc/app/views/usuarios/index_json_jbuilder.html @@ -0,0 +1,1630 @@ + + + + + + + +index.json.jbuilder - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

json.array! @usuarios, partial: “usuarios/usuario”, as: :usuario

+ +
+ + + + + + + + diff --git a/doc/app/views/usuarios/show_json_jbuilder.html b/doc/app/views/usuarios/show_json_jbuilder.html new file mode 100644 index 0000000000..880d3eeb99 --- /dev/null +++ b/doc/app/views/usuarios/show_json_jbuilder.html @@ -0,0 +1,1630 @@ + + + + + + + +show.json.jbuilder - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

json.partial! “usuarios/usuario”, usuario: @usuario

+ +
+ + + + + + + + diff --git a/doc/bin/docker-entrypoint.html b/doc/bin/docker-entrypoint.html new file mode 100644 index 0000000000..f96458eeaf --- /dev/null +++ b/doc/bin/docker-entrypoint.html @@ -0,0 +1,1638 @@ + + + + + + + +docker-entrypoint - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

!/bin/bash -e

+ +

# If running the rails server then create or migrate existing database if [ “${@: -2:1}” == “./bin/rails” ] && [ “${@: -1:1}” == “server” ]; then

+ +
./bin/rails db:prepare
+ +

fi

+ +

exec “${@}”

+ +
+ + + + + + + + diff --git a/doc/class_members_json.html b/doc/class_members_json.html new file mode 100644 index 0000000000..1593e2187c --- /dev/null +++ b/doc/class_members_json.html @@ -0,0 +1,2045 @@ + + + + + + + +class_members.json - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

[

+ +
{
+    "code": "CIC0097",
+    "classCode": "TA",
+    "semester": "2021.2",
+    "dicente": [
+        {
+            "nome": "Ana Clara Jordao Perna",
+            "curso": "CIÊNCIA DA COMPUTAÇÃO/CIC",
+            "matricula": "190084006",
+            "usuario": "190084006",
+            "formacao": "graduando",
+            "ocupacao": "dicente",
+            "email": "acjpjvjp@gmail.com"
+        },
+        {
+            "nome": "Andre Carvalho de Roure",
+            "curso": "CIÊNCIA DA COMPUTAÇÃO/CIC",
+            "matricula": "200033522",
+            "usuario": "200033522",
+            "formacao": "graduando",
+            "ocupacao": "dicente",
+            "email": "andreCarvalhoroure@gmail.com"
+        },
+        {
+            "nome": "André Carvalho Marques",
+            "curso": "CIÊNCIA DA COMPUTAÇÃO/CIC",
+            "matricula": "150005491",
+            "usuario": "150005491",
+            "formacao": "graduando",
+            "ocupacao": "dicente",
+            "email": "andre.acm97@outlook.com"
+        },
+        {
+            "nome": "Antonio Vinicius de Moura Rodrigues",
+            "curso": "CIÊNCIA DA COMPUTAÇÃO/CIC",
+            "matricula": "190084502",
+            "usuario": "190084502",
+            "formacao": "graduando",
+            "ocupacao": "dicente",
+            "email": "antoniovmoura.r@gmail.com"
+        },
+        {
+            "nome": "Arthur Barreiros de Oliveira Mota",
+            "curso": "CIÊNCIA DA COMPUTAÇÃO/CIC",
+            "matricula": "190102829",
+            "usuario": "190102829",
+            "formacao": "graduando",
+            "ocupacao": "dicente",
+            "email": "arthurbarreirosmota@gmail.com"
+        },
+        {
+            "nome": "ARTHUR RODRIGUES NEVES",
+            "curso": "ENGENHARIA DE COMPUTAÇÃO/CIC",
+            "matricula": "202014403",
+            "usuario": "202014403",
+            "formacao": "graduando",
+            "ocupacao": "dicente",
+            "email": "arthurcontroleambiental@gmail.com"
+        },
+        {
+            "nome": "Bianca Glycia Boueri",
+            "curso": "ENGENHARIA MECATRÔNICA - CONTROLE E AUTOMAÇÃO/FTD",
+            "matricula": "170161561",
+            "usuario": "170161561",
+            "formacao": "graduando",
+            "ocupacao": "dicente",
+            "email": "biancaglyciaboueri@gmail.com"
+        },
+        {
+            "nome": "Caio Otávio Peluti Alencar",
+            "curso": "CIÊNCIA DA COMPUTAÇÃO/CIC",
+            "matricula": "190085312",
+            "usuario": "190085312",
+            "formacao": "graduando",
+            "ocupacao": "dicente",
+            "email": "peluticaio@gmail.com"
+        },
+        {
+            "nome": "Camila Frealdo Fraga",
+            "curso": "CIÊNCIA DA COMPUTAÇÃO/CIC",
+            "matricula": "170007561",
+            "usuario": "170007561",
+            "formacao": "graduando",
+            "ocupacao": "dicente",
+            "email": "camilizx2021@gmail.com"
+        },
+        {
+            "nome": "Claudio Roberto Oliveira Peres de Barros",
+            "curso": "CIÊNCIA DA COMPUTAÇÃO/CIC",
+            "matricula": "190097591",
+            "usuario": "190097591",
+            "formacao": "graduando",
+            "ocupacao": "dicente",
+            "email": "dinhobarros15@gmail.com"
+        },
+        {
+            "nome": "Daltro Oliveira Vinuto",
+            "curso": "CIÊNCIA DA COMPUTAÇÃO/CIC",
+            "matricula": "160025966",
+            "usuario": "160025966",
+            "formacao": "graduando",
+            "ocupacao": "dicente",
+            "email": "daltroov777@gmail.com"
+        },
+        {
+            "nome": "Davi de Moura Amaral",
+            "curso": "CIÊNCIA DA COMPUTAÇÃO/CIC",
+            "matricula": "200016750",
+            "usuario": "200016750",
+            "formacao": "graduando",
+            "ocupacao": "dicente",
+            "email": "davimouraamaral@gmail.com"
+        },
+        {
+            "nome": "Eduardo Xavier Dantas",
+            "curso": "CIÊNCIA DA COMPUTAÇÃO/CIC",
+            "matricula": "190086530",
+            "usuario": "190086530",
+            "formacao": "graduando",
+            "ocupacao": "dicente",
+            "email": "eduardoxdantas@gmail.com"
+        },
+        {
+            "nome": "Enzo Nunes Leal Sampaio",
+            "curso": "CIÊNCIA DA COMPUTAÇÃO/CIC",
+            "matricula": "190062789",
+            "usuario": "190062789",
+            "formacao": "graduando",
+            "ocupacao": "dicente",
+            "email": "enzonleal2016@hotmail.com"
+        },
+        {
+            "nome": "Enzo Yoshio Niho",
+            "curso": "CIÊNCIA DA COMPUTAÇÃO/CIC",
+            "matricula": "190027304",
+            "usuario": "190027304",
+            "formacao": "graduando",
+            "ocupacao": "dicente",
+            "email": "enzoyn@hotmail.com"
+        },
+        {
+            "nome": "Gabriel Faustino Lima da Rocha",
+            "curso": "CIÊNCIA DA COMPUTAÇÃO/CIC",
+            "matricula": "190013249",
+            "usuario": "190013249",
+            "formacao": "graduando",
+            "ocupacao": "dicente",
+            "email": "gabrielfaustino99@gmail.com"
+        },
+        {
+            "nome": "Gabriel Ligoski",
+            "curso": "CIÊNCIA DA COMPUTAÇÃO/CIC",
+            "matricula": "190087498",
+            "usuario": "190087498",
+            "formacao": "graduando",
+            "ocupacao": "dicente",
+            "email": "gabriel.ligoski@gmail.com"
+        },
+        {
+            "nome": "GABRIEL MENDES CIRIATICO GUIMARÃES",
+            "curso": "CIÊNCIA DA COMPUTAÇÃO/CIC",
+            "matricula": "202033202",
+            "usuario": "202033202",
+            "formacao": "graduando",
+            "ocupacao": "dicente",
+            "email": "gabrielciriatico@gmail.com"
+        },
+        {
+            "nome": "Gustavo Rodrigues dos Santos",
+            "curso": "CIÊNCIA DA COMPUTAÇÃO/CIC",
+            "matricula": "190014121",
+            "usuario": "190014121",
+            "formacao": "graduando",
+            "ocupacao": "dicente",
+            "email": "190014121@aluno.unb.br"
+        },
+        {
+            "nome": "Gustavo Rodrigues Gualberto",
+            "curso": "CIÊNCIA DA COMPUTAÇÃO/CIC",
+            "matricula": "190108266",
+            "usuario": "190108266",
+            "formacao": "graduando",
+            "ocupacao": "dicente",
+            "email": "gustavorgualberto@gmail.com"
+        },
+        {
+            "nome": "Igor David Morais",
+            "curso": "ENGENHARIA MECATRÔNICA - CONTROLE E AUTOMAÇÃO/FTD",
+            "matricula": "180102141",
+            "usuario": "180102141",
+            "formacao": "graduando",
+            "ocupacao": "dicente",
+            "email": "igordavid13@gmail.com"
+        },
+        {
+            "nome": "Jefte Augusto Gomes Batista",
+            "curso": "CIÊNCIA DA COMPUTAÇÃO/CIC",
+            "matricula": "180057570",
+            "usuario": "180057570",
+            "formacao": "graduando",
+            "ocupacao": "dicente",
+            "email": "ndaffte@gmail.com"
+        },
+        {
+            "nome": "Karolina de Souza Silva",
+            "curso": "ENGENHARIA DE COMPUTAÇÃO/CIC",
+            "matricula": "190046791",
+            "usuario": "190046791",
+            "formacao": "graduando",
+            "ocupacao": "dicente",
+            "email": "karolinasouza@outlook.com"
+        },
+        {
+            "nome": "Kléber Rodrigues da Costa Júnior",
+            "curso": "CIÊNCIA DA COMPUTAÇÃO/CIC",
+            "matricula": "200053680",
+            "usuario": "200053680",
+            "formacao": "graduando",
+            "ocupacao": "dicente",
+            "email": "kleberrjr7@gmail.com"
+        },
+        {
+            "nome": "Luca Delpino Barbabella",
+            "curso": "CIÊNCIA DA COMPUTAÇÃO/CIC",
+            "matricula": "180125559",
+            "usuario": "180125559",
+            "formacao": "graduando",
+            "ocupacao": "dicente",
+            "email": "barbadluca@gmail.com"
+        },
+        {
+            "nome": "Lucas de Almeida Abreu Faria",
+            "curso": "CIÊNCIA DA COMPUTAÇÃO/CIC",
+            "matricula": "170016668",
+            "usuario": "170016668",
+            "formacao": "graduando",
+            "ocupacao": "dicente",
+            "email": "lucasaafaria@gmail.com"
+        },
+        {
+            "nome": "Lucas Gonçalves Ramalho",
+            "curso": "CIÊNCIA DA COMPUTAÇÃO/CIC",
+            "matricula": "190098091",
+            "usuario": "190098091",
+            "formacao": "graduando",
+            "ocupacao": "dicente",
+            "email": "lucasramalho29@gmail.com"
+        },
+        {
+            "nome": "Lucas Monteiro Miranda",
+            "curso": "ENGENHARIA MECATRÔNICA - CONTROLE E AUTOMAÇÃO/FTD",
+            "matricula": "170149684",
+            "usuario": "170149684",
+            "formacao": "graduando",
+            "ocupacao": "dicente",
+            "email": "luquinha_miranda@hotmail.com"
+        },
+        {
+            "nome": "Lucas Resende Silveira Reis",
+            "curso": "CIÊNCIA DA COMPUTAÇÃO/CIC",
+            "matricula": "180144421",
+            "usuario": "180144421",
+            "formacao": "graduando",
+            "ocupacao": "dicente",
+            "email": "180144421@aluno.unb.br"
+        },
+        {
+            "nome": "Luis Fernando Freitas Lamellas",
+            "curso": "CIÊNCIA DA COMPUTAÇÃO/CIC",
+            "matricula": "190016841",
+            "usuario": "190016841",
+            "formacao": "graduando",
+            "ocupacao": "dicente",
+            "email": "lflamellas@icloud.com"
+        },
+        {
+            "nome": "Luiza de Araujo Nunes Gomes",
+            "curso": "CIÊNCIA DA COMPUTAÇÃO/CIC",
+            "matricula": "190112794",
+            "usuario": "190112794",
+            "formacao": "graduando",
+            "ocupacao": "dicente",
+            "email": "luizangomes@outlook.com"
+        },
+        {
+            "nome": "Marcelo Aiache Postiglione",
+            "curso": "CIÊNCIA DA COMPUTAÇÃO/CIC",
+            "matricula": "180126652",
+            "usuario": "180126652",
+            "formacao": "graduando",
+            "ocupacao": "dicente",
+            "email": "180126652@aluno.unb.br"
+        },
+        {
+            "nome": "Marcelo Junqueira Ferreira",
+            "curso": "CIÊNCIA DA COMPUTAÇÃO/CIC",
+            "matricula": "200023624",
+            "usuario": "200023624",
+            "formacao": "graduando",
+            "ocupacao": "dicente",
+            "email": "marcelojunqueiraf@gmail.com"
+        },
+        {
+            "nome": "MARIA EDUARDA CARVALHO SANTOS",
+            "curso": "CIÊNCIA DA COMPUTAÇÃO/CIC",
+            "matricula": "190092556",
+            "usuario": "190092556",
+            "formacao": "graduando",
+            "ocupacao": "dicente",
+            "email": "auntduda@gmail.com"
+        },
+        {
+            "nome": "Maria Eduarda Lacerda Dantas",
+            "curso": "CIÊNCIA DA COMPUTAÇÃO/CIC",
+            "matricula": "200067184",
+            "usuario": "200067184",
+            "formacao": "graduando",
+            "ocupacao": "dicente",
+            "email": "lacwerda@gmail.com"
+        },
+        {
+            "nome": "Maylla Krislainy de Sousa Silva",
+            "curso": "CIÊNCIA DA COMPUTAÇÃO/CIC",
+            "matricula": "190043873",
+            "usuario": "190043873",
+            "formacao": "graduando",
+            "ocupacao": "dicente",
+            "email": "mayllak@hotmail.com"
+        },
+        {
+            "nome": "Pedro Cesar Ribeiro Passos",
+            "curso": "ENGENHARIA MECATRÔNICA - CONTROLE E AUTOMAÇÃO/FTD",
+            "matricula": "180139312",
+            "usuario": "180139312",
+            "formacao": "graduando",
+            "ocupacao": "dicente",
+            "email": "pedrocesarribeiro2013@gmail.com"
+        },
+        {
+            "nome": "Rafael Mascarenhas Dal Moro",
+            "curso": "ENGENHARIA DE COMPUTAÇÃO/CIC",
+            "matricula": "170021041",
+            "usuario": "170021041",
+            "formacao": "graduando",
+            "ocupacao": "dicente",
+            "email": "170021041@aluno.unb.br"
+        },
+        {
+            "nome": "Rodrigo Mamedio Arrelaro",
+            "curso": "CIÊNCIA DA COMPUTAÇÃO/CIC",
+            "matricula": "190095164",
+            "usuario": "190095164",
+            "formacao": "graduando",
+            "ocupacao": "dicente",
+            "email": "arrelaro1@hotmail.com"
+        },
+        {
+            "nome": "Thiago de Oliveira Albuquerque",
+            "curso": "ENGENHARIA DE COMPUTAÇÃO/CIC",
+            "matricula": "140177442",
+            "usuario": "140177442",
+            "formacao": "graduando",
+            "ocupacao": "dicente",
+            "email": "thiago.work.ti@outlook.com"
+        },
+        {
+            "nome": "Thiago Elias dos Reis",
+            "curso": "CIÊNCIA DA COMPUTAÇÃO/CIC",
+            "matricula": "190126892",
+            "usuario": "190126892",
+            "formacao": "graduando",
+            "ocupacao": "dicente",
+            "email": "thiagoeliasdosreis01@gmail.com"
+        },
+        {
+            "nome": "Victor Hugo Rodrigues Fernandes",
+            "curso": "CIÊNCIA DA COMPUTAÇÃO/CIC",
+            "matricula": "180132041",
+            "usuario": "180132041",
+            "formacao": "graduando",
+            "ocupacao": "dicente",
+            "email": "aluno0sem.luz@gmail.com"
+        },
+        {
+            "nome": "Vinicius Lima Passos",
+            "curso": "CIÊNCIA DA COMPUTAÇÃO/CIC",
+            "matricula": "200028545",
+            "usuario": "200028545",
+            "formacao": "graduando",
+            "ocupacao": "dicente",
+            "email": "viniciuslimapassos@gmail.com"
+        },
+        {
+            "nome": "William Xavier dos Santos",
+            "curso": "CIÊNCIA DA COMPUTAÇÃO/CIC",
+            "matricula": "190075384",
+            "usuario": "190075384",
+            "formacao": "graduando",
+            "ocupacao": "dicente",
+            "email": "wilxavier@me.com"
+        }
+    ],
+    "docente": {
+        "nome": "MARISTELA TERTO DE HOLANDA",
+        "departamento": "DEPTO CIÊNCIAS DA COMPUTAÇÃO",
+        "formacao": "DOUTORADO",
+        "usuario": "83807519491",
+        "email": "mholanda@unb.br",
+        "ocupacao": "docente"
+    }
+}
+
+ +

]

+ +
+ + + + + + + + diff --git a/doc/classes_json.html b/doc/classes_json.html new file mode 100644 index 0000000000..098c654060 --- /dev/null +++ b/doc/classes_json.html @@ -0,0 +1,1660 @@ + + + + + + + +classes.json - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

[

+ +
{
+    "code": "CIC0097",
+    "name": "BANCOS DE DADOS",
+    "class": {
+        "classCode": "TA",
+        "semester": "2021.2",
+        "time": "35T45"
+    }
+},
+{
+    "code": "CIC0105",
+    "name": "ENGENHARIA DE SOFTWARE",
+    "class": {
+        "classCode": "TA",
+        "semester": "2021.2",
+        "time": "35M12"
+    }
+},
+{
+    "code": "CIC0202",
+    "name": "PROGRAMAÇÃO CONCORRENTE",
+    "class": {
+        "classCode": "TA",
+        "semester": "2021.2",
+        "time": "35M34"
+    }
+}
+ +

]

+ +
+ + + + + + + + diff --git a/doc/config/credentials_yml_enc.html b/doc/config/credentials_yml_enc.html new file mode 100644 index 0000000000..95c365959f --- /dev/null +++ b/doc/config/credentials_yml_enc.html @@ -0,0 +1,1630 @@ + + + + + + + +credentials.yml.enc - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

4H8/6nhnfIn9qW6hDXeaYIPA3qXldZwgNhgvx+L1Hn7mBFhEYQcclgYI+WiUqPbhcvtdzm5FkhaDaTb0TfUCfFTkLfIEdJs9kC+pEBilNfOdzMTTT2d6KeVGNO+BSu/dfxec7YQpsiICdabItL3av/dmoSA9KwDP75Ep+RDAQBXllNWAqBy5zIz1Cnb+/q7doDz2oj+F/Or1Go+v32WzZNm7dbJ4AW3EHJw2L8k82sVmawg8x6i2ehcCNHALQZO/lB3nT6IY0ZkkOxzALaUroqVlgEe+695GkTe08bNTPLrE5l4XSs1edC8V47RTO/ieO9EqHxU3hKvpH7Xdot1P0D6WI6G/koAAzzHnE2jvb4VU6UCIkAXs2mp7L954yxqNgEZ9KOymqNOmancSSStMXp7O5KCiiN6BQCx8ydLaNgScImfwC9dWCiquZOv8Km36dAfzE92TbZUNogOxA5Uw7xEIrjH4Jrg7JDBqM34mJnWW1j5ZX+Fz5Zld–9oy00/0iz+TVEIu/–wUtORdaSWiIGCttp56iN7g==

+ +
+ + + + + + + + diff --git a/doc/config/master_key.html b/doc/config/master_key.html new file mode 100644 index 0000000000..67384f1076 --- /dev/null +++ b/doc/config/master_key.html @@ -0,0 +1,1630 @@ + + + + + + + +master.key - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

234a9cf92190a36d6f72a603687ce5ee

+ +
+ + + + + + + + diff --git a/doc/config_ru.html b/doc/config_ru.html new file mode 100644 index 0000000000..e933177b90 --- /dev/null +++ b/doc/config_ru.html @@ -0,0 +1,1634 @@ + + + + + + + +config.ru - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

# This file is used by Rack-based servers to start the application.

+ +

require_relative “config/environment”

+ +

run Rails.application Rails.application.load_server

+ +
+ + + + + + + + diff --git a/doc/created.rid b/doc/created.rid new file mode 100644 index 0000000000..67f6e7cc9c --- /dev/null +++ b/doc/created.rid @@ -0,0 +1,3124 @@ +Tue, 30 Jun 2026 14:40:44 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/Dockerfile Wed, 20 May 2026 08:25:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/Gemfile Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/Gemfile.lock Tue, 30 Jun 2026 14:17:15 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/README.md Wed, 20 May 2026 08:23:22 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/Rakefile Wed, 20 May 2026 08:25:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/assets/stylesheets/application.css Wed, 20 May 2026 08:25:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/assets/stylesheets/gerenciamento.css Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/assets/stylesheets/login.css Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/assets/stylesheets/redefinir_senha.css Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/controllers/admin_controller.rb Tue, 30 Jun 2026 14:29:10 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/controllers/application_controller.rb Tue, 30 Jun 2026 14:17:15 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/controllers/campo_forms_controller.rb Tue, 30 Jun 2026 14:17:15 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/controllers/campos_controller.rb Tue, 30 Jun 2026 14:17:15 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/controllers/concerns/admin_autenticavel.rb Tue, 30 Jun 2026 14:28:05 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/controllers/cursos_controller.rb Tue, 30 Jun 2026 14:17:15 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/controllers/definicao_senhas_controller.rb Tue, 30 Jun 2026 14:17:15 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/controllers/departamentos_controller.rb Tue, 30 Jun 2026 14:17:15 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/controllers/discentes_controller.rb Tue, 30 Jun 2026 14:17:15 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/controllers/disciplinas_controller.rb Tue, 30 Jun 2026 14:17:15 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/controllers/docentes_controller.rb Tue, 30 Jun 2026 14:17:15 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/controllers/elemento_forms_controller.rb Tue, 30 Jun 2026 14:17:15 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/controllers/elementos_controller.rb Tue, 30 Jun 2026 14:17:15 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/controllers/formularios_controller.rb Tue, 30 Jun 2026 14:17:15 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/controllers/home_controller.rb Tue, 30 Jun 2026 14:17:15 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/controllers/redefinicao_senhas_controller.rb Tue, 30 Jun 2026 14:17:15 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/controllers/resposta_elems_controller.rb Tue, 30 Jun 2026 14:17:15 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/controllers/resposta_forms_controller.rb Tue, 30 Jun 2026 14:17:15 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/controllers/sessions_controller.rb Tue, 30 Jun 2026 14:17:15 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/controllers/templates_controller.rb Tue, 30 Jun 2026 14:29:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/controllers/turmas_controller.rb Tue, 30 Jun 2026 14:17:15 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/controllers/usuarios_controller.rb Tue, 30 Jun 2026 14:17:15 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/helpers/admin_helper.rb Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/helpers/application_helper.rb Tue, 30 Jun 2026 14:17:15 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/helpers/campo_forms_helper.rb Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/helpers/campos_helper.rb Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/helpers/cursos_helper.rb Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/helpers/departamentos_helper.rb Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/helpers/discentes_helper.rb Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/helpers/disciplinas_helper.rb Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/helpers/docentes_helper.rb Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/helpers/elemento_forms_helper.rb Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/helpers/elementos_helper.rb Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/helpers/formularios_helper.rb Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/helpers/resposta_elems_helper.rb Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/helpers/resposta_forms_helper.rb Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/helpers/templates_helper.rb Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/helpers/turmas_helper.rb Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/helpers/usuarios_helper.rb Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/javascript/application.js Wed, 20 May 2026 08:26:37 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/javascript/controllers/application.js Wed, 20 May 2026 08:26:37 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/javascript/controllers/hello_controller.js Wed, 20 May 2026 08:26:37 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/javascript/controllers/index.js Wed, 20 May 2026 08:26:37 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/jobs/application_job.rb Wed, 20 May 2026 08:25:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/mailers/application_mailer.rb Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/mailers/usuario_mailer.rb Tue, 30 Jun 2026 14:17:15 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/models/administrador.rb Tue, 30 Jun 2026 14:17:15 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/models/application_record.rb Wed, 20 May 2026 08:25:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/models/campo.rb Tue, 30 Jun 2026 14:17:15 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/models/campo_form.rb Tue, 30 Jun 2026 14:17:15 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/models/curso.rb Tue, 30 Jun 2026 14:17:15 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/models/departamento.rb Tue, 30 Jun 2026 14:17:15 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/models/discente.rb Tue, 30 Jun 2026 14:17:15 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/models/disciplina.rb Tue, 30 Jun 2026 14:17:15 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/models/docente.rb Tue, 30 Jun 2026 14:17:15 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/models/elemento.rb Tue, 30 Jun 2026 14:17:15 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/models/elemento_form.rb Tue, 30 Jun 2026 14:17:15 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/models/formulario.rb Tue, 30 Jun 2026 14:17:15 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/models/resposta_elem.rb Tue, 30 Jun 2026 14:17:15 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/models/resposta_form.rb Tue, 30 Jun 2026 14:17:15 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/models/template.rb Tue, 30 Jun 2026 14:17:15 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/models/turma.rb Tue, 30 Jun 2026 14:17:15 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/models/usuario.rb Tue, 30 Jun 2026 14:17:15 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/services/sigaa_importer.rb Tue, 30 Jun 2026 14:31:17 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/views/campo_forms/_campo_form.json.jbuilder Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/views/campo_forms/index.json.jbuilder Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/views/campo_forms/show.json.jbuilder Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/views/campos/_campo.json.jbuilder Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/views/campos/index.json.jbuilder Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/views/campos/show.json.jbuilder Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/views/cursos/_curso.json.jbuilder Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/views/cursos/index.json.jbuilder Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/views/cursos/show.json.jbuilder Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/views/departamentos/_departamento.json.jbuilder Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/views/departamentos/index.json.jbuilder Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/views/departamentos/show.json.jbuilder Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/views/discentes/_discente.json.jbuilder Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/views/discentes/index.json.jbuilder Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/views/discentes/show.json.jbuilder Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/views/disciplinas/_disciplina.json.jbuilder Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/views/disciplinas/index.json.jbuilder Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/views/disciplinas/show.json.jbuilder Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/views/docentes/_docente.json.jbuilder Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/views/docentes/index.json.jbuilder Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/views/docentes/show.json.jbuilder Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/views/elemento_forms/_elemento_form.json.jbuilder Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/views/elemento_forms/index.json.jbuilder Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/views/elemento_forms/show.json.jbuilder Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/views/elementos/_elemento.json.jbuilder Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/views/elementos/index.json.jbuilder Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/views/elementos/show.json.jbuilder Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/views/formularios/_formulario.json.jbuilder Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/views/formularios/index.json.jbuilder Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/views/formularios/show.json.jbuilder Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/views/pwa/service-worker.js Wed, 20 May 2026 08:25:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/views/resposta_elems/_resposta_elem.json.jbuilder Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/views/resposta_elems/index.json.jbuilder Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/views/resposta_elems/show.json.jbuilder Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/views/resposta_forms/_resposta_form.json.jbuilder Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/views/resposta_forms/index.json.jbuilder Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/views/resposta_forms/show.json.jbuilder Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/views/templates/_template.json.jbuilder Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/views/templates/index.json.jbuilder Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/views/templates/show.json.jbuilder Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/views/turmas/_turma.json.jbuilder Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/views/turmas/index.json.jbuilder Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/views/turmas/show.json.jbuilder Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/views/usuarios/_usuario.json.jbuilder Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/views/usuarios/index.json.jbuilder Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/app/views/usuarios/show.json.jbuilder Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/bin/brakeman Wed, 20 May 2026 08:25:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/bin/bundler-audit Wed, 20 May 2026 08:25:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/bin/ci Wed, 20 May 2026 08:25:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/bin/cucumber Wed, 20 May 2026 08:29:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/bin/dev Wed, 20 May 2026 08:25:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/bin/docker-entrypoint Wed, 20 May 2026 08:25:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/bin/importmap Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/bin/jobs Wed, 20 May 2026 08:26:38 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/bin/kamal Wed, 20 May 2026 08:26:37 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/bin/rails Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/bin/rake Wed, 20 May 2026 08:25:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/bin/rubocop Wed, 20 May 2026 08:25:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/bin/setup Wed, 20 May 2026 08:25:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/bin/thrust Wed, 20 May 2026 08:25:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/class_members.json Wed, 20 May 2026 08:23:22 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/classes.json Wed, 20 May 2026 08:23:22 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/config/application.rb Wed, 20 May 2026 08:25:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/config/boot.rb Wed, 20 May 2026 08:25:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/config/ci.rb Wed, 20 May 2026 08:25:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/config/credentials.yml.enc Wed, 20 May 2026 08:25:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/config/environment.rb Wed, 20 May 2026 08:25:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/config/environments/development.rb Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/config/environments/production.rb Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/config/environments/test.rb Wed, 20 May 2026 09:14:56 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/config/importmap.rb Wed, 20 May 2026 08:26:37 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/config/initializers/assets.rb Wed, 20 May 2026 08:25:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/config/initializers/content_security_policy.rb Wed, 20 May 2026 08:25:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/config/initializers/filter_parameter_logging.rb Wed, 20 May 2026 08:25:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/config/initializers/inflections.rb Wed, 20 May 2026 08:25:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/config/master.key Wed, 20 May 2026 08:25:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/config/puma.rb Wed, 20 May 2026 08:25:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/config/routes.rb Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/config.ru Wed, 20 May 2026 08:25:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/coverage/assets/0.13.2/DataTables-1.10.20/images/sort_asc.png Tue, 30 Jun 2026 14:33:26 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/coverage/assets/0.13.2/DataTables-1.10.20/images/sort_asc_disabled.png Tue, 30 Jun 2026 14:33:26 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/coverage/assets/0.13.2/DataTables-1.10.20/images/sort_both.png Tue, 30 Jun 2026 14:33:26 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/coverage/assets/0.13.2/DataTables-1.10.20/images/sort_desc.png Tue, 30 Jun 2026 14:33:26 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/coverage/assets/0.13.2/DataTables-1.10.20/images/sort_desc_disabled.png Tue, 30 Jun 2026 14:33:26 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/coverage/assets/0.13.2/application.css Tue, 30 Jun 2026 14:33:26 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/coverage/assets/0.13.2/application.js Tue, 30 Jun 2026 14:33:26 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/coverage/assets/0.13.2/colorbox/border.png Tue, 30 Jun 2026 14:33:26 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/coverage/assets/0.13.2/colorbox/controls.png Tue, 30 Jun 2026 14:33:26 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/coverage/assets/0.13.2/colorbox/loading.gif Tue, 30 Jun 2026 14:33:26 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/coverage/assets/0.13.2/colorbox/loading_background.png Tue, 30 Jun 2026 14:33:26 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/coverage/assets/0.13.2/favicon_green.png Tue, 30 Jun 2026 14:33:26 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/coverage/assets/0.13.2/favicon_red.png Tue, 30 Jun 2026 14:33:26 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/coverage/assets/0.13.2/favicon_yellow.png Tue, 30 Jun 2026 14:33:26 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/coverage/assets/0.13.2/images/ui-bg_flat_0_aaaaaa_40x100.png Tue, 30 Jun 2026 14:33:26 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/coverage/assets/0.13.2/images/ui-bg_flat_75_ffffff_40x100.png Tue, 30 Jun 2026 14:33:26 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/coverage/assets/0.13.2/images/ui-bg_glass_55_fbf9ee_1x400.png Tue, 30 Jun 2026 14:33:26 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/coverage/assets/0.13.2/images/ui-bg_glass_65_ffffff_1x400.png Tue, 30 Jun 2026 14:33:26 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/coverage/assets/0.13.2/images/ui-bg_glass_75_dadada_1x400.png Tue, 30 Jun 2026 14:33:26 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/coverage/assets/0.13.2/images/ui-bg_glass_75_e6e6e6_1x400.png Tue, 30 Jun 2026 14:33:26 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/coverage/assets/0.13.2/images/ui-bg_glass_95_fef1ec_1x400.png Tue, 30 Jun 2026 14:33:26 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/coverage/assets/0.13.2/images/ui-bg_highlight-soft_75_cccccc_1x100.png Tue, 30 Jun 2026 14:33:26 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/coverage/assets/0.13.2/images/ui-icons_222222_256x240.png Tue, 30 Jun 2026 14:33:26 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/coverage/assets/0.13.2/images/ui-icons_2e83ff_256x240.png Tue, 30 Jun 2026 14:33:26 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/coverage/assets/0.13.2/images/ui-icons_454545_256x240.png Tue, 30 Jun 2026 14:33:26 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/coverage/assets/0.13.2/images/ui-icons_888888_256x240.png Tue, 30 Jun 2026 14:33:26 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/coverage/assets/0.13.2/images/ui-icons_cd0a0a_256x240.png Tue, 30 Jun 2026 14:33:26 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/coverage/assets/0.13.2/loading.gif Tue, 30 Jun 2026 14:33:26 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/coverage/assets/0.13.2/magnify.png Tue, 30 Jun 2026 14:33:26 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/coverage/index.html Tue, 30 Jun 2026 14:33:26 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/db/cable_schema.rb Wed, 20 May 2026 08:26:38 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/db/cache_schema.rb Wed, 20 May 2026 08:26:38 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/db/migrate/20260527234832_create_departamentos.rb Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/db/migrate/20260527234834_create_cursos.rb Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/db/migrate/20260527234836_create_disciplinas.rb Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/db/migrate/20260527234838_create_turmas.rb Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/db/migrate/20260527235010_create_usuarios.rb Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/db/migrate/20260527235026_create_templates.rb Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/db/migrate/20260527235028_create_elementos.rb Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/db/migrate/20260527235031_create_campos.rb Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/db/migrate/20260527235053_create_formularios.rb Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/db/migrate/20260527235055_create_elemento_forms.rb Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/db/migrate/20260527235057_create_campo_forms.rb Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/db/migrate/20260527235101_create_resposta_forms.rb Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/db/migrate/20260527235104_create_resposta_elems.rb Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/db/migrate/20260528000107_create_join_table_discente_turma.rb Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/db/migrate/20260528000109_create_join_table_docente_turma.rb Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/db/migrate/20260528002258_ajusta_nulos_para_sti.rb Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/db/migrate/20260601120000_add_definicao_senha_to_usuarios.rb Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/db/migrate/20260602090000_add_redefinicao_senha_to_usuarios.rb Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/db/migrate/20260615105458_add_usuario_to_templates.rb Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/db/migrate/20260616193744_add_titulo_to_formularios_and_make_turma_optional.rb Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/db/migrate/20260616201400_add_tipo_to_elemento_forms.rb Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/db/queue_schema.rb Wed, 20 May 2026 08:26:38 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/db/schema.rb Tue, 30 Jun 2026 14:17:15 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/db/seeds.rb Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/features/atualizar_dados_sigaa.feature Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/features/cadastro_sigaa.feature Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/features/create_template.feature Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/features/criar_formulario.feature Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/features/criar_formulario_template.feature Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/features/definicao_senha.feature Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/features/edit_delete_template.feature Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/features/gerar_relatorio_csv.feature Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/features/importar_dados_sigaa.feature Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/features/login.feature Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/features/redefinicao_senha.feature Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/features/responder_formulario.feature Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/features/step_definitions/atualizar_dados_sigaa_steps.rb Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/features/step_definitions/cadastro_steps.rb Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/features/step_definitions/criar_formulario_steps.rb Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/features/step_definitions/criar_formulario_template_steps.rb Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/features/step_definitions/exportar_csv_steps.rb Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/features/step_definitions/importar_dados_sigaa_steps.rb Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/features/step_definitions/login_steps.rb Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/features/step_definitions/responder_formulario_steps.rb Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/features/step_definitions/senha_steps.rb Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/features/step_definitions/template_steps.rb Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/features/support/env.rb Tue, 30 Jun 2026 14:17:15 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/features/view_template.feature Tue, 30 Jun 2026 14:10:41 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/lib/tasks/cucumber.rake Wed, 20 May 2026 09:14:56 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/log/development.log Tue, 30 Jun 2026 14:29:59 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/log/test.log Tue, 30 Jun 2026 14:33:26 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/public/400.html Wed, 20 May 2026 08:25:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/public/404.html Wed, 20 May 2026 08:25:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/public/406-unsupported-browser.html Wed, 20 May 2026 08:25:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/public/422.html Wed, 20 May 2026 08:25:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/public/500.html Wed, 20 May 2026 08:25:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/public/icon.png Wed, 20 May 2026 08:25:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/public/robots.txt Wed, 20 May 2026 08:25:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/00/121baa5c5c3453 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/00/3888c2dd2dc6f1 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/00/44a4466786a1bc Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/00/471ff3685d632e Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/00/5fb18a2d3fe953 Wed, 20 May 2026 08:26:34 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/00/8759e437f16994 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/00/bdb5058986a4d8 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/00/c46a52b0aaeb26 Tue, 30 Jun 2026 14:29:59 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/00/e1f79511b77b2b Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/01/09cf55dbd6bdb3 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/01/10fb7f4ed2ac92 Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/01/13378c71af0743 Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/01/29aaf1adf6cd2c Wed, 20 May 2026 08:26:34 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/01/2f5711409fd24b Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/01/2f77580d737545 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/01/5df1ab2c8ea271 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/01/7f3384fd41d8c5 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/01/80a184bbfa03bf Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/01/a5b2919a7e8de5 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/01/ad53e38bcf4183 Wed, 20 May 2026 10:26:21 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/01/d3be2eeddd9842 Wed, 20 May 2026 10:26:21 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/02/1061c1b5c3bef8 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/02/15949b62d1e6de Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/02/31b32709351ba0 Wed, 20 May 2026 08:26:38 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/02/3eba40a3b36967 Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/02/4e04d28aa408c0 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/02/5bc29684340a16 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/02/67bc266d8658ed Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/02/7e112f852303ad Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/02/8e217da15304b2 Tue, 30 Jun 2026 14:29:59 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/02/b0c59b64c31aa3 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/02/daa9529918092b Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/02/f442a2473c573b Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/03/0c93eee8d0a6d6 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/03/10c6cb3c04fe8b Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/03/33c2f2cd6d4532 Tue, 30 Jun 2026 14:29:56 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/03/5fddc6b6757315 Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/03/61ccdf8e64cb9a Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/03/701927c4986fbe Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/03/7de111d46ba0d1 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/03/97f0a38fa460e7 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/03/9971ea67da352f Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/03/9da49056d339ca Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/03/bed1b39ae0bd26 Wed, 20 May 2026 08:26:34 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/03/ef7f3d3294a667 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/04/51d6f1751211f2 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/04/97e0d73ddc0f91 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/04/afa89070597135 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/04/b666cf5e32072d Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/04/c43a71f83dc2a9 Wed, 20 May 2026 08:26:34 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/04/e762e3e7b8b6fc Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/05/02540dde595814 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/05/07e1ae48211654 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/05/225cb773156ab8 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/05/29b34f7c4f9687 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/05/329638b49c580f Tue, 30 Jun 2026 14:29:59 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/05/557fc15ed45699 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/05/5b9b09bcdb2dc2 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/05/6a57f6d6467e9b Wed, 20 May 2026 10:26:21 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/05/6cac543d4f18b5 Wed, 20 May 2026 08:26:34 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/05/72ad7ca75adf53 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/05/9b26930c6afd1a Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/05/a2bba2010b1f68 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/05/fbd2ffb9f33be8 Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/06/05aaf766b942c4 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/06/61b55557385324 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/06/841c4c7eaf896a Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/06/85ea9255535500 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/06/87b1ae275c4e8b Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/06/8bc5c15e6edb71 Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/06/c88815b7fe598d Wed, 20 May 2026 08:33:05 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/06/cb566a8ea43db3 Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/06/d19371cb495568 Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/06/e25d211ea8b247 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/06/f61ed40e269035 Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/07/4cd10ddf062b75 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/07/4f73e05340f59f Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/07/5f306a3fdac282 Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/07/5fa45e0ad8689e Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/07/ac3e01c7a9a9ac Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/07/ba1cf948cf8412 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/07/c0b2a6f05161f9 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/07/fbd52b3e775ad5 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/08/03e3f2849b7a30 Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/08/09e65e7df16209 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/08/3451ff84c7ff8d Wed, 20 May 2026 10:26:21 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/08/5c5a0f43c56ac7 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/08/696a1adc9c6631 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/08/6d5cf436503a28 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/08/9011ac50b2fab9 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/08/906c228fe81147 Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/08/cd2ef20bf1394c Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/08/f4792e2a3ff074 Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/09/05b4868b4e8d63 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/09/0808dba6db148a Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/09/22a63424bde578 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/09/22f8c91209aa59 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/09/33b4ae11979784 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/09/358775eb244269 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/09/762b03322b66b7 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/09/78d2a920372126 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/09/98dfba4c19d4ba Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/09/a84abe4c05654b Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/09/c88d067834da00 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/0a/0b39cdd3928586 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/0a/0e3d14c72443f6 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/0a/2548985e934dde Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/0a/99b11205447936 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/0a/f9768477c3bcf9 Wed, 20 May 2026 08:26:34 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/0a/ffc7bdd5553860 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/0b/363e49685f7484 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/0b/3985e2db7d77a2 Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/0b/8b9b02bb70b878 Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/0b/99cc48782a1c85 Wed, 20 May 2026 08:26:34 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/0b/a39bbdf51ca164 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/0b/ac50cb662dd920 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/0b/b8fc57d5ffd525 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/0b/df94855b6eb90b Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/0b/e5eef83e666240 Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/0b/e5ff14ea01eca0 Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/0b/e7c2cc2f6615b6 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/0c/0840b75d8912e2 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/0c/0c78de43fcf61b Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/0c/125e2a601f9a03 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/0c/2e1cbfbd445454 Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/0c/2f8bc2eb97c247 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/0c/330aef0f72f3d3 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/0c/4b5b440164b168 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/0c/58f486df761edc Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/0c/59ed4e0f6459f7 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/0c/5cf883a5fcd841 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/0c/6d4571b987460a Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/0c/85daa07397a4bc Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/0c/9457a674029b78 Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/0c/b8c4d1b18def4d Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/0c/bbad7bb09df4e9 Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/0c/ee77855e060764 Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/0c/f089f7c1c9b430 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/0c/f2177b03f512dc Wed, 20 May 2026 08:26:38 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/0c/fd126c6ba537a2 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/0d/5e6d22fcfcbae7 Wed, 20 May 2026 08:26:34 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/0d/62cb303322839e Wed, 20 May 2026 08:33:05 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/0d/6cb056786d53cd Tue, 30 Jun 2026 14:29:56 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/0d/6d135c1cf7a521 Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/0d/7ebd1b6db01a4c Wed, 20 May 2026 08:26:34 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/0d/81c08ef1dd0003 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/0d/8bc61cc5abf02a Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/0d/95c2ddb664044a Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/0d/c6af8c9dafcf96 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/0d/c7ccb78149cfb0 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/0d/c8957c1b93ba1b Tue, 30 Jun 2026 14:29:56 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/0d/d38cab527c275c Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/0d/fae53dda3f2b9b Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/0e/141c1ea6423b97 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/0e/222a54547e7126 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/0e/250f4a2c1ff8e8 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/0e/3b75b5ae3dbbf6 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/0e/3cb278e097daa6 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/0e/40e6aacf128bb1 Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/0e/52637f0ba3bd2d Wed, 20 May 2026 08:33:16 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/0e/7a0766176e3bc6 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/0e/8f9df22b4517d7 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/0e/a2f34d18be11df Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/0e/c6ef939a90af8e Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/0e/c8e2d87f204155 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/0e/d23823a913248f Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/0e/d9daeec3a2a182 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/0e/df9f05f3d3bc8f Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/0f/0db4ea106b36ff Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/0f/1632c3ab201a72 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/0f/20109b3c8582bb Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/0f/2df28372ca84a5 Wed, 20 May 2026 08:26:34 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/0f/4fe67ac4e44ecd Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/0f/5a2bdd576f143b Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/0f/6a8c6276fc46fe Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/0f/7f7296f54ef1b0 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/0f/9800360dc1d541 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/0f/cc0f27899d9bcd Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/0f/cdb41d486e8487 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/10/07cee6d707abc0 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/10/0c377337da1904 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/10/138cb57e8a868e Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/10/1d920a1449e88a Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/10/32ec8039619877 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/10/45016870dd93a4 Wed, 20 May 2026 10:26:21 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/10/48de10bac83634 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/10/684ecc21853300 Wed, 20 May 2026 08:29:48 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/10/888b9df0456362 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/10/b8020173673480 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/10/cfd7e66bddd58d Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/11/0072ca6069298b Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/11/186633bef59f63 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/11/1d9ffa7f39fd43 Wed, 20 May 2026 08:33:16 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/11/345d5a86ff8075 Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/11/4799a6fa497292 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/11/50f1640e6a7a39 Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/11/5346b3233a59ed Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/11/80b0bb2c33e23b Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/11/8b6a67ccd2bf30 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/11/966dc16cd2d444 Wed, 20 May 2026 10:26:21 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/11/ae43b3a6588c36 Wed, 20 May 2026 10:26:21 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/11/b9650eea3788ac Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/11/c36345d81cb682 Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/11/f64c38d089caa0 Wed, 20 May 2026 08:26:34 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/11/f9982975f7e25c Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/12/1985b0d0fbe998 Wed, 20 May 2026 08:33:16 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/12/215c6a2f0be040 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/12/683743377089c7 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/12/6ece01b9ab5076 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/12/95c704c73358ab Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/12/99ab0623f9345d Wed, 20 May 2026 10:26:21 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/12/b8415551de9efd Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/12/e120a3391781ba Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/12/f8743c3f842a5c Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/12/f880a812584de6 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/12/fd12688be5daa4 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/13/08ddd7b77353b1 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/13/12a1af7ad58c5c Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/13/19e72e660809bb Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/13/3e7680ee9fa632 Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/13/45fd48b61b0ce1 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/13/686d7291a2aced Wed, 20 May 2026 08:33:16 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/13/74abaff5b288b0 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/13/88521ced67c38e Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/13/9304b71adf673f Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/13/b241e4603dc84f Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/13/da7a248647bf70 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/13/fb7ebb5919820b Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/14/03b64ff96faf67 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/14/1a3d56592ae170 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/14/4d869418406b95 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/14/6c1ccfeaa54da6 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/14/6d9d2d83cbcf71 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/14/8c660662335e92 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/14/aba6cb0340087b Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/14/d70f844f45f22f Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/14/d87792001953f9 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/14/e0391605cd4e88 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/15/03613c30d416ae Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/15/2938a8ff60bddc Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/15/3c471fbdf04b48 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/15/69ad01d5a4527a Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/15/6bb9dfe7722bc2 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/15/8b36ed86dc033f Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/15/8c4a66a707cf7e Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/15/9585d633e094e2 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/15/a1a16d8e93b12b Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/15/bfd6924c3cb3b0 Tue, 30 Jun 2026 14:29:58 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/15/ee1cd39f2463bf Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/15/fa300543a91d9c Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/15/fbd51f53247210 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/16/20996dbd9f1e1e Wed, 20 May 2026 08:29:48 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/16/280fbf93f0e7e4 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/16/3f24c2b99efe21 Wed, 20 May 2026 08:33:06 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/16/41e7f5eb4c10e6 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/16/489a67188936b8 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/16/6513da11494ea7 Wed, 20 May 2026 10:26:21 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/16/75beaa86b5cab2 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/16/7a895ae001e958 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/16/8db3a763dd6d67 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/16/8e1ae066a78d7b Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/16/a696f47f36c16a Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/16/a9a221a09ceb21 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/16/b34b2e8635bf27 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/16/e4ec5fbe586ed9 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/16/f8d96a19afe48a Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/17/02b173b48d67bf Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/17/104093e9996f5d Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/17/19f8748d1c33b2 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/17/25b29290b6a58a Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/17/389a384215386b Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/17/558fd90c7e0b9b Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/17/5a6ba708061545 Wed, 20 May 2026 08:33:16 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/17/6c71243035a105 Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/17/7c07607d38af06 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/17/9ab319478bddd6 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/17/aa9124234d503d Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/17/b1125123285fd5 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/17/c445c974308377 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/17/cffa322b015149 Wed, 20 May 2026 08:26:34 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/17/d98e67fed4071d Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/17/daa72699a1a644 Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/17/eff346fbf29cd3 Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/17/f4e0ac603cdde5 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/18/042e98ef15d275 Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/18/1111277bc472bb Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/18/26827fe03f8dee Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/18/4adebfb9833428 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/18/69acb33ecf712c Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/18/75103ac19ae4d4 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/18/9707bf24e0c4e3 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/18/b8cb723f788408 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/18/c292f132807eff Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/18/cc0107ececa5a6 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/18/d8791a483a3240 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/18/dbb890032c7d27 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/18/dc15653c861612 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/18/ef47420dd405e1 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/18/f7486e9168afb4 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/19/13bd120fe95031 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/19/17bc508eff5556 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/19/1ccacef00bb41c Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/19/3a93f43b0a7512 Wed, 20 May 2026 10:26:21 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/19/4cb28667e2be60 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/19/5219fcde2ae8b6 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/19/63656ad1e60bbe Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/19/930858452f2d96 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/19/99b1563a475ba1 Wed, 20 May 2026 08:33:16 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/19/ab3eeb931262d4 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/19/c60f3e582e4455 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/19/dbf0fdbee90e5f Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/19/deac232df3c813 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/19/e17013a13b879f Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/19/f2eee930a33fb4 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/19/feb577c7c20784 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/1a/0d5f8dcd694ec1 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/1a/10fcdb045d99c8 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/1a/30529a8888a440 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/1a/34eaf4ca2c588d Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/1a/5092f482611aaf Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/1a/5c88c117d7a762 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/1a/6009e059b61780 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/1a/8bfc8b6d6f789b Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/1a/9d40eb4b05e5a5 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/1a/bd2acab53bfc81 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/1a/bd46cefe55125d Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/1a/bda5cc90d37971 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/1b/2ea2c0d04e8ce6 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/1b/44f3d50f3b1e6f Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/1b/45a64e47ce66e8 Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/1b/47fea7898692ff Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/1b/7450ee0dd69605 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/1b/9dc2155f3760f2 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/1b/a68ac407614d37 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/1b/dbda879b66d70f Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/1c/08e9e1a1af3204 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/1c/0ed4c91c6cd848 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/1c/1868b70e0909ff Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/1c/219a9069314948 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/1c/50d424cd1073df Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/1c/514c9bf0d1c099 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/1c/51a706ea444c38 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/1c/5245221a69f04d Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/1c/5811c21800776e Wed, 20 May 2026 10:26:21 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/1c/79f68e923f5d70 Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/1c/7b544bc624cc0c Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/1c/de1d4fe4f66ccc Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/1c/f9a62948b553a2 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/1c/fe09d6ec355423 Wed, 20 May 2026 08:26:34 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/1d/19a2e3d6b8d2c1 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/1d/2503f0047e6f81 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/1d/25d085a4cbe712 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/1d/3ef04751f8a858 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/1d/533dc690bf3d9c Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/1d/597d54c427a870 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/1d/5cd23e45b79e5c Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/1d/616b2c2810dc1e Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/1d/6c66e4864ee370 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/1d/86a6e2e240e51e Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/1d/abab92fab522d8 Wed, 20 May 2026 10:26:21 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/1d/b6702989dfaeb6 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/1d/dd9198b3653805 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/1d/ef682063bbf896 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/1e/0688b2fa640343 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/1e/070fecc3e3c3ba Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/1e/07105e04e72f73 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/1e/0e2f6aaa28713f Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/1e/12e727603be137 Wed, 20 May 2026 10:26:21 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/1e/23d44029a2df67 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/1e/2f74e3c04e47e8 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/1e/372937b36a176d Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/1e/3ca7209af1e17c Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/1e/62b38c9eb8b8ae Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/1e/7a00d25d7fb31c Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/1e/7d73433265e95e Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/1e/8e7d45927edeaa Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/1e/b29980582417da Wed, 20 May 2026 08:33:16 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/1e/d1b015506db4fe Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/1e/d93a47f8db0f4f Wed, 20 May 2026 08:33:06 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/1e/e2b1ec4b1d5a8e Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/1e/f49d9b1a93db8c Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/1e/f4ee3b01993444 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/1f/05488ebd7d6d3d Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/1f/1294180469fca5 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/1f/157e49b4ca639c Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/1f/2ea67acd10568b Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/1f/7154dcb765161b Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/1f/89c847d0a9b322 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/1f/987707b60e0a43 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/1f/add4075771d3e6 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/1f/e439bdf61cf300 Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/1f/eb79256bb8a4b2 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/20/344926a5db3b39 Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/20/54ac344b78b85b Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/20/59f95927065291 Wed, 20 May 2026 08:26:34 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/20/5be6f716bf554f Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/20/5f571833cac849 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/20/6ebd613b069d5a Wed, 20 May 2026 10:26:21 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/21/0cd8727ae787e2 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/21/38e778145a7a04 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/21/51921edcb36818 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/21/60e6194eaad729 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/21/79f8b82296b28e Wed, 20 May 2026 08:33:06 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/21/8a86079711e331 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/21/9f1479e6c551be Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/21/a3e0492a68d320 Wed, 20 May 2026 08:26:34 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/21/c089c7475fabe3 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/21/ddb1174d667e7e Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/21/f032ed91ed1142 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/21/fc5a99eefc5fad Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/22/085ca3e57f745b Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/22/1577d9eb9a20bd Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/22/16a6d23f0d8de7 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/22/328faa703fc992 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/22/48110fe5f5ca30 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/22/4d16d8dbaaaab3 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/22/4fc0ccd339340a Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/22/732459a1967226 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/22/7fecab1ad8d314 Wed, 20 May 2026 10:26:21 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/22/8727ac44b3caff Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/22/8f06da87e79ab3 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/22/9040c0fee075d8 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/22/a38644edc0460a Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/22/bfb12570cb30d3 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/22/cf0d49ac823fc1 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/22/d27f900e3ca025 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/22/dc4f027c555309 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/23/1578c807688167 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/23/1c8e4345f46117 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/23/2ddfb826781240 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/23/353fe3c4f4cc28 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/23/5a84878f5704b2 Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/23/6c641e04a9dd5b Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/23/759b24c431905f Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/23/e26ca8c83dad81 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/24/1666277bc05c5a Wed, 20 May 2026 10:26:21 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/24/4d132e9f4b100a Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/24/53a5421f061538 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/24/6d58f384cf0b0e Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/24/8ab5584f1150cd Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/24/f51b990ea956a2 Wed, 20 May 2026 08:33:16 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/24/f9106bae9b5eac Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/24/fd4bd0899ae946 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/25/0e1f1b2ee7a983 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/25/1faca1accb8e92 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/25/2f839a258e0ff5 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/25/38a20ac19c0924 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/25/5f142dc17e9eb9 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/25/80a171fa7475ef Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/25/8d1b652b85f49f Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/25/9d0c904ffafedd Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/25/a225d6b1c72fbe Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/25/bd73d994605d67 Wed, 20 May 2026 08:33:16 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/25/d9535055273aef Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/26/26c75ae4072735 Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/26/46f8eba0cde3bb Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/26/520e520c32acc1 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/26/aaff04e28051a0 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/26/ba22fb00cd4c7e Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/26/dc2de650d37967 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/26/fb81353da64777 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/27/4a77f8a7da2390 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/27/6e50ca075a15ec Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/27/80552ea93b509c Wed, 20 May 2026 10:26:21 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/27/89b0dad96a1328 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/27/9830986cab5af3 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/27/aef6cf44c8a1a5 Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/27/b8722edef8fcde Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/27/b9996132d54c7c Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/27/d238285fd76cba Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/27/fbf9c53b37f5b8 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/28/127865f8472352 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/28/27824ffd5a1d88 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/28/27b16567cec97a Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/28/2c242a589e5338 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/28/45da0a3939194a Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/28/56799b42ded6a3 Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/28/58942e9e464847 Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/28/5cdd0587b8114a Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/28/5f67f9514242b0 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/28/606cd33a88374a Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/28/7aaaf43caf1d41 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/28/c3b031a5c89c4c Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/28/d9bbce37e0c2dc Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/28/f6e8765981a215 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/29/1e2325cfd5a19c Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/29/68bfef73c92336 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/29/8cb2f65a4dde38 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/29/8f10760a31e74c Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/29/ac60a6d5b52e7b Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/29/dd0bc97a1fb4ae Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/29/fd2340a73e02c1 Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/2a/08161e903a5975 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/2a/23fdd741d91568 Wed, 20 May 2026 08:33:06 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/2a/2fedb544966723 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/2a/3e2bfcdc83ae8d Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/2a/4c49d9e4a16ba6 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/2a/5d6be19fc321a7 Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/2a/695c566b5df221 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/2a/7606fa7248a421 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/2a/8cfee38f3a6659 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/2a/8d0820a108c5f6 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/2a/99daa11c54c1e8 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/2a/9adcc046db0039 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/2a/e947b8882ac6ff Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/2b/14c1cbf88a48ea Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/2b/269938c7a8d645 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/2b/478902da2c947e Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/2b/4a7d70390dc9df Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/2b/51ad7ff7e97d61 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/2b/782cc0519f78a5 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/2b/9be5bcd83797a9 Wed, 20 May 2026 10:26:21 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/2b/b7c61d105003e0 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/2b/c4885e2db20bc6 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/2b/e109e38ec738c2 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/2b/f27fa8bd4d0078 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/2c/20b1da00de8faa Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/2c/32608c22f6270c Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/2c/3f080c6fe640dc Wed, 20 May 2026 08:26:34 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/2c/40aef049547e61 Wed, 20 May 2026 10:26:21 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/2c/4e35b5df7fea00 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/2c/905178d5213a89 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/2c/9a8bb66967718a Wed, 20 May 2026 08:26:34 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/2c/a71240a437267a Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/2c/a95a04be303e12 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/2c/acfb49e39fd0d3 Wed, 20 May 2026 08:33:16 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/2c/c0554292e1ca22 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/2c/ffa6980b3b9b33 Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/2d/71edf2a9823ce6 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/2d/ac570110112e12 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/2d/b5d657ef881cca Wed, 20 May 2026 08:26:34 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/2d/b9ccd3b8961e65 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/2d/ec4beb20917347 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/2e/0b87394cc3f1a0 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/2e/14bb3a8fe34ba9 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/2e/1dfadf7c08769a Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/2e/53cfb112d7a2d5 Wed, 20 May 2026 08:26:34 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/2e/780fb4bb4869f5 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/2e/bd2fdee0e4bb41 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/2e/c8acd772daf4d2 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/2f/109becec4703de Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/2f/6486b0a35190f7 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/2f/7421b60966af94 Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/2f/85e309245f421a Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/2f/b32ccbb7301641 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/2f/bb23a0c81b14a4 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/2f/c6b72d9ca1f0f6 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/2f/eca7d5173839f7 Wed, 20 May 2026 08:33:16 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/2f/f629e16767f688 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/30/1315364c3e6ad3 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/30/21d29fa685d72d Wed, 20 May 2026 08:33:16 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/30/3878f923246868 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/30/7b68baf6427448 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/30/8e81fd0b0b50f5 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/30/c399438e55dd72 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/30/dbb602e901ab5d Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/30/f17938195b38c2 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/30/fffdc7958813c0 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/31/39d4db62ab0a2a Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/31/513e55ffa0e0a9 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/31/75507e01401052 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/31/7632afdcc68a1b Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/31/76aeffceb3c45b Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/31/791ff4dc4155ea Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/31/847ffb3d34cee3 Wed, 20 May 2026 10:26:21 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/31/8ad27ba0d64a8c Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/31/a9c23467f74559 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/31/abfff82b87a2a4 Wed, 20 May 2026 08:33:05 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/31/ba9ae04492ad0e Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/31/bcd55eb1befc1f Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/31/d3da645376c16c Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/31/dd952ff577b25e Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/32/3d8bade893354b Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/32/481bff5a919acf Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/32/59473820c43ec8 Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/32/788b4494ee6277 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/32/95a8e95d153bc5 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/32/a3530b684854ff Tue, 30 Jun 2026 14:12:08 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/32/a630d6f7667d2e Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/32/b66dfbb09edda6 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/32/b8dc426ede72af Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/32/f2f3e27856ab50 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/32/fafb28e89167a3 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/32/fbb4d4710265fa Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/33/18e5989ea5de6b Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/33/1b81954266a9c3 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/33/41e2f2b7f05fe4 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/33/488e554c896b04 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/33/5c07b05a06882e Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/33/60ba5880795d44 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/33/6179593781115a Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/33/6cf8e435898ec0 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/33/71d9d4ede43269 Wed, 20 May 2026 08:33:16 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/33/9323c5cf077d77 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/33/e07737653ba413 Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/33/ed2395b42688be Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/34/1f77468edfb264 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/34/30dd1efa6c8163 Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/34/765f3b745b4393 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/34/8701e2f777fc8c Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/34/af375b37cbd20e Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/34/f6ab92c29a379d Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/35/014ef6f3827088 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/35/01ff3a72fd0d67 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/35/1543fa4522e4bc Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/35/29d3cc1f86708e Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/35/32568492596b08 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/35/32741705395db8 Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/35/382b92c798a510 Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/35/93dd6bf13a81d2 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/35/d760af96f204bd Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/35/f4074cb3c00c4b Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/36/1b1ce108db70f5 Wed, 20 May 2026 08:26:34 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/36/3b0ebc91ce5a8c Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/36/46c31a74469eb0 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/36/4ec127e5a69489 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/36/7709e6978c2259 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/36/93f185de729bbf Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/36/9be4bfe2c1537a Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/36/a20de0d8542f75 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/36/a787a2db2b21ab Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/36/b5b878155ada5c Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/36/bfe43f5dc6ce4b Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/36/c9f89922169587 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/36/e6cec83b2e6de8 Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/37/8ddd75cc72f50a Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/37/98dae1c2b38a8c Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/37/a26e0093f0e19c Tue, 30 Jun 2026 14:29:57 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/37/a5741bb197b336 Wed, 20 May 2026 10:26:21 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/37/b6717a9b4446b9 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/37/b720f88d32f74a Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/37/cc8ced4063a5c8 Wed, 20 May 2026 08:33:16 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/37/e4200584327804 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/37/eceeb1e437aee7 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/38/06c4a752d3675b Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/38/19c9328b2c1ecd Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/38/2b111ce5002d34 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/38/4b1dc8c595a846 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/38/7d3a494cf8e590 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/38/80112f6cb65872 Wed, 20 May 2026 10:26:21 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/38/91bef9dd1732cf Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/38/a07f2751ffc3bd Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/38/b5e3e70a0a4c29 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/38/e06951f6f7ad3e Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/38/e092762ef8ab77 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/38/ef78338bbf9427 Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/38/f12b71ad32ecfb Wed, 20 May 2026 08:29:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/39/236213886bc677 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/39/6e945ea33dcdf2 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/39/71659d8325ea19 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/39/92d089b185f39e Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/39/99fbfb82511183 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/39/ade997c7b9181a Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/39/f9f3138034b957 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/39/fbcf948b69533e Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/3a/07ae05bd2d93e2 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/3a/21146dfbcf35b8 Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/3a/24dea18586d894 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/3a/27881057f01e3c Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/3a/2e0187126af48c Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/3a/3c03271d5147ec Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/3a/48c98e16d47307 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/3a/51f1591e8b2c16 Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/3a/6c5cd033be1576 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/3a/6e8f2ce836533a Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/3a/79c109fa896bd9 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/3a/804e2c9f651db1 Tue, 30 Jun 2026 14:29:58 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/3a/84d7fa423f8586 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/3a/9522db88866c5f Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/3a/b6b70027c26ae8 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/3a/bce07078da3d7d Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/3a/c61f024f6adfc8 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/3a/d1dae7dc7f9d7c Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/3a/d50f296944835b Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/3a/d821c251aedc98 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/3a/e959e5582f8d34 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/3a/f50860d1af8726 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/3b/6240c41d3a89b2 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/3b/73c2dc45a0e9ee Wed, 20 May 2026 08:26:34 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/3b/7ce7c4bf1f17a3 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/3b/93b5926d42b4b0 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/3b/97d35db0cdd799 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/3b/a04b6163d90e5c Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/3b/a9870b2205670e Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/3b/afef061c097594 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/3b/e173498dbf715f Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/3c/092905989277ba Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/3c/09fc9ff6fc25cf Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/3c/92ade03c71f7ba Wed, 20 May 2026 08:26:34 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/3c/a4162583ccb382 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/3c/d8dd7942996df6 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/3d/1fc72716043ca2 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/3d/379fcddc483976 Wed, 20 May 2026 08:33:06 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/3d/3be5a70d2e0155 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/3d/3d2e6fe387f875 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/3d/4ec713dab2c66d Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/3d/60a3c6e66403fb Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/3d/7acc4df3a46d48 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/3d/7d38ba3d579f0d Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/3d/848c734bda838f Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/3d/8d866ed53d2898 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/3d/ac651bd3634c55 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/3d/b12e89ff29f1fc Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/3d/c365f3c03ba363 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/3d/c3c3521049a4b2 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/3d/c9ee3b8223a816 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/3d/f008c670323a3a Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/3d/f63165e343f35a Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/3d/f843ec4723b28e Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/3e/1d81677ff28bc3 Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/3e/47b819e78accb4 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/3e/5a37eedec2f884 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/3e/81131d4ad0051b Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/3e/85589c64877aa1 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/3e/b58fd6407fe566 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/3e/c3878ff9b55af1 Tue, 30 Jun 2026 14:29:59 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/3e/ed42f41f39b079 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/3f/00ccf805534c2c Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/3f/1efe992e09ea64 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/3f/a751e383fa862c Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/3f/ae2ec037a60fd2 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/3f/b1bb06c65ab7b1 Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/3f/dc85c5ab1de8ab Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/3f/e01de469ce1b55 Wed, 20 May 2026 10:26:21 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/3f/f0611fd480e2bc Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/40/0db6b30d393fde Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/40/12d0110f654abc Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/40/1c5b33a39f1b3c Wed, 20 May 2026 08:26:34 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/40/1edc547aef3516 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/40/3ded8e82eb79fa Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/40/49a885ccb5415b Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/40/571187ba910b05 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/40/b14ac878a5182d Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/40/c1a78601c1d4eb Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/40/c2adbd1e24a551 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/40/ddfb2fe6bc2d0c Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/40/de2184b983c34d Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/40/e5879440c1b4fa Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/40/fb7792f6f72fec Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/41/10e76356eee17c Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/41/275eaff4684676 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/41/46d882c122cd0e Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/41/5d2f6aefa6c7b9 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/41/6094f8ed8b2229 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/41/6ac63c731191e0 Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/41/6b8166427589ef Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/41/6eb951cc9de187 Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/41/74538915198e70 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/41/9c01ec7b9ee86b Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/42/359daee30ddeaa Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/42/55997ccdc77250 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/42/7c2b46e5968154 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/42/954692e417ed87 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/42/96f68e107c6e5c Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/42/ac8544e151f4a4 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/42/ff78c4246168ea Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/43/2b6bf8cd64347e Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/43/32d6d6e5a0d434 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/43/466d2eab71924d Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/43/9143ea41d89c1a Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/43/9fad42c374b0b8 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/43/c89c005853fadf Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/43/d2fbca9b1e3bbe Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/43/ed6d077cb0c80e Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/43/faba543bcaf208 Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/43/fec82f9a3125aa Tue, 30 Jun 2026 14:29:58 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/44/0d99b77027ebef Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/44/3ae1c2e16d2342 Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/44/52c622c964c0a7 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/44/553f2051331a3a Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/44/567605a48f54d3 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/44/5a414533d1aaaa Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/44/6494151fc5d7bf Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/44/6b1502f9cc917a Wed, 20 May 2026 08:26:34 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/44/75f3e92b53f7ed Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/44/8df9cb630963bf Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/44/a2e4b2d6e68d65 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/44/bd70a6f4973a75 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/44/c33a3011272a88 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/45/147038c1317d5a Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/45/204b2fd68c3899 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/45/24a42f39ece020 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/45/24a6bf156ae341 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/45/2c99c5e0d81141 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/45/2eb325ca43254d Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/45/5b58939d1689ec Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/45/64ae55ebb7504c Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/45/717d00de349069 Wed, 20 May 2026 08:26:34 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/45/7626315179e07f Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/45/b1e67b64373646 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/45/b526102a20c329 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/45/d088e43ca290c9 Tue, 30 Jun 2026 14:29:59 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/45/de2120120965c6 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/45/e610d530423202 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/45/e8895b08bdff6c Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/45/e9433cec4abb30 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/45/f7027fc11f1052 Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/46/33e7a05bf076b1 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/46/871c705d23ba26 Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/46/aeff52f69362b3 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/46/bf8d2c7e9f964a Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/46/d02f63a49b0152 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/47/020acdbe636cb7 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/47/35e49e54b7ca43 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/47/4b52ee915f6732 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/47/661c8b74844da4 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/47/6655592a96c903 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/47/787b29e3a864ed Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/47/8962947d2a3e36 Wed, 20 May 2026 08:26:34 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/47/89b402b47d762d Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/47/c0a14030f15bf6 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/47/e038cfce2f9fca Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/47/f7d0101e0fab35 Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/47/fcb39cc3296dfb Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/48/0074f5f5f40919 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/48/02bcb467bbd5f1 Wed, 20 May 2026 08:33:16 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/48/2a0ae2169e69a5 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/48/3b02b552f37a10 Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/48/548622584ddbc0 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/48/7757b3a8539eac Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/48/87dd68d966d697 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/48/a9c3af54b1267c Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/49/12ca4c2b6e05e8 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/49/32a64dbc7c5f4e Wed, 20 May 2026 10:26:21 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/49/4bdb865fdecd11 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/49/9126ff6de7e1d2 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/49/b0c2ac606a608d Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/49/b0d67435d90f3b Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/49/b191bb20850f42 Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/49/c45590796a5398 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/49/cc43b6e65a2d53 Wed, 20 May 2026 08:33:16 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/49/e71350a58460f2 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/49/f5f36535f0c19f Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/4a/39f7646a1618e3 Wed, 20 May 2026 08:33:06 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/4a/4e11c144e9ae31 Wed, 20 May 2026 08:33:06 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/4a/74e55c32ac6691 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/4a/7eda0919d1bbf7 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/4a/929ba829157cfe Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/4a/9ed4fd6c260dbd Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/4a/a5cdbf4dd2556c Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/4a/d1d665edb83a77 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/4a/d504e42bdf1ac2 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/4a/e3f7b1deed1214 Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/4b/073b3eabcc9ed3 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/4b/1107f2d520e9f1 Wed, 20 May 2026 10:26:21 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/4b/120ab709a4a6b2 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/4b/253c2609a8ca5d Wed, 20 May 2026 08:26:34 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/4b/2e9135e41bd945 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/4b/3707d4fbdce9f9 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/4b/3cad9cb7578655 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/4b/7d08aab7ed93a3 Wed, 20 May 2026 10:26:21 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/4b/c890acb9ea106f Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/4c/01caee1f8c3682 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/4c/07ff3c34071894 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/4c/1a4a424c25d686 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/4c/55c30a98ae28ad Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/4c/9a965465894601 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/4c/9f7256d29e70c5 Wed, 20 May 2026 10:26:21 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/4c/b4e05ddfe34c3e Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/4c/d9d27127ebbf00 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/4c/de0bac5bac1bd1 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/4c/f2d3f5af252c71 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/4d/072d365f0f3734 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/4d/254064eca4e7e4 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/4d/3ee8a0e26b81ac Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/4d/3f367a37064d49 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/4d/3f5593022c319e Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/4d/4d0c2c88dfcb09 Wed, 20 May 2026 08:26:34 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/4d/5c776da1af704a Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/4d/6011107a86938a Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/4d/dc10c65b6e355b Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/4d/e10027385a3a36 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/4d/e96f1aa71da6da Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/4e/18131c0eef343e Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/4e/27daa633a14fad Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/4e/4a147e87d2a420 Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/4e/5060dac26cbd0f Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/4e/538656f2f58c65 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/4e/72799aac6aba79 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/4e/82eec24fc183ec Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/4e/ad85bb00951791 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/4e/bacf5d5ed2e982 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/4e/c3f89da2431825 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/4e/f220160cdeccef Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/4e/f4b4489032da5b Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/4e/f6bcc9ddf1ddd2 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/4f/0096aaaa183f8f Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/4f/15e9d89d2b8758 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/4f/34a017caf3fe98 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/4f/5d97597e8fa193 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/4f/b04af1dbab8400 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/4f/c3f9e41599b192 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/4f/ecf21cf8990768 Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/4f/fb4a9d9d127a14 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/50/025863d4e84e9c Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/50/2fec44b40aed9d Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/50/374893f20e13c6 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/50/437c6da19f49d9 Wed, 20 May 2026 08:33:16 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/50/525ca90bed3fb3 Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/50/58f5b5f14667f3 Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/50/a33e8db6ff6a22 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/50/aec76c8ee09977 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/50/b40cdd56ea9224 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/50/beec3ad188dcf9 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/50/c5348e16b1cb37 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/50/d606f45c57d156 Wed, 20 May 2026 08:33:16 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/50/f55a9925f04bb4 Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/50/f991f1c5c19f07 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/51/021119d5c4dcf6 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/51/19fe1ebabef037 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/51/248c04fda70dd8 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/51/4107f40a18d177 Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/51/47d69f33ae38bd Wed, 20 May 2026 08:26:34 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/51/4bbdbbf647e4ca Wed, 20 May 2026 10:26:21 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/51/4fc58da1164a47 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/51/5fcec8ba6f2b77 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/51/95a46fd1bbf96d Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/51/96ed3c7e906041 Wed, 20 May 2026 10:26:21 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/51/b2f742c761a132 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/51/bc400cf2257c2a Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/51/ce5f8562609430 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/52/01a76e66bafa84 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/52/0c6fb3c8c63e81 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/52/2649a37956a7c0 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/52/273225e8bd4bef Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/52/312ecb8a76a80f Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/52/42be08f6a9cf56 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/52/4ee2a332b2a020 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/52/6eb51bdf5b7c4a Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/52/8818de93690361 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/52/94a2b3c2b9906f Wed, 20 May 2026 08:26:38 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/52/a9e6f092c4eed6 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/52/ab3851933e9a5d Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/52/b540babb50a421 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/52/c10e046d740781 Wed, 20 May 2026 10:26:21 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/52/c6707b79a3ffd9 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/52/caae08ad8ec23e Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/52/fe3f79f0e3faa8 Wed, 20 May 2026 10:26:21 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/53/163eeca6aa06cb Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/53/397934af1cd231 Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/53/42c1ff71c45b8b Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/53/51ad5e7130ea10 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/53/6050915ea73eb0 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/53/ae84d52716d3a5 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/53/b0bf5b2436f439 Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/53/ee087bbea32ee8 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/54/38da4cb4c0844e Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/54/47094a8c9b75e9 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/54/5171350dbab276 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/54/584c1ab530b0ce Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/54/a33c690711a1b4 Wed, 20 May 2026 08:33:16 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/54/ba3ec14a6adb68 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/54/f43239025c4252 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/54/f8bb6df366437d Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/55/258159ad644933 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/55/2a5981fda1baa0 Wed, 20 May 2026 08:33:16 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/55/40f9dbff0aacde Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/55/456f07445b17a8 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/55/6d1b3644c485d7 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/55/6e4d4f6ebb9152 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/55/a3e22f1a6c58ec Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/55/a85c27d594e5b3 Wed, 20 May 2026 10:26:21 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/55/b3ffc3a9239048 Wed, 20 May 2026 08:26:34 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/55/d47fdc169aaabe Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/55/e9a25ee5071ebc Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/56/1b358c0946c7c6 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/56/41bb93b0b92bce Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/56/71e718335e5dcd Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/56/85a260660d3363 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/56/c07a4c5dea1a7e Wed, 20 May 2026 08:26:34 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/56/cd2cae24c5513e Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/56/decd550bd3e9f9 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/57/02d99f51e8fae6 Wed, 20 May 2026 08:26:34 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/57/207fa2a2d7d79b Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/57/43e943d311fee2 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/57/60f7827f3703e0 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/57/8805215c8d8892 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/57/9d4bc818900fc8 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/57/d7906cfa582e2d Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/57/ed2fc1ce7e30cb Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/58/0276846234c0d8 Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/58/068f3952bf6408 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/58/1c3623641ed19d Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/58/2280903b9afcd9 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/58/6a2a89892d13ee Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/58/b601c51680adc6 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/58/be4284f588dcf7 Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/58/cc8c9a0d2a72e5 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/58/d00a46bf292926 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/58/d1674f4e6adc47 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/58/e8af672a07b61f Wed, 20 May 2026 08:26:34 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/58/f3744db355263b Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/58/fb4bf679205338 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/59/18712d53c44898 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/59/1baef90655c750 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/59/30f9f25dfc2c41 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/59/394884b604be7b Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/59/69b0c324f9491a Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/59/7eb4930584512c Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/59/a9e0e86d9481ac Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/59/adf63c2cc2a6d9 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/5a/192482e1d473e9 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/5a/267d7a37488717 Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/5a/485425addb9049 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/5a/4a7c4ae558dacf Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/5a/534b7c21b55ce2 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/5a/652202b68d347d Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/5a/6a70e1e86b46cc Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/5a/7a33a1ba2b5feb Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/5a/7eb55c999c9b28 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/5a/84efea839e9bc6 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/5a/958dcf50f28683 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/5a/d41a1b82d16cb4 Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/5b/2125085583b7a7 Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/5b/2c728e04dd3062 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/5b/34aab896ecfdf2 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/5b/676739b2a0dd58 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/5b/8f9099cd1c5852 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/5b/af6b94b520d622 Tue, 30 Jun 2026 14:29:58 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/5b/b05a17092c10d1 Wed, 20 May 2026 08:33:16 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/5b/b1d328826b8662 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/5b/b932256dc56b66 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/5b/d2206c9ac83101 Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/5b/e02976ab0f7cbd Wed, 20 May 2026 08:26:34 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/5b/e66f8a2e7a11f4 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/5b/f51a0c7b1d329a Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/5b/fb2bdf2a56a7b3 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/5c/006f0594815652 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/5c/0d82c1929d8902 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/5c/19625e644fbb10 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/5c/22bd4be66f2a64 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/5c/23dfc3cd66859f Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/5c/36603ba645eeab Wed, 20 May 2026 08:26:34 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/5c/3c485b13bf39b9 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/5c/5bd85abb6b707a Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/5c/d8cf759b7c793f Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/5d/20a12538987270 Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/5d/24e5323b24896f Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/5d/38bf35f1eef87b Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/5d/498db9bf83ba93 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/5d/4be3b20c604d09 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/5d/4c75098906dbdb Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/5d/5de95572f52201 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/5d/65e264320175a7 Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/5d/7c5af0c3c5890c Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/5d/8efc5a3d7f314e Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/5d/919d8d064b2a88 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/5d/9ec4247aa0bb96 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/5d/a6f74e840bc3a5 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/5e/15c07522574385 Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/5e/30f92637422707 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/5e/413187c252cb9b Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/5e/46e8ef781ce379 Wed, 20 May 2026 08:33:16 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/5e/55c69f3c738718 Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/5e/695a493db08a67 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/5e/8cdfa9024917b1 Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/5e/a59493f104d309 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/5e/dcc041e8d57bb4 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/5e/dfb31c033db7ce Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/5e/f4e2986fcafeee Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/5f/053bf67172a399 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/5f/25e90ef7bcf82a Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/5f/2f61edd971be4d Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/5f/413c1238b92734 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/5f/5eca7726841206 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/5f/77fc0aa2efc469 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/5f/7982e2fb8a54ad Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/5f/937d6b02ab0f91 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/5f/981736eed6dc64 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/5f/9b53e8e9bc5241 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/5f/9b943b6a28366d Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/5f/a89d51cf24f783 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/5f/af3b1c975c1186 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/5f/b2800c2eff2b72 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/5f/c1a65b105788b8 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/5f/c658f105f1aa00 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/5f/f3b2f38987990b Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/60/2ae368978aee81 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/60/5ea9744998e835 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/60/74e59badd4b6df Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/60/757578bb315bbd Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/60/9be2d9258134d4 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/60/d1ae683e626f39 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/61/0d774f57879293 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/61/5651a67b42d4d8 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/61/5bfd07f6d2e4b7 Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/61/7cf5fc85a307c1 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/61/b32de0aa50e00e Wed, 20 May 2026 08:33:16 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/61/bddf2eb791d2bb Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/61/bf944dab847b89 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/62/48b2efe0a853c4 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/62/76475d3adc6fb2 Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/62/964f5d01857825 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/62/cd2afdb57c275b Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/63/03687f0a62500f Wed, 20 May 2026 08:33:05 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/63/2719319b1353dc Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/63/48a4dee77de780 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/63/4c5542bcc367f1 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/63/6415ae0226b8ab Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/63/a6e86d00eb1227 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/63/a6f69f55134ecc Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/63/c1c5aa9393e384 Wed, 20 May 2026 10:26:21 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/63/f34eb61b3a14eb Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/64/243153db3c38d4 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/64/4d430441c65e6e Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/64/4e747b149534cc Wed, 20 May 2026 08:33:05 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/64/5d8828db922853 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/64/85c924cccc4e21 Tue, 30 Jun 2026 14:29:56 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/64/8f556982b1df9e Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/64/92c4c8a537abb2 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/64/aaf08c57ee4397 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/64/b830e2df3a2c20 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/64/cbc3974359eebd Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/64/d61f40d4b26b6f Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/64/d9f5a8e4c1cc30 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/64/f274911b66bb04 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/65/15a50367350619 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/65/4b0d776e6ae1d4 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/65/729f1540c842a0 Wed, 20 May 2026 10:26:21 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/65/74edb73542f98a Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/65/d593d2145ce2a5 Wed, 20 May 2026 08:33:06 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/65/d691f71c9439da Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/65/e4e5f93f9d9b0a Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/65/e71b06c81b5d87 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/65/ffb2411322482e Tue, 30 Jun 2026 14:29:56 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/66/14dedaf5336476 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/66/69883d123867ea Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/66/72ff46bb9889dc Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/66/b6aac637e15998 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/67/21ab5c58e295ab Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/67/42c3b474c47bf3 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/67/4c68c66a62f159 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/67/54a3f24ab410dc Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/67/77a321a761950a Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/67/7d2279c5db326c Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/67/b7fff1779f7892 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/67/ca27157b847885 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/67/d6afc8a4e58d63 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/67/dc8e93cab69996 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/67/ef6656fca7dc5a Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/67/f4a6a0feab5925 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/68/3c66bd8eed37d8 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/68/3f268b3663a370 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/68/5d5c32b21f7b6d Wed, 20 May 2026 08:26:34 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/68/68fa3d4aa8570d Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/68/6c0782c996a4cb Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/68/a6e24513ec63d9 Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/68/b55ebd993c663b Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/68/b5c88a26d86455 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/68/db19ab66d2841b Wed, 20 May 2026 08:33:16 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/68/dcd677ce4073a0 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/68/e4833b482ed0d0 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/68/e6b2581037bd5f Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/68/f6bb7be43dffdd Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/69/25c8247afb4ef8 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/69/2db796a28fbd00 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/69/46d7dfd4536d27 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/69/5f39a29703d0b4 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/69/65dc90889e4283 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/69/6da54d5bacaf1f Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/69/77e1bc95e34f54 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/69/78077929068a63 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/69/8ca638a69700de Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/69/9326dd6e665c8e Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/69/95ad21ae1d4d33 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/69/d65583aae2fbc8 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/69/e02cc076eb97fa Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/6a/248373f5b8cd98 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/6a/280b76cbd9852e Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/6a/29c198626c177a Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/6a/4f957a74f885a0 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/6a/9147068d8f5353 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/6a/a2a6c1e81b5477 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/6a/c5e352a4d3215b Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/6a/d9b519dae8df30 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/6a/df2ac5928fe3e8 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/6a/f8a5a5b641649c Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/6b/11b2f7795d1708 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/6b/4b8092e32a6d37 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/6b/90a3a12e02f982 Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/6b/a163ebdbb14c4c Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/6b/c219ccc4914350 Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/6b/c8edcd56415cbd Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/6b/db795f4e269f7e Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/6b/de2407376ce919 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/6b/e0e7ad3ad3dcee Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/6b/eba407eea3b6ee Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/6c/053e3264ba3462 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/6c/0c3c55e5358c39 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/6c/78744f29af4ab4 Wed, 20 May 2026 10:26:21 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/6c/8f1e4334a81ce5 Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/6c/923c6469cb6311 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/6c/98e3cf25918f57 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/6c/b25aa5a3bd0ba5 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/6c/b2cdc4651aa1f7 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/6c/be6e3bbd52c39c Tue, 30 Jun 2026 14:29:56 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/6c/cbab46aa5b226e Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/6c/dbc0b590ffe55b Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/6c/fbb36e69d153c0 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/6d/19acf32fd1d25e Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/6d/3d4522350cdc61 Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/6d/4a9393e73c1d88 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/6d/4ba734966d5ee6 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/6d/5a035f37ab81eb Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/6d/76864bc23f6302 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/6d/79bd6216e300f3 Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/6d/812268663fa519 Wed, 20 May 2026 08:33:05 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/6d/8b048580eca38a Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/6d/95edaab4525117 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/6d/98c14c5d86e950 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/6d/a9b69ae37d5240 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/6d/b8de48f93fa8fa Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/6d/bf35ff39dd0290 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/6d/c837d5b97862ff Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/6d/e870f4fbce4183 Wed, 20 May 2026 08:33:16 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/6d/f498c59af12219 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/6e/1bab46e9acbd6c Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/6e/3ce0035355db4a Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/6e/61567e903dfb38 Wed, 20 May 2026 08:33:05 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/6e/8736d661af7d52 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/6e/873fa49a088f44 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/6e/c4e597619fa776 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/6e/c8f90439b84211 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/6e/ce27e9100f44bc Wed, 20 May 2026 08:26:34 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/6e/e2ca24983bd6ac Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/6f/3a946e6eff7d18 Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/6f/4eaded10e21227 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/6f/5376c54f443a12 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/6f/55d6abe2f8a112 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/6f/5b2afccec7033e Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/6f/6826ccf630fa93 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/6f/7298d3b75c4ace Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/6f/7d19eed07243a7 Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/6f/934f45d5389213 Wed, 20 May 2026 08:33:05 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/6f/9924c8a3401ccb Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/6f/9ab869d5af009c Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/6f/9f9eaeca520a18 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/6f/b3bf779a230bce Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/6f/d290c68dc30fc9 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/6f/db26f48209a0d7 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/6f/e0bcf4314b66ce Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/6f/ee78a5a8c9c063 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/70/2ab8e48808fa09 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/70/47c8db8edd8ec4 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/70/65fa1fd73d6e44 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/70/7de1b8f0bac97f Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/70/d9ade64c692c9c Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/70/e967405c043529 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/70/ecef52549edc64 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/71/20b0453efb5d30 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/71/49f7d2d35ddff2 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/71/52db4f2e3e04bd Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/71/58686bc5888098 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/71/7c46c287a66c9e Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/71/8d2af9a8688935 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/71/8f3a04c2cc8209 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/71/92b6194eda88f0 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/71/dcc4a07e87dc37 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/71/e321de566e61f0 Wed, 20 May 2026 10:26:21 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/72/23a9307e7aaa59 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/72/39b93a700bb042 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/72/405a487a2188df Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/72/46e215c46a18ee Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/72/4821ac5a6dcd28 Wed, 20 May 2026 10:26:21 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/72/5510c6cfbe52ce Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/72/6da736966ed9d0 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/72/860d1e5e397e02 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/72/8794d69110f4cf Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/72/99667c3ee7c209 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/72/aaaa45b963f638 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/72/bc3a0fce909439 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/72/d1d6d8c42d520b Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/73/1fd613d784bbe1 Wed, 20 May 2026 10:26:21 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/73/33be24db7a9581 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/73/60dd262bc9bfd6 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/73/6a033f5f36071d Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/73/a832c2a471439e Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/73/a84d8ed7f7e963 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/73/db3c009dd54985 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/74/06c0fe1ede0f19 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/74/1dc47b6e5f73b7 Tue, 30 Jun 2026 14:29:56 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/74/2253968f2b7763 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/74/2d958ac4eecd74 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/74/4ff9599ac1f106 Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/74/94788caadceadd Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/74/b2381ae436d85e Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/74/bf7bb8a2418ca4 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/74/cbcb0e6d506fbe Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/74/fcdc8138d5404c Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/74/fea0d3108d1ee8 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/75/035bffef4f5554 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/75/1e9d0f513b10d3 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/75/4bf79436c46e3d Wed, 20 May 2026 10:26:21 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/75/4de33cdfdd4e7e Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/75/8862365dd83e73 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/75/8969c43a0a3cc5 Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/75/a3deba4e9b53f3 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/75/aef3351d155c37 Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/75/b94b154bd4fb4a Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/76/2e2948bb833527 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/76/5583f78d6c20ab Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/76/6a175bc818d2a6 Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/76/76e2c0ada15715 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/76/9fdd035942e06a Wed, 20 May 2026 08:26:34 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/76/b3324c9b12063e Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/76/c36fc70bb4949f Tue, 30 Jun 2026 14:29:56 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/76/c5315306d5af8e Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/77/062689def87a4b Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/77/2569ac97a7cc16 Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/77/437fe0a1693f1d Wed, 20 May 2026 08:33:06 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/77/5eb72dc4619121 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/77/7e536314668b28 Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/77/a4c58a402c4e9a Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/77/a7be5ab9b16d49 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/77/bdf8b7c0c9b3de Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/77/c7b35f75aec84e Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/77/ca0aa414c86595 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/77/de095a819320b7 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/78/0d074f2f3e8c4b Wed, 20 May 2026 08:33:16 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/78/0ebd45f20d98c1 Wed, 20 May 2026 08:26:34 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/78/14718e890f89cb Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/78/3af29a8e60e273 Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/78/3da39aa16623dc Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/78/4be0aab8c36788 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/78/4cfbfc121b6f24 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/78/a943ffc7fb5f4c Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/78/ab18939e810059 Wed, 20 May 2026 08:26:38 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/78/ce517ac16a5b3b Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/78/e736d79d5f4431 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/78/ea2482963cbcee Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/79/07c0bc0fcfb684 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/79/1d0f6e04434a12 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/79/2ec8936249c4bf Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/79/2f41d6b6c82854 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/79/2fe40353a779ca Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/79/3ad5baf4871e1b Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/79/40771f77dfd1e5 Wed, 20 May 2026 08:33:06 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/79/5bc730face699b Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/79/63c8d355c6cccc Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/79/67abf5abefe371 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/79/7e46a6e4751422 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/79/86b1c73dca2353 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/79/b3431324a239c2 Wed, 20 May 2026 10:26:21 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/79/cc6c1a6b4d91cd Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/79/d2fc4d6688c41a Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/79/d75a57f13191d7 Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/79/e07b92c6dc42f6 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/79/ea9e2b18a90206 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/79/fec9864428975b Tue, 30 Jun 2026 14:29:56 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/7a/1d67130cbd1eb5 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/7a/5e580e55267305 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/7a/8535e940db0824 Wed, 20 May 2026 08:26:34 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/7a/98417fc8da0a54 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/7a/987fc82c37bcff Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/7a/9a6317d71ca330 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/7a/9ac1f74bdb11e4 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/7a/a379480a5389b9 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/7a/b01633153dbcc1 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/7a/b7043ddc8af879 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/7a/c73291e2ee8a92 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/7a/cabf8442e58096 Wed, 20 May 2026 10:26:21 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/7a/e238fd175f667f Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/7a/e3110e9dcdb833 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/7b/011b9c7675bdef Wed, 20 May 2026 10:26:21 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/7b/015b71b47d3f70 Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/7b/0c970dbc750fd3 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/7b/3288c12ee50421 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/7b/6b58fbdd518083 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/7b/d13d38218268ba Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/7b/d1cc27e8c8e2ab Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/7b/d89a9d4bd6cb37 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/7b/e1281cfb8cdcb8 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/7c/614ee48ad59dc4 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/7c/6adaf6cbbdb752 Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/7c/7541641d3a99b4 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/7c/c9117d12dd306a Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/7c/da64721a82776d Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/7c/eb6384060d6a0e Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/7c/f22ee40441e685 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/7d/0daa3749f2a9de Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/7d/2bd8b3e87a9c61 Wed, 20 May 2026 08:33:06 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/7d/4ab29216ff53e8 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/7d/604753add832b8 Wed, 20 May 2026 08:33:06 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/7d/64a2eb26ecd907 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/7d/76a7f861f2c760 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/7d/89132543cc105a Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/7d/9f42b0a99e1dee Wed, 20 May 2026 08:26:34 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/7d/a18e934a387a07 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/7d/b05285a0732c1d Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/7d/b97753c1a8275d Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/7d/c3b50559b2e863 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/7d/ce7563b89a184a Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/7d/d733810ac832a9 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/7d/f1079eb7ad367d Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/7e/18362984c97e03 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/7e/45a90d8897b3b5 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/7e/5adcf273d33ca6 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/7e/805f346885b3d0 Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/7e/ad489feddf405a Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/7e/c6ea766b5dcab9 Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/7e/d1c0d50c72a8fd Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/7e/e0bc053929442e Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/7e/fafce40a8d2e05 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/7f/1e5ac47c949e72 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/7f/20a62c85206475 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/7f/32bcdf68f71514 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/7f/41350abaf3242f Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/7f/496dd115b7b701 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/7f/4e5ff40613ca05 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/7f/6243c7789e7aeb Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/7f/65222fc4f0fa4b Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/7f/825557320686f8 Wed, 20 May 2026 08:26:34 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/7f/a2eea4ae681ca5 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/7f/b1d7421c8ca68c Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/7f/cf383d200b1c98 Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/7f/eb888ada7f7776 Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/80/1254fb1dae65ab Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/80/3532e07547c5ce Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/80/40bec3d9f818b2 Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/80/43d7a98b71d68d Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/80/4bdbff8a216f9c Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/80/4e9aff062c4229 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/80/7afcd7073ac36d Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/80/9b6380b3fcddd6 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/80/b51e524532d4ea Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/80/da94f872dea4fe Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/80/e4d9a04b593cb8 Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/80/ff0f3eea3c692b Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/81/0e3a08d74a8270 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/81/65df28ea3a5b39 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/81/6f525642c609ed Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/81/79c7a10a2e021d Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/81/7d80fcbbb2b7a4 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/81/a6ffa7f1512bc2 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/81/d49272f01a9165 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/81/f0d68802785989 Wed, 20 May 2026 10:26:21 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/82/01b10f06c4580a Tue, 30 Jun 2026 14:12:08 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/82/0e9ca0f2d7ad19 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/82/36f4de145a610e Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/82/584c8e9a74af7f Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/82/65d5b315a8e404 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/82/d3d526c0e481bf Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/82/dc95354e469ad8 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/82/f4fe9f87d2b047 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/83/6f01ddc5f52717 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/83/76d764fda7ac2f Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/83/ae18cb706fed44 Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/83/c31cf4921cd6d8 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/83/ed6f15694a0cc4 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/84/106059c3ab6028 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/84/2099e9e378f2c8 Wed, 20 May 2026 08:33:16 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/84/8915a918bc54cd Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/84/8f85977b09a857 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/84/a3fbac3eec2610 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/84/d2d25ce93e6acf Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/84/e357d3e72661e1 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/85/0532cdb7a695e2 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/85/0aeb403cf39ac4 Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/85/162e83480f8c94 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/85/403a5ada1d445c Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/85/456b2848c8dedd Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/85/47c3254f6fa71b Tue, 30 Jun 2026 14:29:59 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/85/abc4d4579d79ec Wed, 20 May 2026 08:33:06 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/85/bcdc83e4dc6374 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/85/f7c6e4160136ce Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/85/fb16387bcad8d4 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/86/087c1147789b14 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/86/248440228b9f32 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/86/31bf265a8e443e Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/86/39312b85172a4a Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/86/4dce75bbcff399 Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/86/5d8c1618711df4 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/86/bdfc8ad9fd3c86 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/87/0918c36b8b78ff Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/87/0963b7aa2a2d21 Wed, 20 May 2026 08:26:34 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/87/5e7caede105c71 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/87/62269349a8d838 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/87/800190dc6ce6d5 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/87/a531d78ed7ba2d Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/87/bebceb7046c7f6 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/88/260742190573ae Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/88/348d6f2bc7da02 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/88/42d6f939972a4f Wed, 20 May 2026 08:33:16 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/88/5c3941ef663c9a Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/88/7de7967c240ab1 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/88/bb03a3988fdd1b Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/88/be20c2ef35b2f4 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/88/c7297338ffa10e Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/88/e58c26a16bf9e2 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/89/0673ecebc6d12f Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/89/1b0b39c81d4524 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/89/1ce4de30fa66d8 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/89/20c2336063b444 Tue, 30 Jun 2026 14:12:08 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/89/2c445aa1936438 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/89/41b67096deefe8 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/89/466d8726041cda Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/89/563e0fd9d4c4ba Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/89/730a06f2158e76 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/89/771557f348d89d Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/89/842d10c1a284ab Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/89/84a3737a63f160 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/89/8b3a7cb57cc663 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/89/c038765f6e2c7a Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/89/cefb5f6cc72d8c Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/89/eade991674d145 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/89/f2db5c95962138 Wed, 20 May 2026 08:26:34 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/8a/2220fa3add8230 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/8a/3c29436083cf28 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/8a/7a5c52412b1058 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/8a/a7d85fc5c450e9 Wed, 20 May 2026 08:33:06 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/8a/c3aa60109a6829 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/8a/d9979a2c401ad4 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/8a/fb03cd3545ecf9 Wed, 20 May 2026 08:26:34 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/8b/2dc6ddd919a181 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/8b/3115abbb0e2d31 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/8b/41411e23faf9ea Wed, 20 May 2026 10:26:21 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/8b/4c11923c4a45cd Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/8b/7f14353e983eab Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/8b/83c9028b3fbb9b Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/8b/83fab0ef7f013f Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/8b/8f6b330a03e0ab Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/8b/abf0bf317e0942 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/8b/b8f6f0fc24db94 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/8b/c1b53117dbf5c8 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/8b/c4f0499b065040 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/8b/d98016640aa24c Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/8b/f8f8dc22a15ad4 Wed, 20 May 2026 08:33:16 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/8c/15114f1fad02a9 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/8c/2df6c28bc656f5 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/8c/45f32d91a111a9 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/8c/6f5791e4d0464e Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/8c/75e7d6bbd522d8 Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/8c/9aa30014166703 Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/8c/c17c1837e933ae Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/8c/d062bdf82a220c Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/8d/0567a0f52f408f Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/8d/4df9895f1f85aa Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/8d/5a870f1c3f92b4 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/8d/718306cda38caf Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/8d/93ea200c33ccba Wed, 20 May 2026 08:26:34 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/8d/ab7350f35b0c0e Wed, 20 May 2026 08:26:34 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/8d/b1023d6ecf0309 Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/8d/cfbd4a99ff9196 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/8d/ea225794cd7e8e Tue, 30 Jun 2026 14:29:56 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/8d/f2f40c6c8d79d7 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/8e/0775c2c342f0c6 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/8e/1475a3c4ae71dc Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/8e/317d3980dba8d9 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/8e/6739619c7f8111 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/8e/694182f95128f8 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/8e/69854bc5702a8e Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/8e/857e5bb0ae355d Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/8e/9a8b1c4e0af36e Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/8e/b775130db61dfd Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/8e/c3814392ec87d7 Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/8e/cbcc9b7636cd30 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/8e/ddd5ec03087685 Wed, 20 May 2026 10:26:21 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/8e/e216a53e5773f3 Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/8e/e572a8630822e9 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/8e/e603ac4c2f5bb7 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/8e/eb89883d564370 Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/8e/f1daac880b4ddf Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/8f/216a6ecfc37014 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/8f/28877d35b83f49 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/8f/49cd9ba6e4bd4f Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/8f/5891e815eb7a83 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/8f/7349c5c563bc8a Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/8f/800af4ed9eea42 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/8f/82c08695acc999 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/8f/9cba1a70d32510 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/8f/9d0527f31458ce Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/8f/d7fedd9e915428 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/8f/e5a21986c8f7f0 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/90/01de291ab83205 Wed, 20 May 2026 08:33:06 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/90/0c9f1b1f95ac00 Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/90/5cf0f90ad40438 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/90/81ae3e6c0a5543 Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/90/c44ec658e55c40 Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/90/caff89a74f7929 Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/90/cd64856033b0ba Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/90/d131bca0a581a8 Wed, 20 May 2026 10:26:21 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/90/d266629a33d9bc Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/90/f1459af4f391c7 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/91/0320e575b4c5db Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/91/25046a410fabb9 Wed, 20 May 2026 08:26:34 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/91/32b98000b64120 Wed, 20 May 2026 08:26:34 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/91/92fe1bdc01f936 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/91/9592949a7d6398 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/91/bf0f08fff8ab9c Wed, 20 May 2026 08:26:34 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/91/dec236ba033b4c Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/91/f2bf1f377cc384 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/92/019a97f9ce6c54 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/92/1560a6c56a51be Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/92/30ec22ee9e93ea Wed, 20 May 2026 08:33:06 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/92/52b293c3e92ff6 Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/92/a5234132653811 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/92/c9e1304706532a Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/92/cf8aaf1ab42529 Tue, 30 Jun 2026 14:29:56 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/92/dd8f7907b87302 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/92/e466e09c378e26 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/92/efb8ae40864bed Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/92/f5cd63a1b7ef1a Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/93/03812b008c9e4f Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/93/0f44735623a5c9 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/93/0f838d3696e52f Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/93/315ab418d699ac Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/93/53fe3052170d06 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/93/6354b168e56a7e Wed, 20 May 2026 08:33:06 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/93/69dd1862c75210 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/93/8a26cb5cb75b04 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/93/9a5591c156a95d Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/93/be38361647d7c8 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/93/c1330ced438c59 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/93/d0a8289ca05493 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/93/f695f90f5bd02e Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/94/03a3aaaf09a42e Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/94/2463664124cc7c Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/94/3fd66f26babf56 Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/94/500688b509a48c Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/94/548ebb28f51383 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/94/6ef01be81acb4a Wed, 20 May 2026 10:26:21 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/94/78c254ae3d5445 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/94/98563768309937 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/94/c863429bf769c0 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/94/c86b0d45a00b08 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/94/f27c75180aceb4 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/95/00c9bf1ec44b1c Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/95/3356a7bd56d25d Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/95/765329d8b17035 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/95/8cbe70e0ba2f65 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/95/a8435550152b77 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/95/c509da6d0ec24f Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/95/d2fd279efe1183 Tue, 30 Jun 2026 14:29:56 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/95/df3e0c7721658d Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/96/0a5cfdbb257941 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/96/32c0685e1ef64b Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/96/41f8e6b42580bf Wed, 20 May 2026 10:26:21 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/96/5f4476fa7a5831 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/96/83581f8ada2ac9 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/96/dcb46131546c53 Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/97/0baa4ebf0f61ce Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/97/263e2a93b57349 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/97/322f75281e51be Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/97/325e2f934bd2b4 Wed, 20 May 2026 08:26:38 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/97/3eb29e1823b87b Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/97/42e5f84b4c8332 Wed, 20 May 2026 08:33:16 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/97/45b06352b37b7c Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/97/462efd02a26ca1 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/97/899fd5e9e5ee2d Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/97/a13ca7a6e37519 Wed, 20 May 2026 08:26:38 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/97/c39419b4d6d111 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/97/c4ad5930c53197 Wed, 20 May 2026 10:26:21 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/97/f410ee355146b9 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/98/00cab7f92ce1b3 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/98/1901014f594561 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/98/205988c3704b28 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/98/29dfff40043a2b Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/98/302a017f0d3e78 Tue, 30 Jun 2026 14:29:56 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/98/40fa384fdcaeaa Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/98/49ff0a74c7e444 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/98/9d763856c5baf4 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/98/a4bef30a2437b9 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/98/b63d780f858326 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/98/d837cfd00f9344 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/98/dd71f5d90ee56e Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/98/f8ecc39e30d5fb Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/98/fd61305f9dae9d Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/99/393241c25cfcbd Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/99/818a7c65aeaa47 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/99/8f7c970f9cc078 Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/99/c640b6999a17b4 Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/99/c938bce4dba95c Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/99/cacdf5c6dc07f1 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/99/d912dd8020e917 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/99/deb1bd0374c418 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/99/e0f9e78e5a1e28 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/99/eea0b86102e830 Wed, 20 May 2026 08:33:16 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/99/f8797c52068f9c Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/9a/0a2c3c0b61dd4e Wed, 20 May 2026 08:33:16 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/9a/1c46a4cac32c5a Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/9a/2efcf734a1ad93 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/9a/4c5c916428b6c6 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/9a/9b0521bbdcf5aa Wed, 20 May 2026 10:26:21 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/9a/b7bb40d9a93821 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/9a/d3e6006194a4c3 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/9a/e2c569ebf7adef Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/9a/f1e25d02896503 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/9a/ffddb552b2b8a6 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/9b/1d8ba827a08f4e Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/9b/44a5a23c20b905 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/9b/469cb095664051 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/9b/58ebe2a49292c6 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/9b/86302434b415e4 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/9b/863c4fcb734b1b Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/9b/941f88808d6277 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/9b/c637633b6cd278 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/9b/eff2a63f1efa16 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/9b/fae98d3578e89d Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/9c/2a794ed6cbc230 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/9c/303b560f0c9c62 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/9c/55d5393c02a29c Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/9c/5d71c4c88bd912 Wed, 20 May 2026 10:26:21 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/9c/6647d7c11a768a Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/9c/c3104912ea392d Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/9c/c75643e38e051a Wed, 20 May 2026 08:33:06 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/9c/d46dfe590933e1 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/9d/259eef1b60b276 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/9d/312daed73d6845 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/9d/32affa22d267a3 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/9d/3b5d0aae3e0a02 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/9d/3f2480804ca2eb Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/9d/423830cca89b69 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/9d/448f025232e7c0 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/9d/4c65b8a462ed48 Wed, 20 May 2026 10:26:21 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/9d/52f8719d917ae8 Tue, 30 Jun 2026 14:29:56 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/9d/5dfd5629a317a4 Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/9d/6b93cb80df4590 Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/9d/7b7a64f116f1b5 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/9d/7ba4e1e6815173 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/9d/9b22ac872cba41 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/9d/aa9db10fae6506 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/9d/b02092d1906e88 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/9d/f69295dbea2973 Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/9e/00404dc918f3a2 Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/9e/0904e31284e8df Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/9e/20783f49f0c62f Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/9e/38ffe8e631225d Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/9e/498522aa379aa9 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/9e/4a96465d251dcf Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/9e/95b8c1c19a81cc Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/9e/a4db51332b2072 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/9e/a88decc9154e00 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/9e/b6105a3c1ab957 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/9e/cea2c0cf594b28 Wed, 20 May 2026 10:26:21 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/9e/e5721c4409fcdc Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/9f/15506b41627f9a Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/9f/3bb35e4255c79c Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/9f/46d5e89128b00b Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/9f/671844702503b6 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/9f/7e9b2ba621cf3f Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/9f/85f37b7c338a7e Wed, 20 May 2026 08:26:34 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/9f/8da5e7fb6dc492 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/9f/d29738fb9bed28 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a0/077d36fd6fedbb Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a0/0b3a364e79a81b Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a0/25f0eb011e147a Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a0/2c9eb39d47714c Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a0/3685ebddc3ae75 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a0/3cfdb487cceb22 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a0/532c1f61963235 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a0/badf66a8df0ff2 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a0/f11e05f9f200a9 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a1/0d02927eb72afa Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a1/28276cd16db749 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a1/351446b710e73a Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a1/4a34240192e9df Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a1/4c71dbf775e9ee Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a1/70e007ae783dee Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a1/913fd5b241b400 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a1/a4e9a62b1c73a5 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a1/a72d374e7d7ff9 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a1/c47ef4e004fe3d Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a1/c73cea53942f44 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a1/fb068321507ce4 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a2/03ebedeec40936 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a2/26beccdcfb2df9 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a2/41ed20466ec68f Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a2/44576c31c284bd Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a2/4cee55c1e846fe Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a2/51d0e66058e1a2 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a2/628f104779d82d Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a2/7b43457be5a6f0 Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a2/7b6f0ecc5c26c6 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a2/951112544de24d Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a2/a6effe273cfd82 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a2/ccd45c9ab7bd49 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a2/cd9658873e67bc Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a2/df2a4d89003448 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a2/ea7a186d1cd5ce Tue, 30 Jun 2026 14:12:08 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a2/f0d42c27e88828 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a2/fc84c8e3968aa8 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a3/282d33e9f14dda Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a3/4a3b14447a417f Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a3/5124ed8f7c89dc Wed, 20 May 2026 10:26:21 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a3/60379f821e18b7 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a3/6c6fb04eeae660 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a3/761643734aca8c Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a3/8a949dc540cf5a Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a3/8ec97aa9eb0dbf Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a3/90685e950a09e6 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a3/9593b4c4a03748 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a3/a91d10a0f85e6a Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a3/ad53e453008d18 Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a3/c9f7d47527035c Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a3/d1efc666d4e36d Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a3/d2cd117f8295e8 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a3/d9c59125e5d401 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a3/e489d7f9b650bf Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a3/e5c1d85af53da1 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a3/ecf86247252df5 Wed, 20 May 2026 08:26:34 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a4/0e5745b52ec0a8 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a4/26df8c65b361dd Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a4/3d6c60bd95ecf6 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a4/46854e7dfcd9d7 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a4/7395636a9dbb4e Tue, 30 Jun 2026 14:29:56 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a4/9d0426a7984ab5 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a4/f0dc4ceaec8b00 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a4/f3c6829400a440 Wed, 20 May 2026 08:33:16 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a5/10ff8ebb33c41c Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a5/11edb2d1fd86d2 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a5/37fe0e58a787fc Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a5/5616897efcc488 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a5/5bfbcc26058c9a Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a5/6582d9de284f02 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a5/666af38ce16d60 Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a5/b2437afbb2d8e4 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a5/d8250685fb8452 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a6/37d6141194344f Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a6/489f10cdf1b0b2 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a6/912cca2a028783 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a6/a645f572c2ba20 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a6/a8478c9dcfc940 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a6/b3f8ab678e9c5a Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a6/b7134e56d8784b Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a6/bbafb3adb523c8 Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a6/cbef85aea01bf3 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a7/1123fa9f427ab8 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a7/2eb7e0596ee285 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a7/344094f1895c3c Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a7/41244bcde9b4c7 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a7/48123e667cc7c3 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a7/a9f38d1008fa31 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a7/bd7b76e831c744 Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a7/c994a5fa0ea469 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a7/fa51bda7735a67 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a8/67fa0da17d153d Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a8/7341b98963288e Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a8/82091a0f03d608 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a8/9f2696180c6f65 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a8/ae7c7d49d250fd Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a9/138a2fc64b1487 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a9/1bc4f18b0df4aa Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a9/53f3445758015c Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a9/66c4ac78afa01a Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a9/99a85995be5a62 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a9/ac977212282d9a Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a9/b24b275c9249c3 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/a9/eb3b8534ec6c8b Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/aa/1136a4266d1d15 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/aa/4030ac93b14822 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/aa/44800432436076 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/aa/7471f0f75c22b4 Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/aa/8ee67c12f6657c Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/aa/a6c4500af666f4 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/aa/b68f48a32e2d98 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/aa/ebee7d95568079 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/aa/fd1ad1dfc5fb86 Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ab/1c9986f8a89727 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ab/1f60e606ea677e Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ab/2e205e5f37fbfb Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ab/33182c657b5326 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ab/36ec180f4ae146 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ab/6168d6449b7fed Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ab/78ef221f815f91 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ab/8ce586e29f47aa Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ab/9dd72e97b64d6e Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ab/dff5f316002945 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ab/e0372cefcf684c Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ab/f7237e04756ccc Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ab/f892a61e9a7c2f Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ac/02cff9514b4d2e Tue, 30 Jun 2026 14:29:56 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ac/0ff68db3841613 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ac/1a12f6eeb27c3e Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ac/21445ff539eb23 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ac/5673d5cfb540a4 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ac/9ac03c4c4ae452 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ac/cde6e44da0f2b9 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ac/ce9303f3392a46 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ad/0f121e9b233cb6 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ad/5d552fdfa6208d Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ad/61beba8cb9abef Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ad/903e4f76567574 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ad/9b91f97bd05bc5 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ad/aedeaa5316af59 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ad/b90b90cfa561de Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ad/c86f110ee38983 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ad/cc7d89177726aa Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ad/d220aa9f5795d7 Wed, 20 May 2026 08:26:34 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ad/dc7526c5752d02 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ad/e8e7a90b68ce15 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ae/23627d7755197e Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ae/3572462de0987e Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ae/489c843f2bd28a Wed, 20 May 2026 08:28:11 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ae/4c8c43c5ec19a9 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ae/65508a557e6ffc Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ae/856d52e04f88aa Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ae/ab74d4e184ea11 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ae/bcab99e76a7745 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ae/c2281561fdb266 Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ae/f281a027f59166 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ae/f3e0dae7e744d2 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ae/f67b1f5ba8568a Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ae/f7ab603fbfd89b Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/af/0cf4322d027f29 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/af/223403b9b6d36f Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/af/44c81192c7bb91 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/af/92814313bd8f2f Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/af/d140c57b1df6a7 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/af/f9c84220a59561 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/af/fcbc1afc98af5b Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b0/02ea6bc7325081 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b0/13246f1cd2d95c Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b0/1752f41a303f01 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b0/19405555c64223 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b0/51a36fbc60ff4c Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b0/5c1b53dbc11740 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b0/6a5fdb88f11952 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b0/73aaee80853b63 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b0/7dd9b4213b739d Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b0/829a553f9b8540 Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b0/b133113fd93648 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b0/b79927e3457e09 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b0/bed80aa97164c4 Wed, 20 May 2026 08:29:48 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b0/e1fb071d5e1036 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b0/e59bd7f46d24a5 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b0/ec5bd53fa140b0 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b0/ee5807f029a0fa Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b0/f495f93b68dd05 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b1/08703f3358823d Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b1/2593912e291bbb Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b1/5ede620d81cbaf Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b1/628bcda0039af3 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b1/6666d4c9e6bdd4 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b1/6f1fbde1d7ab5d Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b1/736354d203b9e0 Wed, 20 May 2026 08:33:06 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b1/7a2683486e9918 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b1/849f1a885d4122 Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b1/993795b5844f20 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b1/d04f018509c21e Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b1/d6df21767f37c3 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b1/e1fcaa1f1eaa37 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b1/f7734d458443d2 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b2/097e5a67f4605d Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b2/0f414a932fe2e1 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b2/204f18bee5cf3c Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b2/344734e5a2c5b2 Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b2/422a3e5b0ce230 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b2/664b843f5f343f Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b2/6b07e0340056ee Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b2/7c866ae69cdc99 Wed, 20 May 2026 08:28:11 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b2/80d078245283d3 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b2/97775cad39b37e Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b2/db936557b58e64 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b2/e8ee9e41fd01c3 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b2/e92fa40c933bc4 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b3/04cdabbe7b775c Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b3/0d874dc2fbeb91 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b3/1dfb60970adbec Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b3/5c3e649afc3d31 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b3/60eca8c67b1424 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b3/99aa88c0bef0e0 Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b3/a7c42d896493ae Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b3/ae5bca297f9eb9 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b3/e1758777ea3c9e Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b3/fb78e66bdfe1d5 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b4/2fe2f05e67bee6 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b4/30f3652ee95ead Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b4/3a7786da9630a8 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b4/64dfd2b35eb32d Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b4/9b6b3f73beac5a Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b4/bcde90a8d56270 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b4/eeed3a0435760e Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b5/0409bc4fbbfc24 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b5/23eeb76cab9728 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b5/683bbe36b81765 Wed, 20 May 2026 10:26:21 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b5/7ad48da028cb8c Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b5/8bbf1778ffabef Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b5/aae9704c5be799 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b5/b53cc1274b1e11 Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b5/bedba503815011 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b5/c13c695eefe9f0 Wed, 20 May 2026 08:26:34 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b5/d6516b3fd2f065 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b5/dae82924f42de3 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b6/39fffdeec8a71e Wed, 20 May 2026 08:33:06 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b6/45befc6b984737 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b6/5faf90dddad8d7 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b6/7a47ead28f7c36 Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b6/9aee653445c2ab Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b6/9ec2fcb882ad28 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b6/af85c5df257226 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b6/b1a145bf5bfe7b Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b6/bd5a20c71a88b8 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b6/d9bfd0d8f3483f Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b6/ea83154279def4 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b7/4ba120e7a21a0a Wed, 20 May 2026 08:33:06 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b7/697c3a7be00161 Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b7/8141ce61fba1a1 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b7/aab92e8171fca5 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b7/c48c6b641198eb Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b7/e34ba4863f886b Tue, 30 Jun 2026 14:29:56 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b7/f038f49de15e63 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b7/f3142ddabbecbe Wed, 20 May 2026 08:26:34 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b8/088523c1df1721 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b8/1afc198f9723a1 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b8/23849ee148ad74 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b8/2b3cf77adf5851 Wed, 20 May 2026 08:33:16 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b8/384b8c8fafbf2d Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b8/5283429482bf05 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b8/669a07bed5a9fc Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b8/681bd5af70c70c Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b8/71690a3783fc61 Tue, 30 Jun 2026 14:29:59 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b8/71ccbbc249b90c Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b8/7f9a5dca65e0eb Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b8/94019739014367 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b8/9621f53949f55f Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b8/af4ea34a8a2746 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b8/d0cef789995be8 Wed, 20 May 2026 08:26:34 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b8/d38c818ae03255 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b8/d8a7c05ea45ab4 Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b8/d92962f41b8e0f Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b8/e187631f918e74 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b8/e30d08c4bbd644 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b8/fb3cf1723a9833 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b8/ff085e770c7df5 Wed, 20 May 2026 08:33:16 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b9/1b706ffb1da0e6 Tue, 30 Jun 2026 14:29:58 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b9/1e7d81a87a434b Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b9/1ed5de7ffa1bbd Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b9/29cfaa6a2e023e Wed, 20 May 2026 08:26:34 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b9/2dd3e3bb7e04e5 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b9/5ef5dc19ade1cd Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b9/7683ab025017ce Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b9/78dffa06025d9b Wed, 20 May 2026 08:33:16 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b9/b09fe6aca4e846 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b9/c1771a7b471838 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/b9/f5a87590f8387c Wed, 20 May 2026 08:33:06 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ba/1edb6380b50310 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ba/53733a1d6b3a1c Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ba/8692ab8d6e51d5 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ba/96920ca680b248 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ba/9fd2928149b1f7 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ba/b2603041a7d9e6 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ba/d378d7b01b8dc5 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ba/f42a64fbecea88 Wed, 20 May 2026 08:33:05 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ba/f4b261b8980329 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ba/fa8c3e1dafb167 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/bb/22fe5bfa468d63 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/bb/2c1e249df63100 Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/bb/72756dedbcaa75 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/bb/a9f1ad64019a47 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/bb/b0214bec6deb45 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/bb/b5835af779a0ed Wed, 20 May 2026 10:26:21 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/bb/cf58ea8ab6b8ce Tue, 30 Jun 2026 14:29:57 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/bb/d114ff4dd34a4e Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/bc/00a315c23f4b87 Tue, 30 Jun 2026 14:29:56 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/bc/136183b5bd6c2b Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/bc/139d6756d52b98 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/bc/2a0191328113e2 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/bc/53171bd6914c7a Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/bc/a052d5f661ee3a Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/bc/b69e675e34776e Wed, 20 May 2026 08:26:38 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/bc/bb5a0166504e68 Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/bc/e061644c96d17a Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/bd/0d0ac12701771d Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/bd/2af1eaef9d2afc Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/bd/44dc6b1924fe76 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/bd/5383817a288046 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/bd/65e9b218d3fd7d Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/bd/672120237f775e Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/bd/cd61aeda838e92 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/bd/d5132a177014f0 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/be/15536872a36ffd Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/be/1cb1c65ea81f68 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/be/2882aa1d0d75a8 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/be/2c0b794ad6e032 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/be/79c34568cca31c Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/be/7c4b017dea7ac4 Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/be/ac70e5e154ed7d Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/be/af63454b2d4b83 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/be/afeaf2ccd16510 Wed, 20 May 2026 10:26:21 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/be/cca34a1fec412d Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/be/da800baca547a3 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/bf/285920bdd8e04f Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/bf/553b1b83918b58 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/bf/5678aa16bf9d0a Tue, 30 Jun 2026 14:29:56 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/bf/71c5838ee75c52 Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/bf/824e450b3ce00d Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/bf/8efb4fc9a3700d Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/bf/956ef11cdd7f3b Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/bf/a2df7d0b01fbbf Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/bf/dec04283eae355 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c0/165306c854d413 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c0/74132f8ed5cf5c Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c0/7f070fbc771424 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c0/854e8fb76177e4 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c0/8f4508864fe8fb Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c0/9aa2d7a28e412d Tue, 30 Jun 2026 14:29:56 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c0/c2b6bf704c6481 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c0/f862b9d12f6b30 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c1/5e23ef68dac5b0 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c1/712d4fc9132eaa Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c1/7df5b7afdb79d1 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c1/835ce256287f62 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c1/88699f76f3c861 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c1/ab73d3fd3b361d Wed, 20 May 2026 08:26:34 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c1/aeaa03cef5e869 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c1/c13446d316510a Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c1/da93511a8ca9f5 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c1/dfe66894150cd6 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c1/f3dc3a426477e0 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c2/157d40f12ea26c Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c2/1606d92ac71497 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c2/3f24b87013d172 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c2/47f6e628529b1a Tue, 30 Jun 2026 14:29:58 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c2/4a76166a076d35 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c2/584c16bc58fe2b Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c2/69a5e401f684c5 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c2/6e778cae2deeb1 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c2/9330340c326b7a Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c2/9fe5e6b3176a8a Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c2/af0358895340f9 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c2/b0296f543c4e7d Tue, 30 Jun 2026 14:29:56 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c2/b3e27753518fec Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c2/ccd3b9d01e6879 Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c2/dcd60736fe6238 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c2/e5f460ec06b0e1 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c2/eddc0e255d8843 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c3/1207649fc672c3 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c3/1bfa25c3f65159 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c3/337cc5e6ea9f81 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c3/49d0afd1954c4e Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c3/9c941224c362e8 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c3/a24e9b15f1ff21 Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c3/a39427fffa3053 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c3/a82769fbab025b Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c3/bde8897272428c Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c3/c69e37bbd622c3 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c3/e6f398cdc7c8ff Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c3/f8cd9b608fa3f4 Wed, 20 May 2026 10:26:21 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c3/fd2a75ff6f8185 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c3/fd5a887cf1e7fa Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c4/4376ff141635ad Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c4/58c4781d06fd0c Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c4/85b795e8b302d6 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c4/9a1d26ac1c18b6 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c4/c7efdbde58ff6d Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c4/ca1d6df4c5b032 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c4/d15e40edc50e5a Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c4/ee1ac3f9ddfd8a Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c4/f12f27a4b04e02 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c4/f6b759655ae5c0 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c5/01bc5195f5431b Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c5/02e76c150b6852 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c5/0c9f85b8663cc3 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c5/307b3242a5630b Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c5/31af388e7f7364 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c5/3af959cd35c367 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c5/7dfdc18919958b Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c5/b1d9581ac526b6 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c5/d556b07fd3e59e Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c6/0b0ebf4bd78a42 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c6/24f682711e5554 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c6/459b1573f9c287 Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c6/4a908855d1769e Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c6/947b0cbecb37e5 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c6/acbc36377ef865 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c6/bcee4ce28bd32c Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c6/c41c77aaa1adbd Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c6/c5eddcc9a89300 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c6/ce45dc7b50b576 Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c6/e4482ebe551a91 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c6/f8f9a0d2a7b597 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c7/0d08162188eefa Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c7/4be25c61d5d2b5 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c7/5536020e45654a Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c7/56090f2c5f17f4 Wed, 20 May 2026 08:26:38 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c7/73aa426d6007c8 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c7/8ca261cdeeaf77 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c7/be76c4dcc480d1 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c7/e2b6e38ad31d44 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c7/ee7c06192d6913 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c7/f7e70e4cfb6f48 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c7/ff7f1fcd35934f Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c8/29cf260e478dae Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c8/384b9cfd2c7729 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c8/465c806e00915c Wed, 20 May 2026 08:33:06 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c8/6806829b5a3440 Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c8/6812f54d198e1d Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c8/ba82adf44cc481 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c9/0521e5c4be830a Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c9/087415d9c79c39 Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c9/205003f52a2f50 Wed, 20 May 2026 08:33:06 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c9/2e7a17272acdc8 Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c9/381cd37b78cc93 Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c9/3e2c91e972e3be Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c9/48eed772c87e36 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c9/5c16a84831ca6a Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c9/a1816aac17c11d Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c9/cfab900cacaddd Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/c9/d969d1b7908baf Tue, 30 Jun 2026 14:29:56 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ca/16f84dcbb9f7f6 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ca/1aa148362f44cb Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ca/20e9efa67f5af6 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ca/312809483abf23 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ca/3db4b04d480afe Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ca/4b94949af5150a Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ca/883d1a45c47969 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ca/8f28f154e8062d Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ca/c299f5f78c9202 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ca/cd2a864045d97f Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ca/d8fbe220205107 Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ca/f2b3ce0e1165ef Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/cb/0c2046e2e8ae6a Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/cb/5178b4eb494e27 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/cb/7f135c0d14e6f3 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/cb/88d84e1ec489c8 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/cb/9fd81d2d9b6e82 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/cb/a9c706de8b00be Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/cb/bef44201c1516a Wed, 20 May 2026 10:26:21 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/cb/e3d653ccd1516e Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/cc/0ebb8e35975edb Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/cc/16dccba70902f0 Wed, 20 May 2026 08:33:16 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/cc/3ba248b4ea5809 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/cc/3fb92a850af437 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/cc/403a8f1c40039f Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/cc/55b4644153518b Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/cc/5808cd953f0ff6 Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/cc/7115d68970fdad Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/cc/7aedb70d0520d4 Wed, 20 May 2026 08:33:16 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/cc/7c15de5c651de6 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/cc/8570ccb20798d1 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/cc/9111c291bdde82 Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/cc/94b8be4f5067e8 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/cc/cf6a465ce1a4b7 Wed, 20 May 2026 10:26:21 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/cc/da94bb259144f7 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/cc/e34969926f446f Wed, 20 May 2026 08:29:48 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/cc/e7a8622f156428 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/cc/fc6a2d1d69c50b Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/cd/0dc0ec8ae89225 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/cd/0e316f784318f3 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/cd/46bcb892e6282b Tue, 30 Jun 2026 14:29:58 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/cd/4e96f5b05cb7f2 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/cd/66d09a919dd34f Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/cd/6bde744492e69d Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/cd/76597f2b1b2259 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/cd/7726730db21125 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/cd/88b278955e8188 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/cd/994c078ae1289e Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/cd/a21b48305c8962 Wed, 20 May 2026 08:33:06 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/cd/c9d7c130827c4a Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/cd/dfd2988b14b6a8 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/cd/e3720c12c101d3 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ce/026c7f2d0a76bc Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ce/0a88a37261700a Wed, 20 May 2026 10:26:21 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ce/18c5763532634d Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ce/1c0e366a70cf9d Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ce/3836823e1377b5 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ce/6757ad249ec290 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ce/67582a8aecb40b Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ce/6ca13b26f87279 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ce/8a7b9a8f68599b Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ce/912755610ddca6 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ce/a28c2b3309f15e Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ce/b0f7925b6a02da Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ce/c60e02decf3136 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ce/d43e91d9a82044 Wed, 20 May 2026 08:26:34 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ce/f19252883af57e Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ce/f5be688bc9223a Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ce/ffde05c199cbc6 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/cf/142b1f71cee622 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/cf/1655b1635af284 Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/cf/524d381e2749ed Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/cf/793c218355389d Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/cf/eb703c343cdb33 Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d0/1a23819e71ef7f Tue, 30 Jun 2026 14:29:56 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d0/2ecc275d2630d5 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d0/36f4a4ac674beb Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d0/3b412ddb720582 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d0/42fcbd9ed9d915 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d0/4834e5ab91d6f3 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d0/52e4ed99b799ff Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d0/59a05e2db86d51 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d0/6956e819e9ddde Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d0/99c172d47b28e7 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d0/ba3dcc4da01589 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d0/c320019c7bf816 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d0/d4320ab958615d Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d0/dd4e70e0ebbf89 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d0/f33b55c4c187d6 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d1/0c739ca2d91f53 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d1/1a337d27654f33 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d1/219d926f5ab3c5 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d1/48b9ff9046316b Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d1/96df77fe379d43 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d1/9dc55236e9b621 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d1/b4fcc8f1472f02 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d1/b94f4b627d173c Wed, 20 May 2026 10:26:21 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d1/c3a3174a7c76bb Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d1/c58c7f0ecce9e7 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d1/e4a90f6057c30b Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d1/eab523545fc2d4 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d2/07e2149edb6179 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d2/477928b4ab9ed4 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d2/534f6cbfec544c Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d2/7a073e1e00e3bf Wed, 20 May 2026 08:33:16 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d2/93112779923501 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d2/a7b5b95f63020c Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d2/cd41cbac985505 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d2/ce31cf9d8d1169 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d2/e626d5fb213128 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d2/ec5fdc5c96c222 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d2/fef91c5be0b7e8 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d3/036e6179c60e4f Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d3/3179012ad9cde2 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d3/59a0976e2afd4f Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d3/687538d3591e42 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d3/6d39a61d4cc920 Wed, 20 May 2026 08:26:34 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d3/6d415b1f3fe96a Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d3/7285d6a21879ce Wed, 20 May 2026 10:26:21 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d3/8ab16d17260300 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d3/909891761810bc Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d3/b6ef56188d98c5 Tue, 30 Jun 2026 14:29:56 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d3/b79105fe6a3eb6 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d3/f1637550f552ba Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d3/fd51d45cdba2ed Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d4/0e6439c44db12a Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d4/1d45a3ff0fe96b Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d4/5c15b830e40de3 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d4/5cd1c907591c2a Wed, 20 May 2026 08:33:16 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d4/7438f16f187458 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d4/9b029736d0545b Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d4/b9d8ff552be5c1 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d4/ced62ea615b73e Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d4/eab1fa425f7551 Wed, 20 May 2026 10:26:21 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d4/ef1490ef14e375 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d5/09779b76678f09 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d5/1fa8d03f15222b Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d5/2a9bc793f4d851 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d5/54e115aeae836e Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d5/9cdd9eda7367c1 Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d5/ae7492e13d5b73 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d5/b564badc8413be Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d5/b5cb28a264089e Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d5/d6021f8e5ad8c5 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d5/e6b7e88661b93f Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d5/f29bc6a59f120a Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d6/22fc83f9609aca Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d6/4e422d43bbf160 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d6/76c8743b761433 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d6/8588c100c5367c Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d6/8cf697225d0523 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d6/bf30d1b0a789b1 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d6/d5f8735cf0b2e1 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d6/dc1171cbc5bbe2 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d6/ee4dafb6936f8d Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d6/f312f7e291d6dc Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d6/fb178ab16fe156 Wed, 20 May 2026 10:26:21 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d7/06ade2fa0bea57 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d7/091f6e714757bf Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d7/09a71949b3d715 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d7/255e11a3fcdf94 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d7/55a689b4248c31 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d7/eed331e68f2037 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d8/0f20bdecc2256f Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d8/128758a48ef425 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d8/499b713f7fda75 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d8/7599cfa51c2043 Tue, 30 Jun 2026 14:29:56 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d8/7732fe1fa78eb5 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d8/8d258d79dc6c6a Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d8/9d1216e5300d6a Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d8/cec33c9a96ae95 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d8/e93d8e224a3772 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d9/2217d99806f268 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d9/490d8e34e98534 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d9/4adf418397d4ec Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d9/4ef5b8483cc3ab Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d9/5ed83d972fc53c Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d9/86e1a49c7e6840 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d9/8bcaa102bc2c06 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d9/b49c8314f6e0b4 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d9/ca543565f13159 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d9/d38d057f406ed3 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d9/e1598ae3649cb0 Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d9/ee8778439f4e96 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/d9/efa41cd8a46f8d Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/da/17bebf193c12fc Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/da/189268dc89a36e Tue, 30 Jun 2026 14:29:56 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/da/282216d9c9a687 Wed, 20 May 2026 10:26:21 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/da/297bbc31e99b3f Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/da/41c351d211bbad Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/da/5904c90c23cfdb Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/da/5d1d7e2bc7dc10 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/da/8a73bf2e157ad9 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/da/97b3ea92447d60 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/da/9ddc25a7e017b2 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/da/b0f07a640959f9 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/da/c6caf3d919d276 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/da/c8a3139d565b3a Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/da/d8f5203ff54d33 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/da/e53bc2f3803da2 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/da/eb1dafe12ae363 Wed, 20 May 2026 08:33:16 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/da/eea6feb7205256 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/da/ff242cd811e752 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/db/0e1564ac26166f Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/db/22acc0424b4062 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/db/23e95bde87302b Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/db/53168a621e7d33 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/db/66367a7c4ab6f2 Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/db/7749aa60b8c75c Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/db/8710fdb5aa3b63 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/db/9d948518eee8e9 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/db/bc27181c0cd540 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/db/cacc5a5b069bb6 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/db/cdb04690ec0327 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/dc/0554e4e3d6f561 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/dc/05889c10f74b94 Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/dc/2fc30fe2440cee Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/dc/5ad9eb0d1fc2a6 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/dc/669213ae245bd2 Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/dc/73a2f3d1c41130 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/dc/fd2837f274934f Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/dc/ffc405f74b2474 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/dd/06aed393951146 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/dd/2863b5cd6c888c Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/dd/30c97032d3bbf9 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/dd/3eebe8a848a87f Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/dd/7129c84aa2c302 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/dd/7944a9cdcfde9d Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/dd/815c262e3f397d Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/dd/9ec55ef793b3f0 Wed, 20 May 2026 08:26:34 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/dd/aaf3b26e9c3dec Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/dd/d0dab81e6b82f7 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/dd/d9d81637c232c2 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/de/0a7fc630de6738 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/de/10bbd4374aca9d Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/de/25b9b277f5ac7d Wed, 20 May 2026 10:26:21 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/de/29260d836a8810 Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/de/2eee42b81ec69b Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/de/8f06774ee410de Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/de/96bf08ca3de6b0 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/de/975f439c7f6279 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/de/b6b8b331e2eb91 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/de/c43af46cf5eadf Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/de/c51c72c32eed43 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/de/d2691fa7248bb2 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/de/d329547e984667 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/de/dfda0503bc3834 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/df/1eb90145b93002 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/df/2174925fe6bee0 Wed, 20 May 2026 10:26:21 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/df/3c217ef9c6bef8 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/df/40020c75f1e310 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/df/6153fe53d60e9c Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/df/67c91d7700ed95 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/df/6da38ff067d069 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/df/72f00f82a67e5e Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/df/8782aa77a725a5 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/df/87ed51c1f70aee Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/df/8d5c2d603f358b Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/df/9f19fe1a5f8316 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/df/bb373ad98a4baf Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/df/c60bc4e73d1d5b Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/df/c81cb01b54d9f5 Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/e0/408f8b67018cb0 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/e0/55effc1bfae0e4 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/e0/85e3879246b11d Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/e0/a97506a1d91564 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/e0/ac064fa94df891 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/e0/ca0666d7a89eee Wed, 20 May 2026 08:33:05 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/e0/cf2bb864861c43 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/e1/2c8fef0714c6bd Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/e1/5a72fe5845ba32 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/e1/67393960096167 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/e1/7b0f2048192189 Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/e1/89f6e0fbdbd18e Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/e1/ae49b15c75405c Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/e1/c793ddaa463763 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/e1/e98062a97880f5 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/e2/85e8b46f0e8c4e Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/e2/8cb10832410ca2 Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/e2/9c5a3aea2ffb81 Wed, 20 May 2026 08:33:06 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/e3/0265cb792546fa Wed, 20 May 2026 08:26:34 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/e3/23dc5c71080d53 Wed, 20 May 2026 08:26:34 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/e3/367a345ba94047 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/e3/4282f4e422d1b9 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/e3/53df972baf473d Tue, 30 Jun 2026 14:29:56 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/e3/68f5df7ec55ee2 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/e3/76af187cd11e89 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/e3/884d49a001aa0e Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/e3/8cb5cdf221bbef Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/e3/9faae2c933e9ad Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/e3/a0ce0bd1ee0c2f Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/e3/ad2707fd21bdf0 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/e3/b67bec951c389d Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/e3/f70b9d5d775925 Wed, 20 May 2026 08:33:16 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/e3/fc570ce702bd24 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/e4/04aaf6c0993ac1 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/e4/0ac7d02c55efa4 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/e4/12de7ac38df070 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/e4/64c6eb881fedc0 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/e4/771f67b56dc7da Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/e4/7cc558c83020e1 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/e4/81f2c42c96e50d Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/e4/a4a1ed2bbb02df Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/e4/ccd8715f5aa1f0 Wed, 20 May 2026 08:33:05 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/e4/ddb2955e89ba1b Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/e5/01a30cafb00070 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/e5/1eafecdd7b7d24 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/e5/55c25d113b79c8 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/e5/66d2052a81eeae Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/e5/a401f7059da241 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/e5/adb433ea88e300 Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/e5/ba5fb3bc6114b5 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/e5/bdeb869ebb512f Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/e5/c7a570d9be3b05 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/e5/dc5f881811b425 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/e6/044c0556e61066 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/e6/10f59fbf31a98e Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/e6/36e6dd41e62fe0 Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/e6/3923dc99364f22 Tue, 30 Jun 2026 14:29:56 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/e6/41ba8dfec148a1 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/e6/50bf6441b28742 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/e6/5730bfd00ac742 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/e6/60b6039d3ad44b Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/e6/6c9193289e16cf Wed, 20 May 2026 10:26:21 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/e6/9bd25e416f2c8e Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/e6/a72bbfe09901f6 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/e6/c513a6e9ea41cf Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/e6/d7589c0f6e1959 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/e7/26f835f2b02daf Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/e7/3ab70138edd4d7 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/e7/48d42f83771a6c Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/e7/4a503e28cc3a74 Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/e7/6d97bfe95e07d3 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/e7/79a2257024713d Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/e7/cea8024a6b71a9 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/e7/d21bf2ddd0c2df Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/e7/dcc3a24ae4ea3b Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/e7/fe08a2a05d2c3a Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/e8/0dc54a7e75357c Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/e8/1ff0d5507f5f30 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/e8/23a5422288b88b Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/e8/4ac8aa93a2ebe2 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/e8/79493bc140aff4 Wed, 20 May 2026 10:26:21 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/e8/97b7ede86edbfd Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/e8/bd310b98cdb2aa Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/e8/d5fdaaf8afb240 Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/e9/1bc7c96932c6d8 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/e9/4f5d2b5a4f610e Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/e9/65aadf66c500c5 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/e9/caa7f57f9e0986 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/e9/cdef5e5ffa93af Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/e9/d7543cac7d4459 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/e9/e8e5ad09d9bcdb Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/e9/f1f2b422e74e0b Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ea/1b427f17223c06 Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ea/2341528849012b Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ea/24d74aaf25cff1 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ea/279364930f1113 Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ea/3601c43557c4de Wed, 20 May 2026 08:26:34 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ea/54583762b20e1c Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ea/8bcc3214838654 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ea/a1c2a79f0fae86 Tue, 30 Jun 2026 14:29:58 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ea/b9bfcda9bd3b92 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ea/d226ec454280c5 Tue, 30 Jun 2026 14:29:56 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/eb/0875d7ea194d7c Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/eb/17e00da90b7c3c Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/eb/627c17731bedd9 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/eb/6bf7800ec61d6b Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/eb/803d48247ede51 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/eb/92540814736f24 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/eb/96009f68cb1698 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/eb/a39aec049d0263 Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/eb/ba314f20864ee9 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/eb/da710688b73c84 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/eb/e28701f2318816 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/eb/fa57ec5a533bcb Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ec/1fca466dabee26 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ec/278726aa71c069 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ec/28eac24c756cc6 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ec/35e9c8a304c87f Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ec/479901bb0d24a5 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ec/59cb680fde0d4a Wed, 20 May 2026 08:26:34 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ec/5c9f3405d453f4 Wed, 20 May 2026 10:26:21 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ec/643a64325b9303 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ec/64b63415b6fc91 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ec/66aa341d4a8abf Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ec/70d613d129cbff Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ec/b90c5aad295a65 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ec/c4b859df74f32d Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ec/f22f3bd554b001 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ed/01f84985b1e9e8 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ed/084c12c07b08cc Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ed/0b8f11b3659ff1 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ed/0ecb7c7c434013 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ed/0f49112101a74d Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ed/3c23b058132ec1 Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ed/5ff58c5df59ae8 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ed/72ffd40393fb7f Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ed/7f07584552e13e Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ed/936d748a3c15da Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ed/a53bf4e0aef952 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ed/ad98b7a088df20 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ed/b10ed0d96909ce Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ed/d0c8dd54af7c27 Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ed/d5966332b7642d Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ed/f946ba9d0da595 Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ee/1f3984a4406221 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ee/34ef2e34a34395 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ee/40b6b2a263bf58 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ee/46ea4f4bf90dc0 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ee/51d0dbe42d95e3 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ee/5340082b6af4a3 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ee/58dab75cf277b3 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ee/ad37b40f0d818a Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ee/c9d141423cd1b4 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ee/cd549013150be9 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ee/ce7458d1dd0be2 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ef/24a7fe6503e176 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ef/26716b3d23ebcf Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ef/3c587274fa45ce Wed, 20 May 2026 08:26:38 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ef/637815c5c0d619 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ef/739c2179cda271 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ef/75dd1f17455c62 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ef/7b8b3236ac1eac Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ef/807d3b9d924989 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ef/8d159b09d32220 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ef/8ea529614a7191 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ef/b9001e798ed439 Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ef/dab01829bee2ce Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ef/e3b224ddf717ca Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f0/044d711a9ccdfb Wed, 20 May 2026 08:33:05 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f0/05a0ac0563ef53 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f0/49cdebf540c071 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f0/5d51e33fce72ce Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f0/837fd49ff38737 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f0/8a14db0673fca6 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f0/a8a7697b63afd5 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f0/b9c871be395f80 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f0/ba7758402f0ee7 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f0/d4eb9e93c3c213 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f0/ee80133eeddc40 Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f1/07386cf9bed518 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f1/0fb3aaf92f0cb4 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f1/20d8ced5fe4123 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f1/351e11e228d83f Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f1/463c7c8dc54944 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f1/4bdc20c5b6c082 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f1/658463bed30a3a Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f1/ccea98ed39e5ea Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f1/f1a827f973dcc6 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f1/f632101bcda789 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f2/06a549396408cc Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f2/124ae12e42ad72 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f2/a20e84f4a4870d Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f2/b270c7656ed8d9 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f2/d9e2cb688689bc Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f2/df562f17c62f60 Wed, 20 May 2026 08:33:16 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f2/f365ae8efcc3ae Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f3/0c96ded538adf2 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f3/1adafeeaf5c6af Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f3/399abe539b8a68 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f3/3c082260fbbf19 Wed, 20 May 2026 08:26:38 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f3/444fccda7398ca Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f3/4718318c08a239 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f3/4767d5d356fbb5 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f3/4d8868e2c779fd Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f3/57faff05c2a7af Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f3/8a924ebdcd892a Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f3/94947f68c07be4 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f3/9af50875790730 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f3/c704311df04700 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f3/d198bf353e8a2f Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f3/ebda0311befa51 Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f4/04bf0b58c4362e Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f4/10d2220b9d62f4 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f4/1b09c71fb8de58 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f4/5ca46cf6adb3f3 Wed, 20 May 2026 10:26:21 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f4/6d15ac5f2da8ba Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f4/97f8eb50889ef3 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f4/a2d0dc554a427a Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f4/b0ad83549be0c5 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f4/ca0d40239f9784 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f4/f36c74ce47d611 Wed, 20 May 2026 08:33:06 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f4/ff58e7c064bb0f Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f5/0167dabe260872 Tue, 30 Jun 2026 14:29:59 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f5/1b3fe454c336b9 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f5/2f57511a7a8d9f Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f5/300544c2ac9a74 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f5/4f87caf64ebf68 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f5/5268e31bc76ef2 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f5/60b84625591cca Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f5/87f454dad9313d Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f5/89bddd3af6d4de Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f5/8a86336a44fa2d Wed, 20 May 2026 08:33:06 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f5/9cbf6f2ae33cd3 Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f5/b505466f917bac Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f5/b60bb9b842434a Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f6/00d07d2bf5dfb5 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f6/4af266a7d45100 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f6/5cfe66778952d0 Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f6/a935fa871d932e Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f6/b29e7c03fb635d Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f6/dde4b6c368672f Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f6/e296c0a8fc7b2b Wed, 20 May 2026 08:33:06 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f7/4cae3dfc12a4b9 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f7/b7d3e957b40a45 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f7/d26c38df6aa243 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f7/f8091841e016b9 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f8/27949eec84ac07 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f8/51fee1a5311c5f Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f8/6d722b75ba810b Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f8/9b06b665ba19b5 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f8/a7764c6d61f012 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f8/e503d0a08b3479 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f8/e771cf77e4e68c Wed, 20 May 2026 08:33:06 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f8/fd3c3c50697f55 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f9/031eab2700d016 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f9/0b0b1603619672 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f9/4f60d698388ab5 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f9/54516e54529688 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f9/7d94830a83a979 Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f9/7dc39814c4e95d Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f9/7ea002c8d78ab9 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f9/b09afc591a1a19 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f9/bda591c71ecf03 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f9/c04664eb49ce81 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/f9/f050c9be651102 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/fa/11b0f1aa362ad0 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/fa/67f33aa83a32ea Wed, 20 May 2026 08:26:34 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/fa/a0a2ba3048a85c Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/fa/be2b1d086bee17 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/fa/c9bd441d5cad46 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/fa/defb2b053202fe Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/fa/e8b7aa1eac69e8 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/fa/fb9283b75f81ef Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/fb/10ead5d45d99db Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/fb/368329e3c05ff5 Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/fb/4b5ab6bcb5c458 Wed, 20 May 2026 10:26:21 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/fb/5c2fe7b18befd8 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/fb/5f9facf39dd9ed Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/fb/6afbc0f60c4c44 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/fb/7193a7d772b9d7 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/fb/89fea9210bb7b8 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/fb/c1960b523978c3 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/fc/0b448173248035 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/fc/17566e2eefefa5 Wed, 20 May 2026 08:26:32 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/fc/23d6da945b4958 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/fc/441cb5f4e98740 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/fc/508408907e57a7 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/fc/5f77f64bcf740b Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/fc/959e5bf68fe5b3 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/fc/afc29e151131ff Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/fc/bfc302d673b48f Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/fc/db98ff0b65f3d1 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/fd/17966c53232bdb Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/fd/2456d9e9c7225b Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/fd/3b4db001d8399b Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/fd/57817e420f9440 Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/fd/672998a6dfaee9 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/fd/69edd9c2f7de36 Wed, 20 May 2026 08:26:38 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/fd/6e5d933c9ca37d Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/fd/812ded80bce563 Wed, 20 May 2026 10:21:43 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/fd/8e612f3441c501 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/fd/a2734f2bbf2079 Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/fd/af63a7b0c22df4 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/fd/affa96c504cc13 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/fd/c1450cb24724de Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/fd/c947e78c22af6b Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/fd/d76434abd36799 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/fe/2c7f70bc621241 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/fe/3630303d425906 Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/fe/36e973f2706e6e Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/fe/3788f172b362da Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/fe/52cc8e595245c1 Wed, 20 May 2026 08:26:31 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/fe/57b57bfeba1cca Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/fe/81a5440b5ed23e Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/fe/85e32a423229fe Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/fe/8a44b978ea67aa Wed, 20 May 2026 10:21:42 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/fe/a394c6b6423f7c Wed, 20 May 2026 08:26:35 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/fe/b560b9a08620c9 Wed, 20 May 2026 08:26:33 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/fe/bea7ad2e843f37 Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/fe/f58e89c94a512b Wed, 20 May 2026 08:28:12 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ff/15e967188518e0 Tue, 30 Jun 2026 14:24:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ff/2f1e98eb90dd41 Tue, 30 Jun 2026 14:10:50 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ff/79965383e47ce4 Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-iseq/ff/9c4f450ad3cb5f Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-yaml/12/56815e6c4cede1 Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-yaml/18/be089bd51f2596 Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-yaml/1e/5535c156443925 Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-yaml/3d/bdbbf9786e5aa1 Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-yaml/47/10684df6a999be Wed, 20 May 2026 08:33:16 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-yaml/6f/1ca1b6d298aed6 Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/compile-cache-yaml/ef/82411bb04fede1 Wed, 20 May 2026 08:33:07 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/cache/bootsnap/load-path-cache Tue, 30 Jun 2026 14:25:00 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/restart.txt Wed, 20 May 2026 08:33:06 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/rubycritic/app/controllers/admin_controller.html Tue, 30 Jun 2026 14:35:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/rubycritic/app/controllers/application_controller.html Tue, 30 Jun 2026 14:35:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/rubycritic/app/controllers/campo_forms_controller.html Tue, 30 Jun 2026 14:35:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/rubycritic/app/controllers/campos_controller.html Tue, 30 Jun 2026 14:35:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/rubycritic/app/controllers/concerns/admin_autenticavel.html Tue, 30 Jun 2026 14:35:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/rubycritic/app/controllers/cursos_controller.html Tue, 30 Jun 2026 14:35:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/rubycritic/app/controllers/definicao_senhas_controller.html Tue, 30 Jun 2026 14:35:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/rubycritic/app/controllers/departamentos_controller.html Tue, 30 Jun 2026 14:35:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/rubycritic/app/controllers/discentes_controller.html Tue, 30 Jun 2026 14:35:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/rubycritic/app/controllers/disciplinas_controller.html Tue, 30 Jun 2026 14:35:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/rubycritic/app/controllers/docentes_controller.html Tue, 30 Jun 2026 14:35:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/rubycritic/app/controllers/elemento_forms_controller.html Tue, 30 Jun 2026 14:35:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/rubycritic/app/controllers/elementos_controller.html Tue, 30 Jun 2026 14:35:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/rubycritic/app/controllers/formularios_controller.html Tue, 30 Jun 2026 14:35:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/rubycritic/app/controllers/home_controller.html Tue, 30 Jun 2026 14:35:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/rubycritic/app/controllers/redefinicao_senhas_controller.html Tue, 30 Jun 2026 14:35:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/rubycritic/app/controllers/resposta_elems_controller.html Tue, 30 Jun 2026 14:35:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/rubycritic/app/controllers/resposta_forms_controller.html Tue, 30 Jun 2026 14:35:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/rubycritic/app/controllers/sessions_controller.html Tue, 30 Jun 2026 14:35:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/rubycritic/app/controllers/templates_controller.html Tue, 30 Jun 2026 14:35:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/rubycritic/app/controllers/turmas_controller.html Tue, 30 Jun 2026 14:35:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/rubycritic/app/controllers/usuarios_controller.html Tue, 30 Jun 2026 14:35:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/rubycritic/app/helpers/admin_helper.html Tue, 30 Jun 2026 14:35:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/rubycritic/app/helpers/application_helper.html Tue, 30 Jun 2026 14:35:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/rubycritic/app/helpers/campo_forms_helper.html Tue, 30 Jun 2026 14:35:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/rubycritic/app/helpers/campos_helper.html Tue, 30 Jun 2026 14:35:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/rubycritic/app/helpers/cursos_helper.html Tue, 30 Jun 2026 14:35:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/rubycritic/app/helpers/departamentos_helper.html Tue, 30 Jun 2026 14:35:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/rubycritic/app/helpers/discentes_helper.html Tue, 30 Jun 2026 14:35:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/rubycritic/app/helpers/disciplinas_helper.html Tue, 30 Jun 2026 14:35:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/rubycritic/app/helpers/docentes_helper.html Tue, 30 Jun 2026 14:35:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/rubycritic/app/helpers/elemento_forms_helper.html Tue, 30 Jun 2026 14:35:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/rubycritic/app/helpers/elementos_helper.html Tue, 30 Jun 2026 14:35:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/rubycritic/app/helpers/formularios_helper.html Tue, 30 Jun 2026 14:35:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/rubycritic/app/helpers/resposta_elems_helper.html Tue, 30 Jun 2026 14:35:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/rubycritic/app/helpers/resposta_forms_helper.html Tue, 30 Jun 2026 14:35:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/rubycritic/app/helpers/templates_helper.html Tue, 30 Jun 2026 14:35:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/rubycritic/app/helpers/turmas_helper.html Tue, 30 Jun 2026 14:35:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/rubycritic/app/helpers/usuarios_helper.html Tue, 30 Jun 2026 14:35:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/rubycritic/app/jobs/application_job.html Tue, 30 Jun 2026 14:35:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/rubycritic/app/mailers/application_mailer.html Tue, 30 Jun 2026 14:35:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/rubycritic/app/mailers/usuario_mailer.html Tue, 30 Jun 2026 14:35:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/rubycritic/app/models/administrador.html Tue, 30 Jun 2026 14:35:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/rubycritic/app/models/application_record.html Tue, 30 Jun 2026 14:35:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/rubycritic/app/models/campo.html Tue, 30 Jun 2026 14:35:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/rubycritic/app/models/campo_form.html Tue, 30 Jun 2026 14:35:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/rubycritic/app/models/curso.html Tue, 30 Jun 2026 14:35:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/rubycritic/app/models/departamento.html Tue, 30 Jun 2026 14:35:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/rubycritic/app/models/discente.html Tue, 30 Jun 2026 14:35:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/rubycritic/app/models/disciplina.html Tue, 30 Jun 2026 14:35:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/rubycritic/app/models/docente.html Tue, 30 Jun 2026 14:35:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/rubycritic/app/models/elemento.html Tue, 30 Jun 2026 14:35:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/rubycritic/app/models/elemento_form.html Tue, 30 Jun 2026 14:35:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/rubycritic/app/models/formulario.html Tue, 30 Jun 2026 14:35:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/rubycritic/app/models/resposta_elem.html Tue, 30 Jun 2026 14:35:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/rubycritic/app/models/resposta_form.html Tue, 30 Jun 2026 14:35:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/rubycritic/app/models/template.html Tue, 30 Jun 2026 14:35:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/rubycritic/app/models/turma.html Tue, 30 Jun 2026 14:35:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/rubycritic/app/models/usuario.html Tue, 30 Jun 2026 14:35:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/rubycritic/app/services/sigaa_importer.html Tue, 30 Jun 2026 14:35:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/rubycritic/assets/images/logo.png Tue, 30 Jun 2026 14:35:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/rubycritic/assets/javascripts/application.js Tue, 30 Jun 2026 14:35:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/rubycritic/assets/stylesheets/application.css Tue, 30 Jun 2026 14:35:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/rubycritic/assets/vendor/fonts/FontAwesome.otf Tue, 30 Jun 2026 14:35:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/rubycritic/assets/vendor/fonts/fontawesome-webfont.eot Tue, 30 Jun 2026 14:35:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/rubycritic/assets/vendor/fonts/fontawesome-webfont.woff Tue, 30 Jun 2026 14:35:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/rubycritic/assets/vendor/fonts/fontawesome-webfont.woff2 Tue, 30 Jun 2026 14:35:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/rubycritic/assets/vendor/fonts/glyphicons-halflings-regular.eot Tue, 30 Jun 2026 14:35:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/rubycritic/assets/vendor/fonts/glyphicons-halflings-regular.woff Tue, 30 Jun 2026 14:35:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/rubycritic/assets/vendor/fonts/glyphicons-halflings-regular.woff2 Tue, 30 Jun 2026 14:35:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/rubycritic/assets/vendor/javascripts/bootstrap.min.js Tue, 30 Jun 2026 14:35:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/rubycritic/assets/vendor/javascripts/highcharts.src-4.0.1.js Tue, 30 Jun 2026 14:35:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/rubycritic/assets/vendor/javascripts/jquery.filtertable.min.js Tue, 30 Jun 2026 14:35:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/rubycritic/assets/vendor/javascripts/jquery.min.js Tue, 30 Jun 2026 14:35:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/rubycritic/assets/vendor/javascripts/jquery.scrollTo.min.js Tue, 30 Jun 2026 14:35:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/rubycritic/assets/vendor/javascripts/jquery.tablesorter.js Tue, 30 Jun 2026 14:35:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/rubycritic/assets/vendor/javascripts/jquery.tablesorter.min.js Tue, 30 Jun 2026 14:35:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/rubycritic/assets/vendor/javascripts/jquery.timeago.js Tue, 30 Jun 2026 14:35:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/rubycritic/assets/vendor/javascripts/prettify.js Tue, 30 Jun 2026 14:35:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/rubycritic/assets/vendor/stylesheets/bootstrap.min.css Tue, 30 Jun 2026 14:35:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/rubycritic/assets/vendor/stylesheets/font-awesome.min.css Tue, 30 Jun 2026 14:35:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/rubycritic/assets/vendor/stylesheets/prettify.css Tue, 30 Jun 2026 14:35:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/rubycritic/assets/vendor/stylesheets/prettify.custom_theme.css Tue, 30 Jun 2026 14:35:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/rubycritic/code_index.html Tue, 30 Jun 2026 14:35:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/rubycritic/overview.html Tue, 30 Jun 2026 14:35:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/rubycritic/simple_cov_index.html Tue, 30 Jun 2026 14:35:20 -0300 +/Users/elvismirandajunior/Documents/Repos/ES/CAMAAR/tmp/rubycritic/smells_index.html Tue, 30 Jun 2026 14:35:20 -0300 diff --git a/doc/css/rdoc.css b/doc/css/rdoc.css new file mode 100644 index 0000000000..25a3f43076 --- /dev/null +++ b/doc/css/rdoc.css @@ -0,0 +1,1955 @@ +/* + * Aliki Theme Stylesheet + * Modern RDoc theme by Stan Lo + * + * Features: + * - Three-column responsive layout (navigation, content, table of contents) + * - Dark mode support with localStorage persistence + * - Auto-generated right sidebar TOC with scroll spy + * - Mobile-optimized search modal + * - Enhanced syntax highlighting for both light and dark themes + * - Code-copying functionality + */ + +/* 1. Design System - CSS Variables and Tokens */ + +/* Light Theme (Default) */ +:root { + /* Color Palette - Primary */ + --color-primary-50: #fdeae9; + --color-primary-100: #fadad3; + --color-primary-200: #f8bfbd; + --color-primary-300: #f5a9a7; + --color-primary-400: #f07f7b; + --color-primary-500: #eb544f; + --color-primary-600: #e62923; + --color-primary-700: #b8211c; + --color-primary-800: #8a1915; + --color-primary-900: #5c100e; + + /* Color Palette - Neutral */ + --color-neutral-50: #fafaf9; + --color-neutral-100: #f5f5f4; + --color-neutral-200: #e7e5e4; + --color-neutral-300: #d6d3d1; + --color-neutral-400: #a8a29e; + --color-neutral-500: #78716c; + --color-neutral-600: #57534e; + --color-neutral-700: #44403c; + --color-neutral-800: #292524; + --color-neutral-900: #1c1917; + + /* Code highlighting colors - neutral palette for all syntax highlighters */ + --code-blue: #1d4ed8; + --code-green: #047857; + --code-orange: #d97706; + --code-purple: #7e22ce; + --code-red: #dc2626; + --code-cyan: #0891b2; + --code-gray: #78716c; + + /* Color Palette - Green (for success states) */ + --color-green-400: #4ade80; + --color-green-500: #22c55e; + --color-green-600: #16a34a; + + /* Semantic Colors - Light Theme */ + --color-text-primary: var(--color-neutral-900); + --color-text-secondary: var(--color-neutral-600); + --color-text-tertiary: var(--color-neutral-500); + --color-background-primary: #fff; + --color-background-secondary: var(--color-neutral-50); + --color-background-tertiary: var(--color-neutral-100); + --color-border-default: var(--color-neutral-300); + --color-border-subtle: var(--color-neutral-200); + --color-border-emphasis: var(--color-neutral-400); + --color-link-default: var(--color-text-primary); + --color-link-hover: var(--color-primary-600); + --color-accent-primary: var(--color-primary-600); + --color-accent-hover: var(--color-primary-700); + --color-accent-subtle: var(--color-primary-50); + --color-code-bg: #f6f8fa; + --color-code-border: var(--color-neutral-300); + --color-nav-bg: #fff; + --color-nav-text: var(--color-neutral-700); + --color-th-background: var(--color-neutral-100); + --color-td-background: var(--color-neutral-50); + + /* Search Type Badge Colors */ + --color-search-type-class-bg: #e6f0ff; + --color-search-type-class-text: #0050a0; + --color-search-type-module-bg: #e6ffe6; + --color-search-type-module-text: #060; + --color-search-type-constant-bg: #fff0e6; + --color-search-type-constant-text: #995200; + --color-search-type-method-bg: #f0e6ff; + --color-search-type-method-text: #5200a0; + + /* RGBA Colors (theme-agnostic) */ + --color-overlay: rgb(0 0 0 / 50%); + --color-emphasis-bg: rgb(255 111 97 / 10%); + --color-emphasis-decoration: rgb(52 48 64 / 25%); + --color-search-highlight-bg: rgb(224 108 117 / 10%); + --color-success-bg: rgb(34 197 94 / 10%); + + /* Typography Scale */ + --font-size-xs: 0.75rem; /* 12px */ + --font-size-sm: 0.875rem; /* 14px */ + --font-size-base: 1rem; /* 16px */ + --font-size-lg: 1.125rem; /* 18px */ + --font-size-xl: 1.25rem; /* 20px */ + --font-size-2xl: 1.5rem; /* 24px */ + --font-size-3xl: 1.875rem; /* 30px */ + --font-size-4xl: 2.25rem; /* 36px */ + --font-size-5xl: 3rem; /* 48px */ + + /* Font Families */ + --font-family-base: -apple-system, blinkmacsystemfont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Helvetica Neue', sans-serif; + --font-family-heading: var(--font-family-base); + --font-family-mono: ui-monospace, 'SFMono-Regular', 'SF Mono', 'Menlo', 'Consolas', 'Liberation Mono', monospace; + + /* Font Weights */ + --font-weight-normal: 400; + --font-weight-medium: 500; + --font-weight-semibold: 600; + --font-weight-bold: 700; + + /* Font Shortcuts */ + --font-primary: var(--font-family-base); + --font-heading: var(--font-family-heading); + --font-code: var(--font-family-mono); + + /* Line Heights */ + --line-height-tight: 1.25; + --line-height-normal: 1.5; + --line-height-relaxed: 1.625; + + /* Spacing Scale */ + --space-1: 0.25rem; /* 4px */ + --space-2: 0.5rem; /* 8px */ + --space-3: 0.75rem; /* 12px */ + --space-4: 1rem; /* 16px */ + --space-5: 1.25rem; /* 20px */ + --space-6: 1.5rem; /* 24px */ + --space-8: 2rem; /* 32px */ + --space-12: 3rem; /* 48px */ + --space-16: 4rem; /* 64px */ + + /* Border Radius */ + --radius-sm: 0.25rem; /* 4px */ + --radius-md: 0.375rem; /* 6px */ + --radius-lg: 0.5rem; /* 8px */ + + /* Shadows */ + --shadow-sm: 0 1px 3px 0 rgb(0 0 0 / 10%), 0 1px 2px -1px rgb(0 0 0 / 10%); + --shadow-md: 0 2px 8px rgb(0 0 0 / 10%); + --shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 10%), 0 4px 6px -4px rgb(0 0 0 / 10%); + --shadow-xl: 0 20px 25px -5px rgb(0 0 0 / 10%), 0 8px 10px -6px rgb(0 0 0 / 10%); + + /* Layout Dimensions */ + --layout-sidebar-width: 300px; + --layout-sidebar-width-min: 300px; + --layout-sidebar-width-max: 15%; + --layout-toc-width-min: 240px; + --layout-toc-width-max: 18%; + --layout-content-max-width: 800px; + --layout-header-height: 64px; + --layout-search-width: 400px; + + /* Transitions */ + --transition-fast: 150ms ease-in-out; + --transition-base: 200ms ease-in-out; + --transition-slow: 350ms ease-in-out; + --ease-out-smooth: cubic-bezier(0.4, 0, 0.2, 1); + + /* Animation Durations */ + --duration-fast: 250ms; + --duration-base: 300ms; + --duration-medium: 350ms; + + /* Z-Index Scale */ + --z-fixed: 300; + --z-modal: 400; + --z-popover: 500; + +} + +/* Dark Theme */ +[data-theme="dark"] { + /* Code highlighting colors - neutral palette for all syntax highlighters */ + --code-blue: #93c5fd; + --code-green: #34d399; + --code-orange: #fbbf24; + --code-purple: #c084fc; + --code-red: #f87171; + --code-cyan: #22d3ee; + --code-gray: #a8a29e; + + /* Semantic Colors - Dark Theme */ + --color-text-primary: var(--color-neutral-50); + --color-text-secondary: var(--color-neutral-200); + --color-text-tertiary: var(--color-neutral-400); + --color-background-primary: var(--color-neutral-900); + --color-background-secondary: var(--color-neutral-800); + --color-background-tertiary: var(--color-neutral-700); + --color-border-default: var(--color-neutral-600); + --color-border-subtle: var(--color-neutral-700); + --color-border-emphasis: var(--color-neutral-300); + --color-link-default: var(--color-neutral-50); + --color-link-hover: var(--color-primary-500); + --color-accent-primary: var(--color-primary-500); + --color-accent-hover: var(--color-primary-400); + --color-accent-subtle: rgb(235 84 79 / 10%); + --color-accent-subtle-hover: rgb(235 84 79 / 20%); + --color-code-bg: var(--color-neutral-800); + --color-code-border: var(--color-neutral-700); + --color-nav-bg: var(--color-neutral-900); + --color-nav-text: var(--color-neutral-50); + --color-th-background: var(--color-background-tertiary); + --color-td-background: var(--color-background-secondary); + + /* Search Type Badge Colors - Dark Theme */ + --color-search-type-class-bg: #1e3a5f; + --color-search-type-class-text: #93c5fd; + --color-search-type-module-bg: #14532d; + --color-search-type-module-text: #86efac; + --color-search-type-constant-bg: #451a03; + --color-search-type-constant-text: #fcd34d; + --color-search-type-method-bg: #3b0764; + --color-search-type-method-text: #d8b4fe; + + /* Dark theme shadows (slightly more subtle) */ + --shadow-sm: 0 1px 3px 0 rgb(0 0 0 / 40%), 0 1px 2px -1px rgb(0 0 0 / 40%); + --shadow-md: 0 2px 8px rgb(0 0 0 / 40%); + --shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 40%), 0 4px 6px -4px rgb(0 0 0 / 40%); + --shadow-xl: 0 20px 25px -5px rgb(0 0 0 / 40%), 0 8px 10px -6px rgb(0 0 0 / 40%); + +} + +/* 2. Global Styles & Layout */ +body { + background: var(--color-background-primary); + font-family: var(--font-primary); + font-weight: 400; + color: var(--color-text-primary); + line-height: var(--line-height-relaxed); + margin: 0; + overflow-wrap: break-word; /* Avoid overflow on mobile */ + + /* Grid layout with header, sidebar, main, and footer */ + display: grid; + grid-template: "header header" var(--layout-header-height) "nav main" 1fr "nav footer" auto / var(--layout-sidebar-width) 1fr; + min-height: 100vh; +} + +/* Three-column layout when TOC is present */ +body.has-toc { + grid-template: "header header header" var(--layout-header-height) "nav main toc" 1fr "nav footer toc" auto / var(--layout-sidebar-width) 1fr minmax(var(--layout-toc-width-min), var(--layout-toc-width-max)); + min-height: 100vh; +} + +/* Mobile: stack everything vertically */ +@media (width <= 1023px) { + body, + body.has-toc { + display: flex; + flex-direction: column; + grid-template: none; + } +} + +/* 3. Typography */ + +/* 4. Links */ +a { + color: var(--color-link-default); + transition: color var(--transition-base); + text-decoration: underline; + text-underline-offset: 0.2em; /* Make sure it doesn't overlap with underscores in a method name. */ +} + +/* 5. Code and Pre */ + +/* Code blocks */ +pre { + font-family: var(--font-code); + background-color: var(--color-code-bg); + border: 1px solid var(--color-code-border); + border-radius: var(--radius-md); + padding: var(--space-4); + overflow-x: auto; + font-size: var(--font-size-sm); + line-height: var(--line-height-normal); + margin: var(--space-4) 0; + position: relative; +} + +/* Code block wrapper for copy button */ +.code-block-wrapper { + position: relative; + margin: var(--space-4) 0; +} + +/* Copy button styling */ +.copy-code-button { + position: absolute; + top: var(--space-2); + right: var(--space-2); + padding: var(--space-2); + background: var(--color-background-secondary); + border: 1px solid var(--color-border-default); + border-radius: var(--radius-sm); + cursor: pointer; + opacity: 0.6; + transition: + opacity var(--transition-fast), + background var(--transition-fast), + border-color var(--transition-fast), + transform var(--transition-fast), + box-shadow var(--transition-fast); + display: flex; + align-items: center; + justify-content: center; + width: 2rem; + height: 2rem; + z-index: 10; +} + +.copy-code-button:hover, +.copy-code-button:focus { + opacity: 1; + background: var(--color-background-tertiary); + border-color: var(--color-border-emphasis); + transform: translateY(-1px); + box-shadow: var(--shadow-md); +} + +.copy-code-button:focus { + outline: none; + box-shadow: 0 0 0 3px var(--color-accent-subtle); +} + +.copy-code-button:active { + transform: scale(0.92); + box-shadow: none; +} + +.copy-code-button svg { + width: 1rem; + height: 1rem; + fill: none; + stroke: currentcolor; + stroke-width: 2; + stroke-linecap: round; + stroke-linejoin: round; + color: var(--color-text-secondary); + transition: color var(--transition-fast), transform var(--transition-base); +} + +.copy-code-button:hover svg { + color: var(--color-text-primary); +} + +/* Copied state - subtle green checkmark */ +.copy-code-button.copied { + background: var(--color-success-bg); + border-color: var(--color-green-500); + opacity: 1; +} + +.copy-code-button.copied svg { + color: var(--color-green-600); +} + +[data-theme="dark"] .copy-code-button.copied { + border-color: var(--color-green-400); +} + +[data-theme="dark"] .copy-code-button.copied svg { + color: var(--color-green-400); +} + +/* Mobile adjustments */ +@media (hover: none) { + .copy-code-button { + opacity: 0.7; + } + + .copy-code-button:active { + opacity: 1; + } +} + +/* Inline code */ +code { + font-family: var(--font-code); + background-color: var(--color-code-bg); + border: 1px solid var(--color-border-subtle); + padding: 0.125rem 0.375rem; + border-radius: var(--radius-sm); + font-size: 0.9em; +} + +pre code { + background: none; + border: none; + padding: 0; + font-size: inherit; +} + +a code:hover { + color: var(--color-link-hover); +} + +/* Tables */ +table { + margin: 0; + border-spacing: 0; + border-collapse: collapse; +} + +table tr th, table tr td { + padding: 0.2em 0.4em; + border: 1px solid var(--color-border-default); +} + +table tr th { + background-color: var(--color-th-background); +} + +table tr:nth-child(even) td { + background-color: var(--color-td-background); +} + +/* 6. Header (Top Navbar) */ +header.top-navbar { + grid-area: header; + position: sticky; + top: 0; + z-index: var(--z-fixed); + background: var(--color-background-primary); + border-bottom: 1px solid var(--color-border-default); + display: flex; + align-items: center; + justify-content: flex-start; + padding: 0 var(--space-6); + gap: var(--space-8); + height: var(--layout-header-height); + box-shadow: var(--shadow-sm); +} + +header.top-navbar .navbar-brand { + font-size: var(--font-size-xl); + font-weight: var(--font-weight-semibold); + color: var(--color-text-primary); + text-decoration: none; + white-space: nowrap; +} + +header.top-navbar .navbar-brand:hover { + color: var(--color-accent-primary); +} + +header.top-navbar .navbar-search { + position: relative; + flex: 0 1 auto; + width: var(--layout-search-width); +} + +header.top-navbar .navbar-search form { + margin: 0; + padding: 0; +} + + + +/* Mobile search icon button (hidden on desktop) */ +.navbar-search-mobile { + display: none; +} + +/* Theme toggle button */ +.theme-toggle { + display: flex; + align-items: center; + justify-content: center; + padding: var(--space-2); + margin-left: auto; + background: transparent; + border: 1px solid var(--color-border-default); + border-radius: var(--radius-md); + color: var(--color-text-primary); + cursor: pointer; + transition: + background var(--transition-fast), + border-color var(--transition-fast), + color var(--transition-fast), + transform var(--transition-fast); + font-size: var(--font-size-lg); + line-height: 1; + width: 2.5rem; + height: 2.5rem; +} + +.theme-toggle:hover { + background: var(--color-background-secondary); + border-color: var(--color-accent-primary); + color: var(--color-accent-primary); + transform: scale(1.05); +} + +.theme-toggle:focus { + outline: none; + border-color: var(--color-accent-primary); + box-shadow: 0 0 0 3px var(--color-accent-subtle); +} + +.theme-toggle:active { + transform: scale(0.95); +} + +.theme-toggle-icon { + display: inline-block; + transition: transform var(--duration-base) var(--ease-out-smooth); +} + +.theme-toggle:hover .theme-toggle-icon { + transform: rotate(15deg) scale(1.1); +} + +/* Mobile navbar */ +@media (width <= 1023px) { + header.top-navbar { + display: flex; + align-items: center; + padding: 0 var(--space-4); + gap: var(--space-4); + } + + /* Hide desktop search bar on mobile */ + header.top-navbar .navbar-search-desktop { + display: none; + } + + /* Show mobile search icon */ + .navbar-search-mobile { + display: flex; + align-items: center; + justify-content: center; + padding: 0.5rem; + background: transparent; + border: none; + font-size: 1.25rem; + color: var(--color-text-primary); + cursor: pointer; + transition: color var(--transition-fast); + } + + .navbar-search-mobile:hover { + color: var(--color-accent-primary); + } + + /* Brand needs left margin for hamburger button */ + header.top-navbar .navbar-brand { + margin-left: 2.5rem; + flex: 1; + font-size: var(--font-size-lg); + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } +} + +/* 7. Navigation (Left Sidebar) */ +nav { + grid-area: nav; + font-family: var(--font-heading); + font-size: var(--font-size-base); + border-right: 1px solid var(--color-border-default); + background: var(--color-nav-bg); + color: var(--color-nav-text); + overflow: hidden auto; + overscroll-behavior: contain; + display: flex; + flex-direction: column; + position: sticky; + top: var(--layout-header-height); + height: calc(100vh - var(--layout-header-height)); + scrollbar-width: thin; + scrollbar-color: var(--color-border-default) transparent; +} + +/* Custom scrollbar for WebKit browsers */ +nav::-webkit-scrollbar { + width: 6px; +} + +nav::-webkit-scrollbar-track { + background: transparent; +} + +nav::-webkit-scrollbar-thumb { + background: var(--color-border-default); + border-radius: var(--radius-sm); + transition: background var(--transition-fast); +} + +nav::-webkit-scrollbar-thumb:hover { + background: var(--color-border-emphasis); +} + +/* Mobile navigation */ +@media (width <= 1023px) { + nav { + position: fixed; + top: var(--layout-header-height); + bottom: 0; + left: 0; + width: var(--layout-sidebar-width); + z-index: calc(var(--z-fixed) - 10); /* Below header */ + box-shadow: var(--shadow-lg); + + /* Don't set height - let top/bottom define it */ + } + + nav[hidden] { + display: none; + } + + /* Backdrop for mobile nav */ + body::before { + content: ''; + position: fixed; + inset: var(--layout-header-height) 0 0 0; + background: var(--color-overlay); + z-index: calc(var(--z-fixed) - 20); + opacity: 0; + pointer-events: none; + transition: opacity var(--transition-base); + } + + /* Show backdrop when nav is open */ + body.nav-open::before { + opacity: 1; + pointer-events: auto; + } +} + +/* Desktop: hide nav when [hidden] attribute is set */ +@media (width >= 1024px) { + nav[hidden] { + display: none; + } +} + +nav .nav-section { + margin-top: var(--space-6); + padding: 0 var(--space-6); +} + +nav h2, nav h3 { + font-size: var(--font-size-lg); + font-weight: var(--font-weight-semibold); + margin: 0 0 var(--space-4); + padding: var(--space-2) 0; + color: var(--color-accent-primary); + border-bottom: 1px solid var(--color-border-default); +} + +nav ul, +nav dl, +nav p { + padding: 0; + list-style: none; + margin: var(--space-3) 0; +} + +nav ul li { + margin-bottom: var(--space-2); + line-height: var(--line-height-relaxed); +} + +nav ul li a { + transition: + color var(--transition-fast), + transform var(--transition-fast), + padding var(--transition-fast); +} + +nav ul li a:hover { + padding-left: var(--space-1); +} + +nav ul ul { + padding-left: var(--space-5); + margin-top: var(--space-2); +} + +nav ul ul ul { + padding-left: var(--space-5); +} + +nav ul ul ul ul { + padding-left: var(--space-5); +} + +nav a { + text-decoration: none; +} + +/* Truncation for direct nav links (not links inside code tags) */ +nav .nav-list > li > a, +nav .nav-section > ul > li > a, +nav .nav-section > dl > dd > a { + display: block; + max-width: 100%; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +nav footer { + padding: var(--space-4); + border-top: 1px solid var(--color-border-default); +} + +nav footer a { + color: var(--color-accent-hover); +} + +#navigation-toggle { + display: none; /* Hidden by default, shown on mobile */ +} + +/* Mobile toggle button */ +@media (width <= 1023px) { + #navigation-toggle { + display: flex; + align-items: center; + justify-content: center; + position: fixed; + top: calc(var(--layout-header-height) / 2); + transform: translateY(-50%); + left: 1rem; + z-index: var(--z-fixed); + font-size: 1.5rem; + background: transparent; + border: none; + color: var(--color-text-primary); + cursor: pointer; + transition: color var(--transition-fast); + line-height: 1; + user-select: none; + -webkit-user-select: none; + } + + #navigation-toggle:hover { + color: var(--color-accent-primary); + } +} + +/* + * Shared Collapsible Animation using ::details-content pseudo-element. + * This is the modern CSS approach for animating
elements. + * Uses block-size animation with interpolate-size for smooth height transitions. + * Both nav-section-collapsible and nested link-list details share this pattern. + */ +nav details { + interpolate-size: allow-keywords; +} + +nav details::details-content { + overflow: hidden; + block-size: 0; + transition: block-size 200ms ease, content-visibility 200ms ease allow-discrete; +} + +nav details[open]::details-content { + block-size: auto; +} + +/* Collapsible Navigation Section Headers */ + +nav .nav-section-header { + display: flex; + align-items: center; + gap: var(--space-3); + padding: var(--space-3) 0; + cursor: pointer; + list-style: none; + user-select: none; + -webkit-user-select: none; + border-bottom: 1px solid var(--color-border-default); + margin-bottom: var(--space-3); + transition: color var(--transition-fast); +} + +nav .nav-section-header::-webkit-details-marker { + display: none; +} + +nav .nav-section-header:hover { + color: var(--color-accent-primary); +} + +nav .nav-section-icon { + display: flex; + align-items: center; + justify-content: center; + width: 1.25rem; + height: 1.25rem; + flex-shrink: 0; + color: var(--color-accent-primary); +} + +nav .nav-section-icon svg { + width: 100%; + height: 100%; +} + +nav .nav-section-title { + font-size: var(--font-size-base); + font-weight: var(--font-weight-semibold); + color: inherit; + flex: 1; + min-width: 0; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +nav .nav-section-chevron { + display: flex; + align-items: center; + justify-content: center; + width: 1rem; + height: 1rem; + flex-shrink: 0; + color: var(--color-text-tertiary); + transition: transform var(--transition-base); +} + +nav .nav-section-chevron svg { + width: 100%; + height: 100%; +} + +/* Rotate chevron when open */ +nav .nav-section-collapsible[open] > .nav-section-header .nav-section-chevron { + transform: rotate(90deg); +} + +nav .nav-section-collapsible > ul, +nav .nav-section-collapsible > dl, +nav .nav-section-collapsible > p { + margin-top: 0; +} + +nav .nav-section-collapsible > .nav-list { + padding-left: var(--space-5); + border-left: 1px solid var(--color-border-subtle); + margin-left: 9px; /* Align with the section icon center */ +} + +nav .nav-section-collapsible .nav-list .link-list { + border-left: none; + margin-left: 0; + padding-left: var(--space-5); +} + +/* + Improve chevron styling for details under link-list, using SVG chevron that matches nav-section-chevron + We need to avoid adding the element in class content generation so it doesn't break darkfish styles +*/ +nav li details:has(.link-list) > summary { + display: inline-flex; + align-items: center; + gap: var(--space-2); + cursor: pointer; +} + +nav li details:has(.link-list) > summary::after { + content: ''; + position: static; + display: inline-block; + width: 1rem; + height: 1rem; + flex-shrink: 0; + margin-left: 0; + background-color: var(--color-text-secondary); + mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='9 18 15 12 9 6'%3E%3C/polyline%3E%3C/svg%3E"); + mask-size: contain; + mask-repeat: no-repeat; + mask-position: center; + -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='9 18 15 12 9 6'%3E%3C/polyline%3E%3C/svg%3E"); + -webkit-mask-size: contain; + -webkit-mask-repeat: no-repeat; + -webkit-mask-position: center; + transition: transform var(--transition-base), background-color var(--transition-fast); +} + +nav li details:has(.link-list) > summary:hover::after { + background-color: var(--color-accent-primary); +} + +nav li details:has(.link-list)[open] > summary::after { + transform: rotate(90deg); + background-color: var(--color-accent-primary); +} + +/* 8. Main Content (Center Column) */ +main { + grid-area: main; + width: 100%; + max-width: var(--layout-content-max-width); + margin: 0 auto; + padding: var(--space-12) var(--space-8); + font-size: var(--font-size-base); + line-height: var(--line-height-relaxed); + color: var(--color-text-primary); + box-sizing: border-box; +} + +/* Desktop: hide hamburger */ +@media (width >= 1024px) { + #navigation-toggle { + display: none; + } +} + +/* Mobile: full width with padding */ +@media (width <= 1023px) { + main { + padding: var(--space-6) var(--space-4); + padding-top: var(--space-8); + width: 100%; + } + + footer.site-footer { + padding: var(--space-8) var(--space-4); + } + + footer.site-footer .footer-content { + grid-template-columns: 1fr; + gap: var(--space-6); + } +} + +main h1[class] { + margin-top: 0; + margin-bottom: 1em; + font-size: 2.5em; + color: var(--color-accent-primary); +} + +main h1, +main h2, +main h3, +main h4, +main h5, +main h6 { + font-family: var(--font-heading); + color: var(--color-accent-primary); + scroll-margin-top: calc(var(--layout-header-height) + 2rem); +} + +/* Heading size hierarchy */ +main h1 { + font-size: var(--font-size-3xl); + font-weight: var(--font-weight-bold); + margin-bottom: var(--space-4); + line-height: var(--line-height-tight); +} + +main h2 { + font-size: var(--font-size-2xl); + font-weight: var(--font-weight-semibold); + margin-top: var(--space-8); + margin-bottom: var(--space-4); + line-height: var(--line-height-tight); +} + +main h3 { + font-size: var(--font-size-xl); + font-weight: var(--font-weight-semibold); + margin-top: var(--space-6); + margin-bottom: var(--space-3); + line-height: var(--line-height-tight); +} + +main h4 { + font-size: var(--font-size-lg); + font-weight: var(--font-weight-medium); + margin-top: var(--space-4); + margin-bottom: var(--space-2); +} + +main h5, main h6 { + font-size: var(--font-size-base); + font-weight: var(--font-weight-medium); + margin-top: var(--space-3); + margin-bottom: var(--space-2); +} + +/* Heading links */ +main h1 a, +main h2 a, +main h3 a, +main h4 a, +main h5 a, +main h6 a { + color: inherit; + text-decoration: none; +} + +main h1 a:hover, +main h2 a:hover, +main h3 a:hover, +main h4 a:hover, +main h5 a:hover, +main h6 a:hover { + text-decoration: underline; +} + +/* Syntax Highlighting - Light Theme */ +.ruby-constant { color: var(--code-orange); } +.ruby-keyword { color: var(--code-red); } +.ruby-ivar { color: var(--code-orange); } +.ruby-operator { color: var(--code-green); } +.ruby-identifier { color: var(--code-blue); } +.ruby-node { color: var(--code-purple); } + +.ruby-comment { + color: var(--color-neutral-500); + font-style: italic; +} +.ruby-regexp { color: var(--code-purple); } +.ruby-value { color: var(--code-orange); } +.ruby-string { color: var(--code-green); } + +/* Syntax Highlighting - Dark Theme */ +[data-theme="dark"] .ruby-constant { color: var(--code-orange); } +[data-theme="dark"] .ruby-keyword { color: var(--code-red); } +[data-theme="dark"] .ruby-ivar { color: var(--code-orange); } +[data-theme="dark"] .ruby-operator { color: var(--code-green); } +[data-theme="dark"] .ruby-identifier { color: var(--code-blue); } +[data-theme="dark"] .ruby-node { color: var(--code-purple); } + +[data-theme="dark"] .ruby-comment { + color: var(--color-neutral-400); + font-style: italic; +} +[data-theme="dark"] .ruby-regexp { color: var(--code-purple); } +[data-theme="dark"] .ruby-value { color: var(--code-orange); } +[data-theme="dark"] .ruby-string { color: var(--code-green); } + +/* C Syntax Highlighting */ +.c-keyword { color: var(--code-red); } +.c-type { color: var(--code-cyan); } +.c-macro { color: var(--code-orange); } +.c-function { color: var(--code-purple); } +.c-identifier { color: var(--color-text-secondary); } +.c-operator { color: var(--code-green); } +.c-preprocessor { color: var(--code-purple); } +.c-value { color: var(--code-orange); } +.c-string { color: var(--code-green); } + +.c-comment { + color: var(--code-gray); + font-style: italic; +} + +/* Shell Syntax Highlighting */ +.sh-prompt { color: var(--code-gray); } +.sh-command { color: var(--code-blue); } +.sh-option { color: var(--code-cyan); } +.sh-string { color: var(--code-green); } +.sh-envvar { color: var(--code-purple); } + +.sh-comment { + color: var(--code-gray); + font-style: italic; +} + +/* Emphasis */ +em { + text-decoration-color: var(--color-emphasis-decoration); + text-decoration-line: underline; + text-decoration-style: dotted; +} + +strong, +em { + color: var(--color-accent-primary); + background-color: var(--color-emphasis-bg); +} + +/* Paragraphs */ +main p { + line-height: var(--line-height-relaxed); + font-weight: 400; + margin-bottom: var(--space-4); +} + +/* Preformatted Text */ +main pre { + margin: 1.2em 0.5em; + padding: 1em; + font-size: 0.8em; +} + +.code-block-wrapper pre { + margin: 0; +} + +/* Horizontal Rules */ +main hr { + margin: 1.5em 1em; + border: 2px solid var(--color-border-default); +} + +/* Blockquotes */ +main blockquote { + margin: 0 2em 1.2em 1.2em; + padding-left: 0.5em; + border-left: 2px solid var(--color-border-default); +} + +/* Lists */ +main li > p { + margin: 0.5em; +} + +/* Definition Lists */ +main dl { + margin: 1em 0.5em; +} + +main dt { + line-height: 1.5; + font-weight: bold; +} + +main dl.note-list dt { + margin-right: 1em; + float: left; +} + +main dl.note-list dt:has(+ dt) { + margin-right: 0.25em; +} + +main dl.note-list dt:has(+ dt)::after { + content: ', '; + font-weight: normal; +} + +main dd { + margin: 0 0 1em 1em; +} + +main dd p:first-child { + margin-top: 0; +} + +/* Headers within Main */ +main header h2 { + margin-top: 2em; + border-width: 0; + border-top: 4px solid var(--color-border-default); + font-size: 130%; +} + +main header h3 { + margin: 2em 0 1.5em; + border-width: 0; + border-top: 3px solid var(--color-border-default); + font-size: 120%; +} + +h1:target, +h2:target, +h3:target, +h4:target, +h5:target, +h6:target { + margin-left: calc(-1 * var(--space-5)); + padding-left: calc(var(--space-5) / 2); + border-left: calc(var(--space-5) / 2) solid var(--color-border-default); +} + +main .anchor-link:target { + scroll-margin-top: calc(var(--layout-header-height) + 2rem); +} + +/* Legacy anchor for backward compatibility with old label- prefix links */ +.legacy-anchor { + display: block; + position: relative; + visibility: hidden; + scroll-margin-top: calc(var(--layout-header-height) + 2rem); +} + +/* When a legacy anchor is targeted, highlight the next heading sibling */ +.legacy-anchor:target + h1, +.legacy-anchor:target + h2, +.legacy-anchor:target + h3, +.legacy-anchor:target + h4, +.legacy-anchor:target + h5, +.legacy-anchor:target + h6 { + margin-left: calc(-1 * var(--space-5)); + padding-left: calc(var(--space-5) / 2); + border-left: calc(var(--space-5) / 2) solid var(--color-border-default); +} + + +/* Utility Classes */ +.hide { display: none !important; } +.initially-hidden { display: none; } + +/* Screen reader only */ +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip-path: inset(50%); + white-space: nowrap; + border-width: 0; +} + + + +/* Method Details */ +main .method-source-code { + visibility: hidden; + max-height: 0; + overflow: hidden; + opacity: 0; + transform: translateY(-8px); + transition: + max-height var(--duration-medium) var(--ease-out-smooth), + visibility var(--duration-medium), + opacity var(--duration-fast) ease-out, + transform var(--duration-fast) ease-out; +} + +main .method-source-code pre { + border-color: var(--color-accent-hover); + border-left: 3px solid var(--color-accent-primary); + width: 100%; + box-sizing: border-box; + transition: border-color var(--transition-fast); + scrollbar-width: thin; + scrollbar-color: var(--color-border-default) transparent; +} + +main .method-source-code pre::-webkit-scrollbar { + width: 6px; + height: 6px; +} + +main .method-source-code pre::-webkit-scrollbar-track { + background: transparent; +} + +main .method-source-code pre::-webkit-scrollbar-thumb { + background: var(--color-border-default); + border-radius: var(--radius-sm); +} + +main .method-source-code pre::-webkit-scrollbar-thumb:hover { + background: var(--color-border-emphasis); +} + +main .method-source-code pre::-webkit-scrollbar-corner { + background: transparent; +} + +main .method-source-code.active-menu { + visibility: visible; + max-height: 100vh; + overflow: auto; + opacity: 1; + transform: translateY(0); +} + +main .method-description .method-calls-super { + color: var(--color-text-primary); + font-weight: bold; +} + +main .method-detail { + margin-bottom: 2.5em; +} + +main .method-detail:target { + margin-left: calc(-1 * var(--space-5)); + padding-left: calc(var(--space-5) / 2); + border-left: calc(var(--space-5) / 2) solid var(--color-border-default); +} + +main .method-header { + display: inline-block; + max-width: calc(100% - 6em); /* 6em is the width of the source code toggle */ +} + +main .method-heading { + position: relative; + font-family: var(--font-code); + font-size: var(--font-size-lg); + font-weight: var(--font-weight-semibold); + margin-bottom: var(--space-3); +} + +main .method-heading .method-name { + font-weight: var(--font-weight-semibold); +} + +main .method-heading .method-args { + font-weight: var(--font-weight-normal); +} + +main .method-controls { + float: right; +} + +main .method-controls summary { + display: inline-block; + line-height: 20px; + color: var(--color-accent-primary); + cursor: pointer; + padding: var(--space-1) var(--space-3); + border-radius: var(--radius-sm); + font-size: var(--font-size-sm); + font-weight: var(--font-weight-medium); + background: var(--color-accent-subtle); + border: 1px solid transparent; + transition: + color var(--transition-fast), + background var(--transition-fast), + border-color var(--transition-fast), + transform var(--transition-fast); + user-select: none; + -webkit-user-select: none; + list-style: none; +} + +main .method-controls summary::-webkit-details-marker { + display: none; +} + +main .method-controls summary:hover { + background: var(--color-primary-100); + border-color: var(--color-primary-300); + transform: translateY(-1px); +} + +main .method-controls summary:active { + transform: scale(0.96); +} + +[data-theme="dark"] main .method-controls summary:hover { + background: var(--color-accent-subtle-hover); + border-color: var(--color-primary-500); +} + +main .method-description, +main .aliases { + margin-top: 0.75em; + color: var(--color-text-primary); +} + +main .aliases { + padding-top: 4px; + font-style: italic; + cursor: default; +} + +main .aliases a { + color: var(--color-accent-hover); +} + +main .mixin-from { + font-size: 80%; + font-style: italic; + margin-bottom: 0.75em; +} + +main .method-description ul { + margin-left: 1.5em; +} + +main #attribute-method-details .method-detail:hover { + background-color: transparent; + cursor: default; +} + +main .attribute-access-type { + text-transform: uppercase; +} + +/* Small screen adjustments */ +@media (width <= 480px) { + nav { + width: 85%; + max-width: 320px; + } + + main { + margin: 0; + padding: var(--space-4); + max-width: 100%; + } + + table { + display: block; + overflow-x: auto; + white-space: nowrap; + } + + main .method-controls { + margin-top: 10px; + float: none; + } +} + + + +/* 9. Search Modal (Mobile) */ +.search-modal { + position: fixed; + inset: 0; + z-index: var(--z-modal); + display: none; +} + +.search-modal:not([hidden]) { + display: flex; + align-items: flex-start; + justify-content: center; + padding: var(--space-16) var(--space-4); +} + +/* Reduce padding on very small screens */ +@media (width <= 420px) { + .search-modal:not([hidden]) { + padding: var(--space-4) var(--space-3); + } + + .search-modal-content { + border-radius: var(--radius-md); + } + + .search-modal-header { + padding: var(--space-3); + } + + .search-modal-body { + padding: var(--space-3); + } + + .search-modal-form input { + font-size: var(--font-size-base); + min-width: 0; /* Allow input to shrink */ + } + + .search-modal-form { + gap: var(--space-2); + } + + .search-modal-close { + padding: var(--space-1) var(--space-3); + font-size: 0.75rem; + } +} + +.search-modal-backdrop { + position: absolute; + inset: 0; + background: var(--color-overlay); + z-index: 1; +} + +.search-modal-content { + position: relative; + z-index: 2; + background: var(--color-background-primary); + border-radius: var(--radius-lg); + box-shadow: var(--shadow-xl); + width: 100%; + max-width: 600px; + max-height: 80vh; + display: flex; + flex-direction: column; +} + +.search-modal-header { + padding: var(--space-6); + border-bottom: 1px solid var(--color-border-default); +} + +.search-modal-form { + display: flex; + align-items: center; + gap: var(--space-3); +} + +.search-modal-icon { + font-size: 1.5rem; + color: var(--color-text-secondary); + flex-shrink: 0; +} + +.search-modal-form input { + flex: 1; + border: none; + outline: none; + background: transparent; + font-size: var(--font-size-lg); + color: var(--color-text-primary); + padding: 0; +} + +.search-modal-form input::placeholder { + color: var(--color-text-tertiary); +} + +.search-modal-close { + padding: var(--space-2) var(--space-4); + background: var(--color-background-secondary); + border: 1px solid var(--color-border-default); + border-radius: var(--radius-md); + font-size: var(--font-size-sm); + color: var(--color-text-secondary); + cursor: pointer; + transition: background var(--transition-fast), border-color var(--transition-fast); + flex-shrink: 0; +} + +.search-modal-close:hover { + background: var(--color-background-tertiary); + border-color: var(--color-border-default); +} + +.search-modal-body { + padding: var(--space-6); + overflow-y: auto; + flex: 1; +} + +.search-modal-empty { + text-align: center; + color: var(--color-text-tertiary); + padding: var(--space-12) 0; +} + +.search-modal-results { + list-style: none; + margin: 0; + padding: 0; +} + +.search-modal-results.initially-hidden { + display: block !important; /* Override initially-hidden */ +} + +.search-modal-results li { + padding: var(--space-3) var(--space-4); + border-radius: var(--radius-md); + cursor: pointer; + transition: background var(--transition-fast); + margin-bottom: var(--space-2); +} + +.search-modal-results li:hover { + background: var(--color-background-secondary); +} + +.search-modal-results a { + color: var(--color-text-primary); +} + +.search-modal-results .search-match { + margin: 0; + font-size: var(--font-size-base); +} + +.search-modal-results .search-match a { + text-decoration: none; +} + +.search-modal-results .search-namespace { + margin: var(--space-1) 0 0 0; + font-size: var(--font-size-sm); + color: var(--color-text-secondary); +} + +.search-modal-results .search-snippet { + margin: var(--space-1) 0 0 0; + font-size: var(--font-size-sm); + color: var(--color-text-tertiary); +} + +/* 10. Right Sidebar - Table of Contents */ +aside.table-of-contents { + grid-area: toc; + align-self: start; + position: sticky; + top: var(--layout-header-height); + padding: var(--space-8) var(--space-6); + border: none; + border-left: 1px solid var(--color-border-default); + font-size: var(--font-size-base); +} + +aside.table-of-contents * { + border-right: none !important; + outline: none !important; +} + +aside.table-of-contents .toc-sticky { + display: flex; + flex-direction: column; + + /* Exclude header height and top/bottom padding of aside.table-of-contents */ + height: calc(100vh - var(--layout-header-height) - var(--space-8) * 2); +} + +aside.table-of-contents .toc-sticky nav { + height: auto; +} + +aside.table-of-contents .toc-list > .toc-h2 { + margin-left: var(--space-4); +} + +aside.table-of-contents .toc-list > .toc-h3 { + margin-left: var(--space-8); +} + +/* Hide TOC on mobile/tablet */ +@media (width <= 1279px) { + aside.table-of-contents { + display: none; + } + + body.has-toc { + grid-template-columns: var(--layout-sidebar-width) 1fr; + grid-template-areas: + "header header" + "nav main" + "footer footer"; + } +} + +/* Tablet adjustments (between mobile and desktop) */ +@media (width >= 768px) and (width <= 1023px) { + header.top-navbar { + padding: 0 var(--space-6); + } + + main { + padding: var(--space-8) var(--space-6); + max-width: 100%; + } +} + +.table-of-contents h3 { + font-size: var(--font-size-lg); + font-weight: var(--font-weight-semibold); + margin: 0 0 var(--space-5) 0; + color: var(--color-text-primary); +} + +.table-of-contents ul { + margin: 0; + padding: 0; + list-style: none; +} + +.table-of-contents ul ul { + margin-top: var(--space-3); + margin-left: var(--space-5); + border-left: 1px solid var(--color-border-default); + padding-left: var(--space-4); +} + +.table-of-contents li { + margin-bottom: var(--space-3); +} + +.table-of-contents a { + display: block; + color: var(--color-text-secondary); + text-decoration: none; + transition: color var(--transition-fast); + line-height: var(--line-height-relaxed); + overflow-wrap: break-word; + hyphens: auto; +} + +/* Nav hover styles sit here to keep specificity ordering with TOC links */ +nav a:hover { + color: var(--color-link-hover); + text-decoration: underline; +} + +.table-of-contents a:hover { + color: var(--color-link-hover); +} + +.table-of-contents a.active { + color: var(--color-accent-primary); + font-weight: var(--font-weight-medium); +} + +ol.breadcrumb { + display: flex; + padding: 0; + margin: 0 0 1em; +} + +ol.breadcrumb li { + display: block; + list-style: none; + font-size: 125%; +} + +/* 11. Footer */ +footer.site-footer { + grid-area: footer; + background: var(--color-background-secondary); + border-top: 1px solid var(--color-border-default); + padding: var(--space-12) var(--space-6); +} + +footer.site-footer .footer-content { + max-width: 1200px; + margin: 0 auto; + display: grid; + grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); + gap: var(--space-8); +} + +footer.site-footer h3 { + font-size: var(--font-size-sm); + font-weight: var(--font-weight-semibold); + color: var(--color-text-primary); + margin: 0 0 var(--space-4) 0; + letter-spacing: 0.05em; +} + +footer.site-footer ul { + list-style: none; + margin: 0; + padding: 0; +} + +footer.site-footer li { + margin-bottom: var(--space-2); +} + +footer.site-footer a { + color: var(--color-text-secondary); + text-decoration: none; + font-size: var(--font-size-sm); + transition: color var(--transition-fast); +} + +footer.site-footer a:hover { + color: var(--color-link-hover); +} + +footer.site-footer .footer-bottom { + margin-top: var(--space-8); + padding-top: var(--space-6); + border-top: 1px solid var(--color-border-default); + text-align: center; + font-size: var(--font-size-xs); + color: var(--color-text-tertiary); +} + +footer.site-footer .footer-bottom:first-child { + margin-top: 0; + padding-top: 0; + border-top: none; +} + +/* Search */ +#search-section { + padding: var(--space-6); + background-color: var(--color-background-primary); + border-bottom: 1px solid var(--color-border-default); +} + +#search-field-wrapper { + position: relative; + display: flex; + align-items: center; +} + +#search-field { + width: 100%; + padding: var(--space-2) var(--space-4) var(--space-2) 2.5rem; + border: 1px solid var(--color-border-default); + border-radius: 1.25rem; + font-size: var(--font-size-sm); + outline: none; + transition: border-color var(--transition-base); + color: var(--color-text-primary); +} + +#search-field:focus { + border-color: var(--color-accent-primary); +} + +#search-field::placeholder { + color: var(--color-text-primary); +} + +#search-field-wrapper::before { + content: "\1F50D"; + position: absolute; + left: var(--space-3); + top: 50%; + transform: translateY(-50%); + font-size: var(--font-size-sm); + color: var(--color-text-primary); + opacity: 0.6; +} + +/* Search Results */ +.search-results { + font-family: var(--font-primary); + font-weight: 300; +} + +.search-results a { + color: var(--color-text-primary); +} + +.search-results a:hover { + color: var(--color-accent-primary); +} + +.search-results .search-match { + font-family: var(--font-heading); + font-weight: normal; +} + +.search-results .search-selected { + background: var(--color-code-bg); + border-bottom: 1px solid transparent; +} + +.search-results li { + list-style: none; + border-bottom: 1px solid var(--color-border-default); + margin-bottom: 0.5em; +} + +.search-results li:last-child { + border-bottom: none; + margin-bottom: 0; +} + +.search-results li p { + padding: 0; + margin: 0.5em; +} + +.search-results .search-namespace { + font-weight: bold; +} + +.search-results .search-type { + display: inline-block; + margin-left: var(--space-2); + padding: 0 var(--space-2); + font-size: var(--font-size-xs); + font-weight: 500; + border-radius: var(--radius-sm); + vertical-align: middle; + background: var(--color-background-tertiary); + color: var(--color-text-secondary); +} + +.search-results .search-type-class { + background: var(--color-search-type-class-bg); + color: var(--color-search-type-class-text); +} + +.search-results .search-type-module { + background: var(--color-search-type-module-bg); + color: var(--color-search-type-module-text); +} + +.search-results .search-type-constant { + background: var(--color-search-type-constant-bg); + color: var(--color-search-type-constant-text); +} + +.search-results .search-type-instance-method, +.search-results .search-type-class-method { + background: var(--color-search-type-method-bg); + color: var(--color-search-type-method-text); +} + +.search-results li em { + background-color: var(--color-search-highlight-bg); + font-style: normal; +} + +.search-results pre { + margin: 0.5em; + font-family: var(--font-code); +} + +header.top-navbar #search-field { + width: 100%; + padding: var(--space-2) var(--space-4); + border: 1px solid var(--color-border-default); + border-radius: var(--radius-md); + font-size: var(--font-size-base); + background: var(--color-background-primary); + color: var(--color-text-primary); + transition: border-color var(--transition-fast); +} + +header.top-navbar #search-field:focus { + outline: none; + border-color: var(--color-accent-primary); + box-shadow: 0 0 0 3px var(--color-accent-subtle); +} + +header.top-navbar #search-field::placeholder { + color: var(--color-text-tertiary); +} + +/* Search results dropdown in navbar */ +header.top-navbar #search-results-desktop { + position: absolute; + top: calc(100% + var(--space-2)); + left: 0; + width: var(--layout-search-width); + max-height: 60vh; + background: var(--color-background-primary); + border: 1px solid var(--color-border-default); + border-radius: var(--radius-lg); + box-shadow: var(--shadow-lg); + overflow-y: auto; + z-index: var(--z-popover); + margin: 0; + padding: 0; +} + +header.top-navbar #search-results-desktop.initially-hidden { + display: none; +} + +header.top-navbar #search-results-desktop[aria-expanded="false"] { + display: none; +} diff --git a/doc/features/atualizar_dados_sigaa_feature.html b/doc/features/atualizar_dados_sigaa_feature.html new file mode 100644 index 0000000000..c661936580 --- /dev/null +++ b/doc/features/atualizar_dados_sigaa_feature.html @@ -0,0 +1,1661 @@ + + + + + + + +atualizar_dados_sigaa.feature - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

# encoding : UTF-8 # language: pt

+ +

Funcionalidade: Atualizar base de dados do sistema com dados do SIGAA

+ +
Eu, como Administrador
+Quero atualizar os dados de turmas, matérias e participantes do sistema com os dados atuais do SIGAA
+A fim de corrigir a base de dados do sistema
+ +

Contexto:

+ +
Dado que estou na página de gerenciamento 
+E que os dados do SIGAA foram importados com sucesso
+ +

Cenário: Atualização de dados do SIGAA (happy path)

+ +
Dado que os dados do SIGAA foram atualizados com sucesso
+Então as turmas, matérias e participantes do SIGAA estão atualizados no sistema com os dados atuais do SIGAA
+ +

Cenário: Atualização de dados do SIGAA com falha (sad path)

+ +
Dado que eu tentei atualizar os dados do SIGAA mas ocorreu um erro
+Então uma mensagem de erro é exibida informando que a atualização falhou
+ +

Cenário: Atualização de dados do SIGAA com dados já atualizados (sad path)

+ +
Dado que os dados do SIGAA já estão atualizados na base de dados do sistema
+Então uma mensagem é exibida informando que os dados já estão atualizados e não serão atualizados novamente
+ +

Cenário: Atualização de dados do SIGAA com dados parcialmente atualizados (sad path)

+ +
Dado que alguns dados do SIGAA já estão atualizados na base de dados do sistema
+Então uma mensagem é exibida informando que alguns dados já estão atualizados e não serão atualizados novamente, mas os dados restantes serão atualizados com sucesso
+ +
+ + + + + + + + diff --git a/doc/features/cadastro_sigaa_feature.html b/doc/features/cadastro_sigaa_feature.html new file mode 100644 index 0000000000..ced2a3f518 --- /dev/null +++ b/doc/features/cadastro_sigaa_feature.html @@ -0,0 +1,1642 @@ + + + + + + + +cadastro_sigaa.feature - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

# encoding : UTF-8 # language: pt

+ +

Funcionalidade: Cadastrar usuários do sistema

+ +
      Eu, como Administrador
+      Quero cadastrar participantes de turmas do SIGAA ao importar dados de usuarios novos para o sistema
+      A fim de que eles acessem o sistema CAMAAR
+
+Cenário: Cadastro de usuário importado do SIGAA (happy path)
+  Dado que estou na página de gerenciamento 
+  Dado que eu importei os dados do SIGAA com sucesso
+  Então o e-mail de usuário "usuario@teste.com" está cadastrado no sistema com senha indefinida
+  E um email de definição de senha é enviado para o email "usuario@teste.com"
+ +
+ + + + + + + + diff --git a/doc/features/create_template_feature.html b/doc/features/create_template_feature.html new file mode 100644 index 0000000000..f310895c8e --- /dev/null +++ b/doc/features/create_template_feature.html @@ -0,0 +1,1689 @@ + + + + + + + +create_template.feature - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

Feature: Create Template

+ +
  Eu como Administrador
+  Quero criar um template de formulário contendo as questões do formulário
+  A fim de gerar formulários de avaliações para avaliar o desempenho das turmas
+
+Background:
+  Given I Am authenticated as an "Administrador"
+  Given I Am on the home page
+  And I follow "Adicionar novo template"
+  And I am on the "Criar novo template" page
+
+Scenario: Create a template successfully(happy path)
+
+  # Teste de matematica, multipla escolha
+  And I have added the template
+  | titulo         | Template Prova Matemática 2º semestre |    
+  And I add the following elementos:
+  | enunciado_elemento           | tipo_campo       | enunciado_campo |
+  | Questão 1(2 pontos):         | multipla_escolha | a: b: c: d:     |
+  | Questão 2(2 pontos):         | multipla_escolha | a: b: c: d:     |
+  | Questão 3(3 pontos):         | multipla_escolha | a: b: c: d:     |   
+  | Questão 4(3 pontos):         | multipla_escolha | a: b: c: d:     | 
+  | Questão desafio(1 ponto):    | multipla_escolha | a: b: c: d:     | 
+  When I press "Salvar"
+  Then I should see a success message "Template criado com sucesso!"
+
+  # Teste de portugues, discursivo
+  When I follow "Adicionar novo template"
+  Given I have added the template
+  | titulo         | Template Prova Português 2º semestre  | 
+  And I add the following elementos:
+  | enunciado_elemento           | tipo_campo       | enunciado_campo |
+  | Questão 1(2.5 pontos):       | campo_de_texto   | Resposta:       |
+  | Questão 2(2.5 pontos):       | campo_de_texto   | Resposta:       |
+  | Questão 3(2.5 pontos):       | campo_de_texto   | Resposta:       |
+  | Questão 4(2.5 pontos):       | campo_de_texto   | Resposta:       | 
+  | Questão desafio(1 ponto):    | campo_de_texto   | Resposta:       |
+  When I press "Salvar"
+  Then I should see a success message "Template criado com sucesso!"
+
+  # verificacao final (visualizacao)
+  And the template "Template Prova Matemática 2º semestre" should be listed in my templates
+  And the template "Template Prova Português 2º semestre" should be listed in my templates
+
+Scenario: Attempt to create a template without a title(sad path)
+  Given I have added the template
+  | titulo         | "" |    
+  And I add the following elementos:
+  | enunciado_elemento | tipo_campo       | enunciado_campo |
+  | Questão 1:         | multipla_escolha | a: b: c: d:     |
+  When I press "Salvar"
+  Then I should see an error message "Título não pode ficar em branco!"
+
+Scenario: Attempt to create a template without questions(sad path)
+  Given I have added the template
+  | titulo         | Template Prova Matemática 2º semestre  |   
+  And I dont add elementos
+  When I press "Salvar"
+  Then I should see an error message "Template deve ter pelo menos um elemento!"
+ +
+ + + + + + + + diff --git a/doc/features/criar_formulario_feature.html b/doc/features/criar_formulario_feature.html new file mode 100644 index 0000000000..13be03af83 --- /dev/null +++ b/doc/features/criar_formulario_feature.html @@ -0,0 +1,1659 @@ + + + + + + + +criar_formulario.feature - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

# language: pt

+ +

Funcionalidade: Criar formulário de avaliação

+ +
Como um professor ou administrador
+Quero poder criar um formulário de avaliação
+Para que os alunos possam avaliar a disciplina ou turma
+
+Contexto:
+  Dado que eu estou logado como professor
+  E eu estou na página de criação de formulários
+
+Cenário: Criação de formulário com sucesso (Happy Path)
+  Quando eu escolho um template para o formulário
+  E escolho uma turma para enviar o formulário
+  E envio o formulário
+  Então eu devo ver a mensagem "Formulário criado com sucesso"
+  E o formulário deve estar disponível para os alunos da turma selecionada
+
+Cenário: Tentativa de criação sem template (Sad Path)
+  Quando eu não escolho um template para o formulário
+  E escolho uma turma para enviar o formulário
+  E envio o formulário
+  Então eu devo ver a mensagem "Selecione um template para criar o formulário"
+
+Cenário: Tentativa de criação sem turma (Sad Path)
+  Quando eu não escolho uma turma para enviar o formulário
+  E escolho um template para o formulário
+  E envio o formulário
+  Então eu devo ver a mensagem "Selecione pelo menos uma turma"
+ +
+ + + + + + + + diff --git a/doc/features/criar_formulario_template_feature.html b/doc/features/criar_formulario_template_feature.html new file mode 100644 index 0000000000..ac2dc21c08 --- /dev/null +++ b/doc/features/criar_formulario_template_feature.html @@ -0,0 +1,1687 @@ + + + + + + + +criar_formulario_template.feature - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

# language: pt

+ +

Funcionalidade: Criar formulário baseado em template

+ +
Como um administrador
+Quero criar um formulário baseado em um template para as turmas que eu escolher
+A fim de avaliar o desempenho das turmas no semestre atual
+
+Contexto:
+  Dado que eu estou logado como administrador
+  E que existe um template chamado "Avaliação Padrão" com as seguintes perguntas:
+    | Pergunta                         | Tipo            | Opções                          |
+    | Como você avalia o professor?    | Múltipla Escolha | Ótimo, Bom, Regular, Ruim       |
+    | Qual seu nível de satisfação?    | Escala          | 1, 2, 3, 4, 5                   |
+    | Deixe seu comentário            | Texto           |                                  |
+  E que existem as seguintes turmas no semestre "2026.1":
+    | Código | Disciplina      | Turma |
+    | TEC001 | Matemática      | A     |
+    | TEC002 | Português       | B     |
+    | TEC003 | História        | A     |
+
+Cenário: Criar formulário a partir de template para uma turma (Happy Path)
+  Quando eu acesso a página de criação de formulário a partir de template
+  E eu seleciono o template "Avaliação Padrão"
+  E eu seleciono as turmas "TEC001 - Matemática - A"
+  E eu clico em "Criar Formulário"
+  Então eu devo ver a mensagem "Formulário criado com sucesso"
+  E o formulário deve conter as perguntas do template "Avaliação Padrão"
+  E o formulário deve estar associado à turma "Matemática - A"
+
+Cenário: Criar formulário a partir de template para múltiplas turmas (Happy Path)
+  Quando eu acesso a página de criação de formulário a partir de template
+  E eu seleciono o template "Avaliação Padrão"
+  E eu seleciono as turmas "TEC001 - Matemática - A" e "TEC002 - Português - B"
+  E eu clico em "Criar Formulário"
+  Então eu devo ver a mensagem "Formulários criados com sucesso"
+  E deve existir um formulário para a turma "Matemática - A"
+  E deve existir um formulário para a turma "Português - B"
+  E cada formulário deve conter as perguntas do template "Avaliação Padrão"
+
+Cenário: Tentar criar formulário sem selecionar template (Sad Path)
+  Quando eu acesso a página de criação de formulário a partir de template
+  E eu não seleciono nenhum template
+  E eu seleciono as turmas "TEC001 - Matemática - A"
+  E eu clico em "Criar Formulário"
+  Então eu devo ver a mensagem "Selecione um template para criar o formulário"
+
+Cenário: Tentar criar formulário sem selecionar turmas (Sad Path)
+  Quando eu acesso a página de criação de formulário a partir de template
+  E eu seleciono o template "Avaliação Padrão"
+  E eu não seleciono nenhuma turma
+  E eu clico em "Criar Formulário"
+  Então eu devo ver a mensagem "Selecione pelo menos uma turma"
+
+Cenário: Visualizar lista de templates disponíveis antes de criar
+  Quando eu acesso a página de criação de formulário a partir de template
+  Então eu devo ver a lista de templates disponíveis
+  E eu devo ver a lista de turmas do semestre "2026.1" disponíveis
+ +
+ + + + + + + + diff --git a/doc/features/definicao_senha_feature.html b/doc/features/definicao_senha_feature.html new file mode 100644 index 0000000000..ac3d56ec16 --- /dev/null +++ b/doc/features/definicao_senha_feature.html @@ -0,0 +1,1661 @@ + + + + + + + +definicao_senha.feature - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

# encoding : UTF-8 # language: pt

+ +

Funcionalidade: Definição de senha (primeiro acesso)

+ +
      Eu, como usuário importado do SIGAA
+      Quero definir minha senha a partir de um link enviado por e-mail
+      A fim de efetivar meu cadastro e acessar o sistema
+
+Contexto:
+  Dado que o e-mail de usuário "usuario@teste.com" está cadastrado no sistema com senha indefinida
+  E um email de definição de senha é enviado para o email "usuario@teste.com"
+
+Cenário: Definir senha com sucesso (happy path)
+  Quando eu acesso o link de definição de senha recebido por e-mail
+  E eu informo a nova senha "Senha123" e confirmo a senha "Senha123"
+  E eu confirmo a definição de senha
+  Então vejo a mensagem "Senha definida com sucesso."
+  Quando eu tento realizar o login com o email "usuario@teste.com" e a senha "Senha123"
+  Então vejo a mensagem "Login realizado com sucesso."
+  E sou direcionado para a página inicial
+
+Cenário: Definição de senha com confirmação diferente (sad path)
+  Quando eu acesso o link de definição de senha recebido por e-mail
+  E eu informo a nova senha "Senha123" e confirmo a senha "Senha321"
+  E eu confirmo a definição de senha
+  Então vejo a mensagem "Falha na definição de senha: confirmação não confere"
+
+Cenário: Definição de senha com senha inválida (sad path)
+  Quando eu acesso o link de definição de senha recebido por e-mail
+  E eu informo a nova senha "123" e confirmo a senha "123"
+  E eu confirmo a definição de senha
+  Então vejo a mensagem "Falha na definição de senha: senha inválida"
+ +
+ + + + + + + + diff --git a/doc/features/edit_delete_template_feature.html b/doc/features/edit_delete_template_feature.html new file mode 100644 index 0000000000..a032551697 --- /dev/null +++ b/doc/features/edit_delete_template_feature.html @@ -0,0 +1,1688 @@ + + + + + + + +edit_delete_template.feature - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

Feature: Edit and/or delete template

+ +
Eu como Administrador
+Quero editar e/ou deletar um template que eu criei sem afetar os formulários já criados
+A fim de organizar os templates existentes
+
+Background:
+  Given I am authenticated as an "Administrador"
+
+# criar
+Scenario: Edit a template title successfully(happy path)
+
+  # setup inicial
+  Given I have the following templates saved:
+    | titulo                                |
+    | Template Prova Matemática 2º semestre |
+  And the template "Template Prova Matemática 2º semestre" has the following elementos:
+    | enunciado_elemento           | tipo_campo       | enunciado_campo |
+    | Questão 1(2 pontos):         | multipla_escolha | a: b: c: d:     |
+    | Questão 2(2 pontos):         | multipla_escolha | a: b: c: d:     |
+    | Questão 3(3 pontos):         | multipla_escolha | a: b: c: d:     |   
+    | Questão 4(3 pontos):         | multipla_escolha | a: b: c: d:     | 
+    | Questão desafio(1 ponto):    | multipla_escolha | a: b: c: d:     |
+  When I go to the "Meus Templates" page
+  And I follow "Editar" for "Template Prova Matemática 2º semestre"
+
+  And I change the "titulo" to "Template Matemática Atualizado"
+  And I change the elemento "Questão desafio(1 ponto): " to ""
+  And I press "Salvar"
+  Then I should see a success message "Template atualizado com sucesso!"
+  And I should see "Template Matemática Atualizado"
+  But I should not see "Template Prova Matemática 2º semestre"
+  And the template "Template Matemática Atualizado" should have the following elementos:
+    | enunciado_elemento           | tipo_campo       | enunciado_campo |
+    | Questão 1(2 pontos):         | multipla_escolha | a: b: c: d:     |
+    | Questão 2(2 pontos):         | multipla_escolha | a: b: c: d:     |
+    | Questão 3(3 pontos):         | multipla_escolha | a: b: c: d:     |   
+    | Questão 4(3 pontos):         | multipla_escolha | a: b: c: d:     |
+
+Scenario: Attempt to edit a template with a blank title(sad path)
+  Given I have the following templates saved:
+    | titulo                                |
+    | Template Prova Matemática 2º semestre |
+  When I go to the "Meus Templates" page
+  And I follow "Editar" for "Template Prova Matemática 2º semestre"
+  And I change the "titulo" to ""
+  And I press "Salvar"
+  Then I should see an error message "Título não pode ficar em branco!"
+
+# deletar
+Scenario: Delete a template successfully(happy path)
+  Given I have the following templates saved:
+    | titulo                                |
+    | Template Prova Matemática 2º semestre |
+  When I go to the "Meus Templates" page
+  And I follow "Deletar" for "Template Prova Matemática 2º semestre"
+  And I confirm the deletion
+  Then I should see a success message "Template deletado com sucesso!"
+  And I should not see "Template Prova Matemática 2º semestre"
+ +
+ + + + + + + + diff --git a/doc/features/gerar_relatorio_csv_feature.html b/doc/features/gerar_relatorio_csv_feature.html new file mode 100644 index 0000000000..05f99a6121 --- /dev/null +++ b/doc/features/gerar_relatorio_csv_feature.html @@ -0,0 +1,1655 @@ + + + + + + + +gerar_relatorio_csv.feature - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

# encoding : UTF-8 # language: pt

+ +

Funcionalidade: Download de resultados de formulário em CSV

+ +
      Eu, como Administrador
+      Quero baixar um arquivo csv contendo os resultados de um formulário
+      A fim de avaliar o desempenho das turmas
+
+Contexto:
+  Dado que estou na página de Resultados
+  E vejo os formulários enviados para todas as turmas do meu departamento
+  E existe a "Turma A" de "Estruturas de Dados" que possui um formulário associado a ela
+  E este formulário já possui respostas enviadas pelos alunos
+
+Cenário: Baixar resultados do formulário com sucesso (happy path)
+  Quando eu sigo "Baixar Resultado"
+  Então o download do arquivo "formulario da Turma A de Estruturas de Dados" é iniciado
+  E o arquivo deve conter as colunas Usuário da Resposta, Data de Submissão e elementos do formulário
+  E o arquivo deve conter como linhas as respostas de cada usuário
+
+Cenário: Tentar baixar CSV de um formulário que não possui respostas (sad path)
+  Dado que a "Turma A" possui outro formulário
+  E este formulário não recebeu nenhuma resposta até o momento
+  Quando eu sigo "Baixar Resultado"
+  Então vejo a mensagem de erro "Falha na exportação: Este formulário ainda não possui respostas registradas."
+  E nenhum download de arquivo é iniciado
+ +
+ + + + + + + + diff --git a/doc/features/importar_dados_sigaa_feature.html b/doc/features/importar_dados_sigaa_feature.html new file mode 100644 index 0000000000..2fa5cd3ea8 --- /dev/null +++ b/doc/features/importar_dados_sigaa_feature.html @@ -0,0 +1,1662 @@ + + + + + + + +importar_dados_sigaa.feature - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

# encoding : UTF-8 # language: pt

+ +

Funcionalidade: Importar dados do SIGAA

+ +
Eu, como Administrador
+Quero importar dados de turmas, matérias e participantes do SIGAA (caso não existam na base de dados atual
+A fim de alimentar a base de dados do sistema
+P.S. utilizar os JSONs presentes no repositório
+ +

Contexto:

+ +
Dado que estou na página de gerenciamento
+E que os dados do SIGAA estão disponíveis para importação
+ +

Cenário: Importação de dados do SIGAA (happy path)

+ +
Dado que os dados do SIGAA foram importados com sucesso
+Então as turmas, matérias e participantes do SIGAA estão presentes no sistema
+ +

Cenário: Importação de dados do SIGAA com falha (sad path)

+ +
Dado que eu tentei importar os dados do SIGAA mas ocorreu um erro
+Então uma mensagem de erro é exibida informando que a importação falhou
+ +

Cenário: Importação de dados do SIGAA com dados já existentes (sad path)

+ +
Dado que os dados do SIGAA já existem na base de dados do sistema
+Então uma mensagem é exibida informando que os dados já foram importados e não serão importados novamente
+ +

Cenário: Importação de dados do SIGAA com dados parcialmente existentes (sad path)

+ +
Dado que alguns dados do SIGAA já existem na base de dados do sistema
+Então uma mensagem é exibida informando que alguns dados já foram importados e não serão importados novamente, mas os dados restantes serão importados com sucesso
+ +
+ + + + + + + + diff --git a/doc/features/login_feature.html b/doc/features/login_feature.html new file mode 100644 index 0000000000..63d08c1be1 --- /dev/null +++ b/doc/features/login_feature.html @@ -0,0 +1,1677 @@ + + + + + + + +login.feature - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

# encoding : UTF-8 # language: pt

+ +

Funcionalidade: Login no sistema

+ +
      Eu, como usuário do sistema
+      Quero acessar o sistema utilizando um e-mail ou matrícula cadastrada
+      A fim de responder formulários ou gerenciar o sistema
+
+Cenário: Login realizado com sucesso usando e-mail válido (happy path)
+  Dado que meu usuário está cadastrado com o email "usuario@teste.com" e senha "Senha123"
+  Quando eu tento realizar o login com o email "usuario@teste.com" e a senha "Senha123"
+  Então vejo a mensagem "Login realizado com sucesso."
+  E sou direcionado para a página inicial
+
+Cenário: Login realizado com sucesso usando matrícula válida (happy path)
+  Dado que minha matrícula "261067676" está cadastrada no sistema e senha "Senha123"
+  Quando eu tento realizar o login com matrícula "261067676" e a senha "Senha123"
+  Então vejo a mensagem "Login realizado com sucesso."
+  E sou direcionado para a página inicial
+
+Cenário: Tentativa de login com a senha errada (sad path)
+  Dado que meu usuário está cadastrado com o email "usuario@teste.com" e senha "Senha123"
+  Quando eu tento realizar o login com o email "usuario@teste.com" e a senha "Senha123."
+  Então vejo a mensagem "Falha no login: senha incorreta"
+  E permaneço na página de login
+
+Cenário: Tentativa de login com usuário em branco (sad path)
+  Quando eu tento realizar o login sem informar meu email ou matrícula e com senha "Senha123"
+  Então vejo a mensagem "Falha no login: informe seu email ou matrícula"
+  E permaneço na página de login
+
+Cenário: Tentativa de login com senha em branco (sad path)
+  Quando eu tento realizar o login com email "usuario@teste.com" sem informar minha senha
+  Então vejo a mensagem "Falha no login: informe a sua senha"
+  E permaneço na página de login
+
+Cenário: Tentativa de login com usuário com cadastro não efetivado (sad path)
+  Dado que meu usuário está cadastrado com o email "usuario@teste.com"
+  Dado que minha senha para "usuario@teste.com" não está definida
+  Quando eu tento realizar o login com o email "usuario@teste.com" e a senha "Senha123"
+  Então vejo a mensagem "Falha no login: usuário existente deve efetivar o seu cadastro por email"
+  E permaneço na página de login
+
+Cenário: Tentativa de login com usuário não cadastrado (sad path)
+  Dado que meu email "usuario@teste.com" não está cadastrado no sistema
+  Quando eu tento realizar o login com o email "usuario@teste.com" e a senha "Senha123"
+  Então vejo a mensagem "Falha no login: usuário não encontrado"
+  E permaneço na página de login
+ +
+ + + + + + + + diff --git a/doc/features/redefinicao_senha_feature.html b/doc/features/redefinicao_senha_feature.html new file mode 100644 index 0000000000..c38c2142be --- /dev/null +++ b/doc/features/redefinicao_senha_feature.html @@ -0,0 +1,1693 @@ + + + + + + + +redefinicao_senha.feature - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

# encoding : UTF-8 # language: pt

+ +

Funcionalidade: Redefinição de senha

+ +
      Eu, como usuário cadastrado
+      Quero redefinir minha senha quando eu a esquecer
+      A fim de recuperar meu acesso ao sistema
+
+Contexto:
+  Dado que meu usuário está cadastrado com o email "usuario@teste.com" e senha "Senha123"
+  E eu estou na página de login
+
+Cenário: Solicitar redefinição de senha com sucesso (happy path)
+  Quando eu clico em "Esqueci minha senha"
+  E eu informo o email "usuario@teste.com"
+  E eu solicito a redefinição de senha
+  Então vejo a mensagem "Solicitação de redefinição de senha enviada."
+  E um email de redefinição de senha é enviado para o email "usuario@teste.com"
+
+Cenário: Redefinir senha com sucesso através do link (happy path)
+  Dado que eu solicitei a redefinição de senha para o email "usuario@teste.com"
+  Quando eu acesso o link de redefinição de senha recebido por e-mail
+  E eu informo a nova senha "NovaSenha123" e confirmo a senha "NovaSenha123"
+  E eu confirmo a redefinição de senha
+  Então vejo a mensagem "Senha redefinida com sucesso."
+  Quando eu tento realizar o login com o email "usuario@teste.com" e a senha "NovaSenha123"
+  Então vejo a mensagem "Login realizado com sucesso."
+  E sou direcionado para a página inicial
+
+Cenário: Após redefinir a senha, a senha antiga deixa de funcionar (sad path)
+  Dado que eu solicitei a redefinição de senha para o email "usuario@teste.com"
+  Quando eu acesso o link de redefinição de senha recebido por e-mail
+  E eu informo a nova senha "NovaSenha123" e confirmo a senha "NovaSenha123"
+  E eu confirmo a redefinição de senha
+  Então vejo a mensagem "Senha redefinida com sucesso."
+  Quando eu tento realizar o login com o email "usuario@teste.com" e a senha "Senha123"
+  Então vejo a mensagem "Falha no login: senha incorreta"
+  E permaneço na página de login
+
+Cenário: Solicitar redefinição para email não cadastrado (sad path)
+  Dado que meu email "naoexiste@teste.com" não está cadastrado no sistema
+  Quando eu clico em "Esqueci minha senha"
+  E eu informo o email "naoexiste@teste.com"
+  E eu solicito a redefinição de senha
+  Então vejo a mensagem "Falha na redefinição de senha: usuário não encontrado"
+
+Cenário: Solicitar redefinição sem informar email (sad path)
+  Quando eu clico em "Esqueci minha senha"
+  E eu solicito a redefinição de senha sem informar meu email
+  Então vejo a mensagem "Falha na redefinição de senha: informe seu email"
+
+Cenário: Redefinição com confirmação diferente (sad path)
+  Dado que eu solicitei a redefinição de senha para o email "usuario@teste.com"
+  Quando eu acesso o link de redefinição de senha recebido por e-mail
+  E eu informo a nova senha "NovaSenha123" e confirmo a senha "NovaSenha321"
+  E eu confirmo a redefinição de senha
+  Então vejo a mensagem "Falha na redefinição de senha: confirmação não confere"
+
+Cenário: Redefinição com senha inválida (sad path)
+  Dado que eu solicitei a redefinição de senha para o email "usuario@teste.com"
+  Quando eu acesso o link de redefinição de senha recebido por e-mail
+  E eu informo a nova senha "123" e confirmo a senha "123"
+  E eu confirmo a redefinição de senha
+  Então vejo a mensagem "Falha na redefinição de senha: senha inválida"
+ +
+ + + + + + + + diff --git a/doc/features/responder_formulario_feature.html b/doc/features/responder_formulario_feature.html new file mode 100644 index 0000000000..b520f5b91f --- /dev/null +++ b/doc/features/responder_formulario_feature.html @@ -0,0 +1,1656 @@ + + + + + + + +responder_formulario.feature - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

# language: pt

+ +

Funcionalidade: Visualizar e responder formulário de avaliação

+ +
Como um discente
+Quero poder visualizar e responder a um formulário de avaliação
+Para dar feedback sobre a turma ou disciplina
+
+Contexto:
+  Dado que eu estou logado como discente
+  E existe um formulário ativo para minha turma
+  E eu estou na página de formulários disponíveis
+
+Cenário: Resposta completa ao formulário com sucesso (Happy Path)
+  Quando eu clico para responder o formulário
+  Então eu devo visualizar os detalhes e perguntas pertinentes a ele
+  Quando eu respondo todos os campos do formulário
+  E eu envio o fomulário
+  Então eu devo ver a mensagem "Respostas enviadas com sucesso!"
+  E a resposta deve ser registrada no sistema
+  E eu não devo mais ser capaz de responder ao mesmo formulário
+
+Cenário: Tentativa de envio com perguntas obrigatórias em branco (Sad Path)
+  Quando eu clico para responder o formulário 
+  E eu deixo uma pergunta obrigatória em branco
+  E eu envio o formulário
+  Então eu devo ver a mensagem "Por favor, responda todas as perguntas obrigatórias"
+ +
+ + + + + + + + diff --git a/doc/features/view_template_feature.html b/doc/features/view_template_feature.html new file mode 100644 index 0000000000..61ad968713 --- /dev/null +++ b/doc/features/view_template_feature.html @@ -0,0 +1,1653 @@ + + + + + + + +view_template.feature - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

Feature: View Template

+ +
  Eu como Administrador
+  Quero visualizar os templates criados
+  A fim de poder editar e/ou deletar um template que eu criei 
+
+Background:
+  Given I am authenticated as an "Administrador"
+
+Scenario: View template list successfully(happy path)
+  Given I have the following templates saved:
+    | titulo                                |
+    | Template Prova Matemática 2º semestre |
+    | Template Prova Português 2º semestre  |
+  When I go to the "Meus Templates" page
+  Then I should see "Template Prova Matemática 2º semestre"
+  And I should see "Template Prova Português 2º semestre"
+  And I should see options to "Editar" and "Deletar" for each template
+
+Scenario: View empty template list(sad path)
+  Given I have no templates saved
+  When I go to the "Meus Templates" page
+  Then I should see the message "Nenhum template encontrado."
+  And I should see a button "Criar novo template"
+ +
+ + + + + + + + diff --git a/doc/index.html b/doc/index.html new file mode 100644 index 0000000000..1254d99486 --- /dev/null +++ b/doc/index.html @@ -0,0 +1,1629 @@ + + + + + + + +RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

This is the API documentation for RDoc Documentation.

+ +
+ + + + + + + + diff --git a/doc/js/aliki.js b/doc/js/aliki.js new file mode 100644 index 0000000000..7883132b00 --- /dev/null +++ b/doc/js/aliki.js @@ -0,0 +1,511 @@ +'use strict'; + +/* ===== Method Source Code Toggling ===== */ + +function showSource(e) { + let target = e.target; + while (!target.classList.contains('method-detail')) { + target = target.parentNode; + } + if (typeof target !== "undefined" && target !== null) { + target = target.querySelector('.method-source-code'); + } + if (typeof target !== "undefined" && target !== null) { + target.classList.toggle('active-menu') + } +} + +function hookSourceViews() { + document.querySelectorAll('.method-source-toggle').forEach((codeObject) => { + codeObject.addEventListener('click', showSource); + }); +} + +/* ===== Search Functionality ===== */ + +function createSearchInstance(input, result) { + if (!input || !result) return null; + + result.classList.remove("initially-hidden"); + + const search = new SearchController(search_data, input, result); + + search.renderItem = function(result) { + const li = document.createElement('li'); + let html = ''; + + // TODO add relative path to + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

# IMPORTANT: This file is generated by cucumber-rails - edit at your own peril. # It is recommended to regenerate this file in the future when you upgrade to a # newer version of cucumber-rails. Consider adding your own code to a new file # instead of editing this one. Cucumber will automatically load all features/**/*.rb # files.

+ +

unless ARGV.any? { |a| a =~ /^gems/ } # Don’t load anything when running the gems:* tasks

+ +

vendored_cucumber_bin = Dir.first $LOAD_PATH.unshift(File.dirname(vendored_cucumber_bin) + “/../lib”) unless vendored_cucumber_bin.nil?

+ +

begin

+ +
require "cucumber/rake/task"
+
+namespace :cucumber do
+  Cucumber::Rake::Task.new({ ok: "test:prepare" }, "Run features that should pass") do |t|
+    t.binary = vendored_cucumber_bin # If nil, the gem's binary is used.
+    t.fork = true # You may get faster startup if you set this to false
+    t.profile = "default"
+  end
+
+  Cucumber::Rake::Task.new({ wip: "test:prepare" }, "Run features that are being worked on") do |t|
+    t.binary = vendored_cucumber_bin
+    t.fork = true # You may get faster startup if you set this to false
+    t.profile = "wip"
+  end
+
+  Cucumber::Rake::Task.new({ rerun: "test:prepare" }, "Record failing features and run only them if any exist") do |t|
+    t.binary = vendored_cucumber_bin
+    t.fork = true # You may get faster startup if you set this to false
+    t.profile = "rerun"
+  end
+
+  desc "Run all features"
+  task all: [ :ok, :wip ]
+
+  task :statsetup do
+    require "rails/code_statistics"
+    ::STATS_DIRECTORIES << %w[Cucumber\ features features] if File.exist?("features")
+    ::CodeStatistics::TEST_TYPES << "Cucumber features" if File.exist?("features")
+  end
+end
+
+desc "Alias for cucumber:ok"
+task cucumber: "cucumber:ok"
+
+task default: :cucumber
+
+task features: :cucumber do
+  STDERR.puts "*** The 'features' task is deprecated. See rake -T cucumber ***"
+end
+
+# In case we don't have the generic Rails test:prepare hook, append a no-op task that we can depend upon.
+task "test:prepare" do
+end
+
+task stats: "cucumber:statsetup"
+
+ +

rescue LoadError

+ +
desc "cucumber rake task not available (cucumber not installed)"
+task :cucumber do
+  abort "Cucumber rake task is not available. Be sure to install cucumber as a gem or plugin"
+end
+
+ +

end

+ +

end

+ +
+ + + + + + + + diff --git a/doc/log/development_log.html b/doc/log/development_log.html new file mode 100644 index 0000000000..1669014eb8 --- /dev/null +++ b/doc/log/development_log.html @@ -0,0 +1,2607 @@ + + + + + + + +development.log - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

Started GET “/” for 127.0.0.1 at 2026-05-20 08:33:07 -0300

+ +

ActiveRecord::NoDatabaseError (Database not found: camaar_development. Available database configurations can be found in config/database.yml.

+ +

To resolve this error:

+
  • +

    Create the database by running:

    + +
    bin/rails db:create
    +
  • +

    Verify that config/database.yml contains the correct database name.

    +
+ +

) Caused by: Mysql2::Error (Unknown database ‘camaar_development’)

+ +

Information for: ActiveRecord::NoDatabaseError (Database not found: camaar_development. Available database configurations can be found in config/database.yml.

+ +

To resolve this error:

+
  • +

    Create the database by running:

    + +
    bin/rails db:create
    +
  • +

    Verify that config/database.yml contains the correct database name.

    +
+ +

):

+ +

activerecord (8.1.3) lib/active_record/connection_adapters/mysql2_adapter.rb:30:in ‘ActiveRecord::ConnectionAdapters::Mysql2Adapter.new_client’ activerecord (8.1.3) lib/active_record/connection_adapters/mysql2_adapter.rb:144:in ‘ActiveRecord::ConnectionAdapters::Mysql2Adapter#connect’ activerecord (8.1.3) lib/active_record/connection_adapters/mysql2_adapter.rb:153:in ‘block in ActiveRecord::ConnectionAdapters::Mysql2Adapter#reconnect’ activesupport (8.1.3) lib/active_support/concurrency/null_lock.rb:9:in ‘ActiveSupport::Concurrency::NullLock#synchronize’ activerecord (8.1.3) lib/active_record/connection_adapters/mysql2_adapter.rb:150:in ‘ActiveRecord::ConnectionAdapters::Mysql2Adapter#reconnect’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract_adapter.rb:719:in ‘block (2 levels) in ActiveRecord::ConnectionAdapters::AbstractAdapter#reconnect!’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract_adapter.rb:1290:in ‘ActiveRecord::ConnectionAdapters::AbstractAdapter#attempt_configure_connection’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract_adapter.rb:716:in ‘block in ActiveRecord::ConnectionAdapters::AbstractAdapter#reconnect!’ activesupport (8.1.3) lib/active_support/concurrency/null_lock.rb:9:in ‘ActiveSupport::Concurrency::NullLock#synchronize’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract_adapter.rb:715:in ‘ActiveRecord::ConnectionAdapters::AbstractAdapter#reconnect!’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract_adapter.rb:830:in ‘block in ActiveRecord::ConnectionAdapters::AbstractAdapter#verify!’ activesupport (8.1.3) lib/active_support/concurrency/null_lock.rb:9:in ‘ActiveSupport::Concurrency::NullLock#synchronize’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract_adapter.rb:817:in ‘ActiveRecord::ConnectionAdapters::AbstractAdapter#verify!’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract_adapter.rb:839:in ‘ActiveRecord::ConnectionAdapters::AbstractAdapter#connect!’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract_adapter.rb:1056:in ‘block in ActiveRecord::ConnectionAdapters::AbstractAdapter#with_raw_connection’ activesupport (8.1.3) lib/active_support/concurrency/null_lock.rb:9:in ‘ActiveSupport::Concurrency::NullLock#synchronize’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract_adapter.rb:1055:in ‘ActiveRecord::ConnectionAdapters::AbstractAdapter#with_raw_connection’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract_mysql_adapter.rb:722:in ‘ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter#quote_string’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract/quoting.rb:75:in ‘ActiveRecord::ConnectionAdapters::Quoting#quote’ activerecord (8.1.3) lib/active_record/connection_adapters/mysql/schema_statements.rb:282:in ‘ActiveRecord::ConnectionAdapters::MySQL::SchemaStatements#quoted_scope’ activerecord (8.1.3) lib/active_record/connection_adapters/mysql/schema_statements.rb:264:in ‘ActiveRecord::ConnectionAdapters::MySQL::SchemaStatements#data_source_sql’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract/schema_statements.rb:61:in ‘ActiveRecord::ConnectionAdapters::SchemaStatements#table_exists?’ activerecord (8.1.3) lib/active_record/schema_migration.rb:55:in ‘block in ActiveRecord::SchemaMigration#create_table’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract/connection_pool.rb:463:in ‘ActiveRecord::ConnectionAdapters::ConnectionPool#with_connection’ activerecord (8.1.3) lib/active_record/schema_migration.rb:54:in ‘ActiveRecord::SchemaMigration#create_table’ activerecord (8.1.3) lib/active_record/migration.rb:1440:in ‘ActiveRecord::Migrator#initialize’ activerecord (8.1.3) lib/active_record/migration.rb:1288:in ‘ActiveRecord::MigrationContext#open’ activerecord (8.1.3) lib/active_record/migration.rb:763:in ‘block (2 levels) in ActiveRecord::Migration.pending_migrations’ activerecord (8.1.3) lib/active_record/migration/pending_migration_connection.rb:8:in ‘ActiveRecord::PendingMigrationConnection.with_temporary_pool’ activerecord (8.1.3) lib/active_record/migration.rb:762:in ‘block in ActiveRecord::Migration.pending_migrations’ activerecord (8.1.3) lib/active_record/migration.rb:761:in ‘Array#each’ activerecord (8.1.3) lib/active_record/migration.rb:761:in ‘ActiveRecord::Migration.pending_migrations’ activerecord (8.1.3) lib/active_record/migration.rb:740:in ‘ActiveRecord::Migration.check_pending_migrations’ activerecord (8.1.3) lib/active_record/migration.rb:660:in ‘block (2 levels) in ActiveRecord::Migration::CheckPending#call’ activesupport (8.1.3) lib/active_support/file_update_checker.rb:88:in ‘ActiveSupport::FileUpdateChecker#execute’ activerecord (8.1.3) lib/active_record/migration.rb:665:in ‘block in ActiveRecord::Migration::CheckPending#call’ activerecord (8.1.3) lib/active_record/migration.rb:657:in ‘Thread::Mutex#synchronize’ activerecord (8.1.3) lib/active_record/migration.rb:657:in ‘ActiveRecord::Migration::CheckPending#call’ actionpack (8.1.3) lib/action_dispatch/middleware/callbacks.rb:31:in ‘block in ActionDispatch::Callbacks#call’ activesupport (8.1.3) lib/active_support/callbacks.rb:101:in ‘ActiveSupport::Callbacks#run_callbacks’ actionpack (8.1.3) lib/action_dispatch/middleware/callbacks.rb:30:in ‘ActionDispatch::Callbacks#call’ actionpack (8.1.3) lib/action_dispatch/middleware/executor.rb:20:in ‘ActionDispatch::Executor#call’ actionpack (8.1.3) lib/action_dispatch/middleware/actionable_exceptions.rb:18:in ‘ActionDispatch::ActionableExceptions#call’ actionpack (8.1.3) lib/action_dispatch/middleware/debug_exceptions.rb:31:in ‘ActionDispatch::DebugExceptions#call’ web-console (4.3.0) lib/web_console/middleware.rb:132:in ‘WebConsole::Middleware#call_app’ web-console (4.3.0) lib/web_console/middleware.rb:28:in ‘block in WebConsole::Middleware#call’ web-console (4.3.0) lib/web_console/middleware.rb:17:in ‘Kernel#catch’ web-console (4.3.0) lib/web_console/middleware.rb:17:in ‘WebConsole::Middleware#call’ actionpack (8.1.3) lib/action_dispatch/middleware/show_exceptions.rb:32:in ‘ActionDispatch::ShowExceptions#call’ railties (8.1.3) lib/rails/rack/logger.rb:41:in ‘Rails::Rack::Logger#call_app’ railties (8.1.3) lib/rails/rack/logger.rb:29:in ‘Rails::Rack::Logger#call’ propshaft (1.3.2) lib/propshaft/quiet_assets.rb:11:in ‘Propshaft::QuietAssets#call’ actionpack (8.1.3) lib/action_dispatch/middleware/remote_ip.rb:98:in ‘ActionDispatch::RemoteIp#call’ actionpack (8.1.3) lib/action_dispatch/middleware/request_id.rb:34:in ‘ActionDispatch::RequestId#call’ rack (3.2.6) lib/rack/method_override.rb:28:in ‘Rack::MethodOverride#call’ rack (3.2.6) lib/rack/runtime.rb:24:in ‘Rack::Runtime#call’ activesupport (8.1.3) lib/active_support/cache/strategy/local_cache_middleware.rb:30:in ‘ActiveSupport::Cache::Strategy::LocalCache::Middleware#call’ actionpack (8.1.3) lib/action_dispatch/middleware/server_timing.rb:61:in ‘block in ActionDispatch::ServerTiming#call’ actionpack (8.1.3) lib/action_dispatch/middleware/server_timing.rb:26:in ‘ActionDispatch::ServerTiming::Subscriber#collect_events’ actionpack (8.1.3) lib/action_dispatch/middleware/server_timing.rb:60:in ‘ActionDispatch::ServerTiming#call’ actionpack (8.1.3) lib/action_dispatch/middleware/executor.rb:20:in ‘ActionDispatch::Executor#call’ propshaft (1.3.2) lib/propshaft/server.rb:37:in ‘Propshaft::Server#call’ actionpack (8.1.3) lib/action_dispatch/middleware/static.rb:27:in ‘ActionDispatch::Static#call’ rack (3.2.6) lib/rack/sendfile.rb:131:in ‘Rack::Sendfile#call’ actionpack (8.1.3) lib/action_dispatch/middleware/host_authorization.rb:143:in ‘ActionDispatch::HostAuthorization#call’ railties (8.1.3) lib/rails/engine.rb:534:in ‘Rails::Engine#call’ puma (8.0.1) lib/puma/configuration.rb:305:in ‘Puma::Configuration::ConfigMiddleware#call’ puma (8.0.1) lib/puma/response.rb:79:in ‘block in Puma::Response#handle_request’ puma (8.0.1) lib/puma/thread_pool.rb:434:in ‘Puma::ThreadPool#with_force_shutdown’ puma (8.0.1) lib/puma/response.rb:78:in ‘Puma::Response#handle_request’ puma (8.0.1) lib/puma/server.rb:508:in ‘Puma::Server#process_client’ puma (8.0.1) lib/puma/server.rb:263:in ‘block in Puma::Server#run’ puma (8.0.1) lib/puma/thread_pool.rb:246:in ‘block in Puma::ThreadPool#spawn_thread’

+ +

Information for cause: Mysql2::Error (Unknown database ‘camaar_development’):

+ +

mysql2 (0.5.7) lib/mysql2/client.rb:92:in ‘Mysql2::Client#connect’ mysql2 (0.5.7) lib/mysql2/client.rb:92:in ‘Mysql2::Client#initialize’ activerecord (8.1.3) lib/active_record/connection_adapters/mysql2_adapter.rb:26:in ‘ActiveRecord::ConnectionAdapters::Mysql2Adapter.new_client’ activerecord (8.1.3) lib/active_record/connection_adapters/mysql2_adapter.rb:144:in ‘ActiveRecord::ConnectionAdapters::Mysql2Adapter#connect’ activerecord (8.1.3) lib/active_record/connection_adapters/mysql2_adapter.rb:153:in ‘block in ActiveRecord::ConnectionAdapters::Mysql2Adapter#reconnect’ activesupport (8.1.3) lib/active_support/concurrency/null_lock.rb:9:in ‘ActiveSupport::Concurrency::NullLock#synchronize’ activerecord (8.1.3) lib/active_record/connection_adapters/mysql2_adapter.rb:150:in ‘ActiveRecord::ConnectionAdapters::Mysql2Adapter#reconnect’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract_adapter.rb:719:in ‘block (2 levels) in ActiveRecord::ConnectionAdapters::AbstractAdapter#reconnect!’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract_adapter.rb:1290:in ‘ActiveRecord::ConnectionAdapters::AbstractAdapter#attempt_configure_connection’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract_adapter.rb:716:in ‘block in ActiveRecord::ConnectionAdapters::AbstractAdapter#reconnect!’ activesupport (8.1.3) lib/active_support/concurrency/null_lock.rb:9:in ‘ActiveSupport::Concurrency::NullLock#synchronize’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract_adapter.rb:715:in ‘ActiveRecord::ConnectionAdapters::AbstractAdapter#reconnect!’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract_adapter.rb:830:in ‘block in ActiveRecord::ConnectionAdapters::AbstractAdapter#verify!’ activesupport (8.1.3) lib/active_support/concurrency/null_lock.rb:9:in ‘ActiveSupport::Concurrency::NullLock#synchronize’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract_adapter.rb:817:in ‘ActiveRecord::ConnectionAdapters::AbstractAdapter#verify!’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract_adapter.rb:839:in ‘ActiveRecord::ConnectionAdapters::AbstractAdapter#connect!’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract_adapter.rb:1056:in ‘block in ActiveRecord::ConnectionAdapters::AbstractAdapter#with_raw_connection’ activesupport (8.1.3) lib/active_support/concurrency/null_lock.rb:9:in ‘ActiveSupport::Concurrency::NullLock#synchronize’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract_adapter.rb:1055:in ‘ActiveRecord::ConnectionAdapters::AbstractAdapter#with_raw_connection’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract_mysql_adapter.rb:722:in ‘ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter#quote_string’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract/quoting.rb:75:in ‘ActiveRecord::ConnectionAdapters::Quoting#quote’ activerecord (8.1.3) lib/active_record/connection_adapters/mysql/schema_statements.rb:282:in ‘ActiveRecord::ConnectionAdapters::MySQL::SchemaStatements#quoted_scope’ activerecord (8.1.3) lib/active_record/connection_adapters/mysql/schema_statements.rb:264:in ‘ActiveRecord::ConnectionAdapters::MySQL::SchemaStatements#data_source_sql’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract/schema_statements.rb:61:in ‘ActiveRecord::ConnectionAdapters::SchemaStatements#table_exists?’ activerecord (8.1.3) lib/active_record/schema_migration.rb:55:in ‘block in ActiveRecord::SchemaMigration#create_table’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract/connection_pool.rb:463:in ‘ActiveRecord::ConnectionAdapters::ConnectionPool#with_connection’ activerecord (8.1.3) lib/active_record/schema_migration.rb:54:in ‘ActiveRecord::SchemaMigration#create_table’ activerecord (8.1.3) lib/active_record/migration.rb:1440:in ‘ActiveRecord::Migrator#initialize’ activerecord (8.1.3) lib/active_record/migration.rb:1288:in ‘ActiveRecord::MigrationContext#open’ activerecord (8.1.3) lib/active_record/migration.rb:763:in ‘block (2 levels) in ActiveRecord::Migration.pending_migrations’ activerecord (8.1.3) lib/active_record/migration/pending_migration_connection.rb:8:in ‘ActiveRecord::PendingMigrationConnection.with_temporary_pool’ activerecord (8.1.3) lib/active_record/migration.rb:762:in ‘block in ActiveRecord::Migration.pending_migrations’ activerecord (8.1.3) lib/active_record/migration.rb:761:in ‘Array#each’ activerecord (8.1.3) lib/active_record/migration.rb:761:in ‘ActiveRecord::Migration.pending_migrations’ activerecord (8.1.3) lib/active_record/migration.rb:740:in ‘ActiveRecord::Migration.check_pending_migrations’ activerecord (8.1.3) lib/active_record/migration.rb:660:in ‘block (2 levels) in ActiveRecord::Migration::CheckPending#call’ activesupport (8.1.3) lib/active_support/file_update_checker.rb:88:in ‘ActiveSupport::FileUpdateChecker#execute’ activerecord (8.1.3) lib/active_record/migration.rb:665:in ‘block in ActiveRecord::Migration::CheckPending#call’ activerecord (8.1.3) lib/active_record/migration.rb:657:in ‘Thread::Mutex#synchronize’ activerecord (8.1.3) lib/active_record/migration.rb:657:in ‘ActiveRecord::Migration::CheckPending#call’ actionpack (8.1.3) lib/action_dispatch/middleware/callbacks.rb:31:in ‘block in ActionDispatch::Callbacks#call’ activesupport (8.1.3) lib/active_support/callbacks.rb:101:in ‘ActiveSupport::Callbacks#run_callbacks’ actionpack (8.1.3) lib/action_dispatch/middleware/callbacks.rb:30:in ‘ActionDispatch::Callbacks#call’ actionpack (8.1.3) lib/action_dispatch/middleware/executor.rb:20:in ‘ActionDispatch::Executor#call’ actionpack (8.1.3) lib/action_dispatch/middleware/actionable_exceptions.rb:18:in ‘ActionDispatch::ActionableExceptions#call’ actionpack (8.1.3) lib/action_dispatch/middleware/debug_exceptions.rb:31:in ‘ActionDispatch::DebugExceptions#call’ web-console (4.3.0) lib/web_console/middleware.rb:132:in ‘WebConsole::Middleware#call_app’ web-console (4.3.0) lib/web_console/middleware.rb:28:in ‘block in WebConsole::Middleware#call’ web-console (4.3.0) lib/web_console/middleware.rb:17:in ‘Kernel#catch’ web-console (4.3.0) lib/web_console/middleware.rb:17:in ‘WebConsole::Middleware#call’ actionpack (8.1.3) lib/action_dispatch/middleware/show_exceptions.rb:32:in ‘ActionDispatch::ShowExceptions#call’ railties (8.1.3) lib/rails/rack/logger.rb:41:in ‘Rails::Rack::Logger#call_app’ railties (8.1.3) lib/rails/rack/logger.rb:29:in ‘Rails::Rack::Logger#call’ propshaft (1.3.2) lib/propshaft/quiet_assets.rb:11:in ‘Propshaft::QuietAssets#call’ actionpack (8.1.3) lib/action_dispatch/middleware/remote_ip.rb:98:in ‘ActionDispatch::RemoteIp#call’ actionpack (8.1.3) lib/action_dispatch/middleware/request_id.rb:34:in ‘ActionDispatch::RequestId#call’ rack (3.2.6) lib/rack/method_override.rb:28:in ‘Rack::MethodOverride#call’ rack (3.2.6) lib/rack/runtime.rb:24:in ‘Rack::Runtime#call’ activesupport (8.1.3) lib/active_support/cache/strategy/local_cache_middleware.rb:30:in ‘ActiveSupport::Cache::Strategy::LocalCache::Middleware#call’ actionpack (8.1.3) lib/action_dispatch/middleware/server_timing.rb:61:in ‘block in ActionDispatch::ServerTiming#call’ actionpack (8.1.3) lib/action_dispatch/middleware/server_timing.rb:26:in ‘ActionDispatch::ServerTiming::Subscriber#collect_events’ actionpack (8.1.3) lib/action_dispatch/middleware/server_timing.rb:60:in ‘ActionDispatch::ServerTiming#call’ actionpack (8.1.3) lib/action_dispatch/middleware/executor.rb:20:in ‘ActionDispatch::Executor#call’ propshaft (1.3.2) lib/propshaft/server.rb:37:in ‘Propshaft::Server#call’ actionpack (8.1.3) lib/action_dispatch/middleware/static.rb:27:in ‘ActionDispatch::Static#call’ rack (3.2.6) lib/rack/sendfile.rb:131:in ‘Rack::Sendfile#call’ actionpack (8.1.3) lib/action_dispatch/middleware/host_authorization.rb:143:in ‘ActionDispatch::HostAuthorization#call’ railties (8.1.3) lib/rails/engine.rb:534:in ‘Rails::Engine#call’ puma (8.0.1) lib/puma/configuration.rb:305:in ‘Puma::Configuration::ConfigMiddleware#call’ puma (8.0.1) lib/puma/response.rb:79:in ‘block in Puma::Response#handle_request’ puma (8.0.1) lib/puma/thread_pool.rb:434:in ‘Puma::ThreadPool#with_force_shutdown’ puma (8.0.1) lib/puma/response.rb:78:in ‘Puma::Response#handle_request’ puma (8.0.1) lib/puma/server.rb:508:in ‘Puma::Server#process_client’ puma (8.0.1) lib/puma/server.rb:263:in ‘block in Puma::Server#run’ puma (8.0.1) lib/puma/thread_pool.rb:246:in ‘block in Puma::ThreadPool#spawn_thread’ Started GET “/favicon.ico” for 127.0.0.1 at 2026-05-20 08:33:08 -0300

+ +

ActiveRecord::NoDatabaseError (Database not found: camaar_development. Available database configurations can be found in config/database.yml.

+ +

To resolve this error:

+
  • +

    Create the database by running:

    + +
    bin/rails db:create
    +
  • +

    Verify that config/database.yml contains the correct database name.

    +
+ +

) Caused by: Mysql2::Error (Unknown database ‘camaar_development’)

+ +

Information for: ActiveRecord::NoDatabaseError (Database not found: camaar_development. Available database configurations can be found in config/database.yml.

+ +

To resolve this error:

+
  • +

    Create the database by running:

    + +
    bin/rails db:create
    +
  • +

    Verify that config/database.yml contains the correct database name.

    +
+ +

):

+ +

activerecord (8.1.3) lib/active_record/connection_adapters/mysql2_adapter.rb:30:in ‘ActiveRecord::ConnectionAdapters::Mysql2Adapter.new_client’ activerecord (8.1.3) lib/active_record/connection_adapters/mysql2_adapter.rb:144:in ‘ActiveRecord::ConnectionAdapters::Mysql2Adapter#connect’ activerecord (8.1.3) lib/active_record/connection_adapters/mysql2_adapter.rb:153:in ‘block in ActiveRecord::ConnectionAdapters::Mysql2Adapter#reconnect’ activesupport (8.1.3) lib/active_support/concurrency/null_lock.rb:9:in ‘ActiveSupport::Concurrency::NullLock#synchronize’ activerecord (8.1.3) lib/active_record/connection_adapters/mysql2_adapter.rb:150:in ‘ActiveRecord::ConnectionAdapters::Mysql2Adapter#reconnect’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract_adapter.rb:719:in ‘block (2 levels) in ActiveRecord::ConnectionAdapters::AbstractAdapter#reconnect!’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract_adapter.rb:1290:in ‘ActiveRecord::ConnectionAdapters::AbstractAdapter#attempt_configure_connection’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract_adapter.rb:716:in ‘block in ActiveRecord::ConnectionAdapters::AbstractAdapter#reconnect!’ activesupport (8.1.3) lib/active_support/concurrency/null_lock.rb:9:in ‘ActiveSupport::Concurrency::NullLock#synchronize’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract_adapter.rb:715:in ‘ActiveRecord::ConnectionAdapters::AbstractAdapter#reconnect!’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract_adapter.rb:830:in ‘block in ActiveRecord::ConnectionAdapters::AbstractAdapter#verify!’ activesupport (8.1.3) lib/active_support/concurrency/null_lock.rb:9:in ‘ActiveSupport::Concurrency::NullLock#synchronize’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract_adapter.rb:817:in ‘ActiveRecord::ConnectionAdapters::AbstractAdapter#verify!’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract_adapter.rb:839:in ‘ActiveRecord::ConnectionAdapters::AbstractAdapter#connect!’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract_adapter.rb:1056:in ‘block in ActiveRecord::ConnectionAdapters::AbstractAdapter#with_raw_connection’ activesupport (8.1.3) lib/active_support/concurrency/null_lock.rb:9:in ‘ActiveSupport::Concurrency::NullLock#synchronize’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract_adapter.rb:1055:in ‘ActiveRecord::ConnectionAdapters::AbstractAdapter#with_raw_connection’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract_mysql_adapter.rb:722:in ‘ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter#quote_string’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract/quoting.rb:75:in ‘ActiveRecord::ConnectionAdapters::Quoting#quote’ activerecord (8.1.3) lib/active_record/connection_adapters/mysql/schema_statements.rb:282:in ‘ActiveRecord::ConnectionAdapters::MySQL::SchemaStatements#quoted_scope’ activerecord (8.1.3) lib/active_record/connection_adapters/mysql/schema_statements.rb:264:in ‘ActiveRecord::ConnectionAdapters::MySQL::SchemaStatements#data_source_sql’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract/schema_statements.rb:61:in ‘ActiveRecord::ConnectionAdapters::SchemaStatements#table_exists?’ activerecord (8.1.3) lib/active_record/schema_migration.rb:55:in ‘block in ActiveRecord::SchemaMigration#create_table’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract/connection_pool.rb:463:in ‘ActiveRecord::ConnectionAdapters::ConnectionPool#with_connection’ activerecord (8.1.3) lib/active_record/schema_migration.rb:54:in ‘ActiveRecord::SchemaMigration#create_table’ activerecord (8.1.3) lib/active_record/migration.rb:1440:in ‘ActiveRecord::Migrator#initialize’ activerecord (8.1.3) lib/active_record/migration.rb:1288:in ‘ActiveRecord::MigrationContext#open’ activerecord (8.1.3) lib/active_record/migration.rb:763:in ‘block (2 levels) in ActiveRecord::Migration.pending_migrations’ activerecord (8.1.3) lib/active_record/migration/pending_migration_connection.rb:8:in ‘ActiveRecord::PendingMigrationConnection.with_temporary_pool’ activerecord (8.1.3) lib/active_record/migration.rb:762:in ‘block in ActiveRecord::Migration.pending_migrations’ activerecord (8.1.3) lib/active_record/migration.rb:761:in ‘Array#each’ activerecord (8.1.3) lib/active_record/migration.rb:761:in ‘ActiveRecord::Migration.pending_migrations’ activerecord (8.1.3) lib/active_record/migration.rb:740:in ‘ActiveRecord::Migration.check_pending_migrations’ activerecord (8.1.3) lib/active_record/migration.rb:660:in ‘block (2 levels) in ActiveRecord::Migration::CheckPending#call’ activesupport (8.1.3) lib/active_support/file_update_checker.rb:88:in ‘ActiveSupport::FileUpdateChecker#execute’ activerecord (8.1.3) lib/active_record/migration.rb:665:in ‘block in ActiveRecord::Migration::CheckPending#call’ activerecord (8.1.3) lib/active_record/migration.rb:657:in ‘Thread::Mutex#synchronize’ activerecord (8.1.3) lib/active_record/migration.rb:657:in ‘ActiveRecord::Migration::CheckPending#call’ actionpack (8.1.3) lib/action_dispatch/middleware/callbacks.rb:31:in ‘block in ActionDispatch::Callbacks#call’ activesupport (8.1.3) lib/active_support/callbacks.rb:101:in ‘ActiveSupport::Callbacks#run_callbacks’ actionpack (8.1.3) lib/action_dispatch/middleware/callbacks.rb:30:in ‘ActionDispatch::Callbacks#call’ actionpack (8.1.3) lib/action_dispatch/middleware/executor.rb:20:in ‘ActionDispatch::Executor#call’ actionpack (8.1.3) lib/action_dispatch/middleware/actionable_exceptions.rb:18:in ‘ActionDispatch::ActionableExceptions#call’ actionpack (8.1.3) lib/action_dispatch/middleware/debug_exceptions.rb:31:in ‘ActionDispatch::DebugExceptions#call’ web-console (4.3.0) lib/web_console/middleware.rb:132:in ‘WebConsole::Middleware#call_app’ web-console (4.3.0) lib/web_console/middleware.rb:28:in ‘block in WebConsole::Middleware#call’ web-console (4.3.0) lib/web_console/middleware.rb:17:in ‘Kernel#catch’ web-console (4.3.0) lib/web_console/middleware.rb:17:in ‘WebConsole::Middleware#call’ actionpack (8.1.3) lib/action_dispatch/middleware/show_exceptions.rb:32:in ‘ActionDispatch::ShowExceptions#call’ railties (8.1.3) lib/rails/rack/logger.rb:41:in ‘Rails::Rack::Logger#call_app’ railties (8.1.3) lib/rails/rack/logger.rb:29:in ‘Rails::Rack::Logger#call’ propshaft (1.3.2) lib/propshaft/quiet_assets.rb:11:in ‘Propshaft::QuietAssets#call’ actionpack (8.1.3) lib/action_dispatch/middleware/remote_ip.rb:98:in ‘ActionDispatch::RemoteIp#call’ actionpack (8.1.3) lib/action_dispatch/middleware/request_id.rb:34:in ‘ActionDispatch::RequestId#call’ rack (3.2.6) lib/rack/method_override.rb:28:in ‘Rack::MethodOverride#call’ rack (3.2.6) lib/rack/runtime.rb:24:in ‘Rack::Runtime#call’ activesupport (8.1.3) lib/active_support/cache/strategy/local_cache_middleware.rb:30:in ‘ActiveSupport::Cache::Strategy::LocalCache::Middleware#call’ actionpack (8.1.3) lib/action_dispatch/middleware/server_timing.rb:61:in ‘block in ActionDispatch::ServerTiming#call’ actionpack (8.1.3) lib/action_dispatch/middleware/server_timing.rb:26:in ‘ActionDispatch::ServerTiming::Subscriber#collect_events’ actionpack (8.1.3) lib/action_dispatch/middleware/server_timing.rb:60:in ‘ActionDispatch::ServerTiming#call’ actionpack (8.1.3) lib/action_dispatch/middleware/executor.rb:20:in ‘ActionDispatch::Executor#call’ propshaft (1.3.2) lib/propshaft/server.rb:37:in ‘Propshaft::Server#call’ actionpack (8.1.3) lib/action_dispatch/middleware/static.rb:27:in ‘ActionDispatch::Static#call’ rack (3.2.6) lib/rack/sendfile.rb:131:in ‘Rack::Sendfile#call’ actionpack (8.1.3) lib/action_dispatch/middleware/host_authorization.rb:143:in ‘ActionDispatch::HostAuthorization#call’ railties (8.1.3) lib/rails/engine.rb:534:in ‘Rails::Engine#call’ puma (8.0.1) lib/puma/configuration.rb:305:in ‘Puma::Configuration::ConfigMiddleware#call’ puma (8.0.1) lib/puma/response.rb:79:in ‘block in Puma::Response#handle_request’ puma (8.0.1) lib/puma/thread_pool.rb:434:in ‘Puma::ThreadPool#with_force_shutdown’ puma (8.0.1) lib/puma/response.rb:78:in ‘Puma::Response#handle_request’ puma (8.0.1) lib/puma/server.rb:508:in ‘Puma::Server#process_client’ puma (8.0.1) lib/puma/server.rb:263:in ‘block in Puma::Server#run’ puma (8.0.1) lib/puma/thread_pool.rb:246:in ‘block in Puma::ThreadPool#spawn_thread’

+ +

Information for cause: Mysql2::Error (Unknown database ‘camaar_development’):

+ +

mysql2 (0.5.7) lib/mysql2/client.rb:92:in ‘Mysql2::Client#connect’ mysql2 (0.5.7) lib/mysql2/client.rb:92:in ‘Mysql2::Client#initialize’ activerecord (8.1.3) lib/active_record/connection_adapters/mysql2_adapter.rb:26:in ‘ActiveRecord::ConnectionAdapters::Mysql2Adapter.new_client’ activerecord (8.1.3) lib/active_record/connection_adapters/mysql2_adapter.rb:144:in ‘ActiveRecord::ConnectionAdapters::Mysql2Adapter#connect’ activerecord (8.1.3) lib/active_record/connection_adapters/mysql2_adapter.rb:153:in ‘block in ActiveRecord::ConnectionAdapters::Mysql2Adapter#reconnect’ activesupport (8.1.3) lib/active_support/concurrency/null_lock.rb:9:in ‘ActiveSupport::Concurrency::NullLock#synchronize’ activerecord (8.1.3) lib/active_record/connection_adapters/mysql2_adapter.rb:150:in ‘ActiveRecord::ConnectionAdapters::Mysql2Adapter#reconnect’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract_adapter.rb:719:in ‘block (2 levels) in ActiveRecord::ConnectionAdapters::AbstractAdapter#reconnect!’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract_adapter.rb:1290:in ‘ActiveRecord::ConnectionAdapters::AbstractAdapter#attempt_configure_connection’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract_adapter.rb:716:in ‘block in ActiveRecord::ConnectionAdapters::AbstractAdapter#reconnect!’ activesupport (8.1.3) lib/active_support/concurrency/null_lock.rb:9:in ‘ActiveSupport::Concurrency::NullLock#synchronize’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract_adapter.rb:715:in ‘ActiveRecord::ConnectionAdapters::AbstractAdapter#reconnect!’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract_adapter.rb:830:in ‘block in ActiveRecord::ConnectionAdapters::AbstractAdapter#verify!’ activesupport (8.1.3) lib/active_support/concurrency/null_lock.rb:9:in ‘ActiveSupport::Concurrency::NullLock#synchronize’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract_adapter.rb:817:in ‘ActiveRecord::ConnectionAdapters::AbstractAdapter#verify!’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract_adapter.rb:839:in ‘ActiveRecord::ConnectionAdapters::AbstractAdapter#connect!’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract_adapter.rb:1056:in ‘block in ActiveRecord::ConnectionAdapters::AbstractAdapter#with_raw_connection’ activesupport (8.1.3) lib/active_support/concurrency/null_lock.rb:9:in ‘ActiveSupport::Concurrency::NullLock#synchronize’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract_adapter.rb:1055:in ‘ActiveRecord::ConnectionAdapters::AbstractAdapter#with_raw_connection’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract_mysql_adapter.rb:722:in ‘ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter#quote_string’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract/quoting.rb:75:in ‘ActiveRecord::ConnectionAdapters::Quoting#quote’ activerecord (8.1.3) lib/active_record/connection_adapters/mysql/schema_statements.rb:282:in ‘ActiveRecord::ConnectionAdapters::MySQL::SchemaStatements#quoted_scope’ activerecord (8.1.3) lib/active_record/connection_adapters/mysql/schema_statements.rb:264:in ‘ActiveRecord::ConnectionAdapters::MySQL::SchemaStatements#data_source_sql’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract/schema_statements.rb:61:in ‘ActiveRecord::ConnectionAdapters::SchemaStatements#table_exists?’ activerecord (8.1.3) lib/active_record/schema_migration.rb:55:in ‘block in ActiveRecord::SchemaMigration#create_table’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract/connection_pool.rb:463:in ‘ActiveRecord::ConnectionAdapters::ConnectionPool#with_connection’ activerecord (8.1.3) lib/active_record/schema_migration.rb:54:in ‘ActiveRecord::SchemaMigration#create_table’ activerecord (8.1.3) lib/active_record/migration.rb:1440:in ‘ActiveRecord::Migrator#initialize’ activerecord (8.1.3) lib/active_record/migration.rb:1288:in ‘ActiveRecord::MigrationContext#open’ activerecord (8.1.3) lib/active_record/migration.rb:763:in ‘block (2 levels) in ActiveRecord::Migration.pending_migrations’ activerecord (8.1.3) lib/active_record/migration/pending_migration_connection.rb:8:in ‘ActiveRecord::PendingMigrationConnection.with_temporary_pool’ activerecord (8.1.3) lib/active_record/migration.rb:762:in ‘block in ActiveRecord::Migration.pending_migrations’ activerecord (8.1.3) lib/active_record/migration.rb:761:in ‘Array#each’ activerecord (8.1.3) lib/active_record/migration.rb:761:in ‘ActiveRecord::Migration.pending_migrations’ activerecord (8.1.3) lib/active_record/migration.rb:740:in ‘ActiveRecord::Migration.check_pending_migrations’ activerecord (8.1.3) lib/active_record/migration.rb:660:in ‘block (2 levels) in ActiveRecord::Migration::CheckPending#call’ activesupport (8.1.3) lib/active_support/file_update_checker.rb:88:in ‘ActiveSupport::FileUpdateChecker#execute’ activerecord (8.1.3) lib/active_record/migration.rb:665:in ‘block in ActiveRecord::Migration::CheckPending#call’ activerecord (8.1.3) lib/active_record/migration.rb:657:in ‘Thread::Mutex#synchronize’ activerecord (8.1.3) lib/active_record/migration.rb:657:in ‘ActiveRecord::Migration::CheckPending#call’ actionpack (8.1.3) lib/action_dispatch/middleware/callbacks.rb:31:in ‘block in ActionDispatch::Callbacks#call’ activesupport (8.1.3) lib/active_support/callbacks.rb:101:in ‘ActiveSupport::Callbacks#run_callbacks’ actionpack (8.1.3) lib/action_dispatch/middleware/callbacks.rb:30:in ‘ActionDispatch::Callbacks#call’ actionpack (8.1.3) lib/action_dispatch/middleware/executor.rb:20:in ‘ActionDispatch::Executor#call’ actionpack (8.1.3) lib/action_dispatch/middleware/actionable_exceptions.rb:18:in ‘ActionDispatch::ActionableExceptions#call’ actionpack (8.1.3) lib/action_dispatch/middleware/debug_exceptions.rb:31:in ‘ActionDispatch::DebugExceptions#call’ web-console (4.3.0) lib/web_console/middleware.rb:132:in ‘WebConsole::Middleware#call_app’ web-console (4.3.0) lib/web_console/middleware.rb:28:in ‘block in WebConsole::Middleware#call’ web-console (4.3.0) lib/web_console/middleware.rb:17:in ‘Kernel#catch’ web-console (4.3.0) lib/web_console/middleware.rb:17:in ‘WebConsole::Middleware#call’ actionpack (8.1.3) lib/action_dispatch/middleware/show_exceptions.rb:32:in ‘ActionDispatch::ShowExceptions#call’ railties (8.1.3) lib/rails/rack/logger.rb:41:in ‘Rails::Rack::Logger#call_app’ railties (8.1.3) lib/rails/rack/logger.rb:29:in ‘Rails::Rack::Logger#call’ propshaft (1.3.2) lib/propshaft/quiet_assets.rb:11:in ‘Propshaft::QuietAssets#call’ actionpack (8.1.3) lib/action_dispatch/middleware/remote_ip.rb:98:in ‘ActionDispatch::RemoteIp#call’ actionpack (8.1.3) lib/action_dispatch/middleware/request_id.rb:34:in ‘ActionDispatch::RequestId#call’ rack (3.2.6) lib/rack/method_override.rb:28:in ‘Rack::MethodOverride#call’ rack (3.2.6) lib/rack/runtime.rb:24:in ‘Rack::Runtime#call’ activesupport (8.1.3) lib/active_support/cache/strategy/local_cache_middleware.rb:30:in ‘ActiveSupport::Cache::Strategy::LocalCache::Middleware#call’ actionpack (8.1.3) lib/action_dispatch/middleware/server_timing.rb:61:in ‘block in ActionDispatch::ServerTiming#call’ actionpack (8.1.3) lib/action_dispatch/middleware/server_timing.rb:26:in ‘ActionDispatch::ServerTiming::Subscriber#collect_events’ actionpack (8.1.3) lib/action_dispatch/middleware/server_timing.rb:60:in ‘ActionDispatch::ServerTiming#call’ actionpack (8.1.3) lib/action_dispatch/middleware/executor.rb:20:in ‘ActionDispatch::Executor#call’ propshaft (1.3.2) lib/propshaft/server.rb:37:in ‘Propshaft::Server#call’ actionpack (8.1.3) lib/action_dispatch/middleware/static.rb:27:in ‘ActionDispatch::Static#call’ rack (3.2.6) lib/rack/sendfile.rb:131:in ‘Rack::Sendfile#call’ actionpack (8.1.3) lib/action_dispatch/middleware/host_authorization.rb:143:in ‘ActionDispatch::HostAuthorization#call’ railties (8.1.3) lib/rails/engine.rb:534:in ‘Rails::Engine#call’ puma (8.0.1) lib/puma/configuration.rb:305:in ‘Puma::Configuration::ConfigMiddleware#call’ puma (8.0.1) lib/puma/response.rb:79:in ‘block in Puma::Response#handle_request’ puma (8.0.1) lib/puma/thread_pool.rb:434:in ‘Puma::ThreadPool#with_force_shutdown’ puma (8.0.1) lib/puma/response.rb:78:in ‘Puma::Response#handle_request’ puma (8.0.1) lib/puma/server.rb:508:in ‘Puma::Server#process_client’ puma (8.0.1) lib/puma/server.rb:263:in ‘block in Puma::Server#run’ puma (8.0.1) lib/puma/thread_pool.rb:246:in ‘block in Puma::ThreadPool#spawn_thread’ Started GET “/” for ::1 at 2026-05-20 08:33:11 -0300

+ +

ActiveRecord::NoDatabaseError (Database not found: camaar_development. Available database configurations can be found in config/database.yml.

+ +

To resolve this error:

+
  • +

    Create the database by running:

    + +
    bin/rails db:create
    +
  • +

    Verify that config/database.yml contains the correct database name.

    +
+ +

) Caused by: Mysql2::Error (Unknown database ‘camaar_development’)

+ +

Information for: ActiveRecord::NoDatabaseError (Database not found: camaar_development. Available database configurations can be found in config/database.yml.

+ +

To resolve this error:

+
  • +

    Create the database by running:

    + +
    bin/rails db:create
    +
  • +

    Verify that config/database.yml contains the correct database name.

    +
+ +

):

+ +

activerecord (8.1.3) lib/active_record/connection_adapters/mysql2_adapter.rb:30:in ‘ActiveRecord::ConnectionAdapters::Mysql2Adapter.new_client’ activerecord (8.1.3) lib/active_record/connection_adapters/mysql2_adapter.rb:144:in ‘ActiveRecord::ConnectionAdapters::Mysql2Adapter#connect’ activerecord (8.1.3) lib/active_record/connection_adapters/mysql2_adapter.rb:153:in ‘block in ActiveRecord::ConnectionAdapters::Mysql2Adapter#reconnect’ activesupport (8.1.3) lib/active_support/concurrency/null_lock.rb:9:in ‘ActiveSupport::Concurrency::NullLock#synchronize’ activerecord (8.1.3) lib/active_record/connection_adapters/mysql2_adapter.rb:150:in ‘ActiveRecord::ConnectionAdapters::Mysql2Adapter#reconnect’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract_adapter.rb:719:in ‘block (2 levels) in ActiveRecord::ConnectionAdapters::AbstractAdapter#reconnect!’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract_adapter.rb:1290:in ‘ActiveRecord::ConnectionAdapters::AbstractAdapter#attempt_configure_connection’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract_adapter.rb:716:in ‘block in ActiveRecord::ConnectionAdapters::AbstractAdapter#reconnect!’ activesupport (8.1.3) lib/active_support/concurrency/null_lock.rb:9:in ‘ActiveSupport::Concurrency::NullLock#synchronize’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract_adapter.rb:715:in ‘ActiveRecord::ConnectionAdapters::AbstractAdapter#reconnect!’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract_adapter.rb:830:in ‘block in ActiveRecord::ConnectionAdapters::AbstractAdapter#verify!’ activesupport (8.1.3) lib/active_support/concurrency/null_lock.rb:9:in ‘ActiveSupport::Concurrency::NullLock#synchronize’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract_adapter.rb:817:in ‘ActiveRecord::ConnectionAdapters::AbstractAdapter#verify!’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract_adapter.rb:839:in ‘ActiveRecord::ConnectionAdapters::AbstractAdapter#connect!’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract_adapter.rb:1056:in ‘block in ActiveRecord::ConnectionAdapters::AbstractAdapter#with_raw_connection’ activesupport (8.1.3) lib/active_support/concurrency/null_lock.rb:9:in ‘ActiveSupport::Concurrency::NullLock#synchronize’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract_adapter.rb:1055:in ‘ActiveRecord::ConnectionAdapters::AbstractAdapter#with_raw_connection’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract_mysql_adapter.rb:722:in ‘ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter#quote_string’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract/quoting.rb:75:in ‘ActiveRecord::ConnectionAdapters::Quoting#quote’ activerecord (8.1.3) lib/active_record/connection_adapters/mysql/schema_statements.rb:282:in ‘ActiveRecord::ConnectionAdapters::MySQL::SchemaStatements#quoted_scope’ activerecord (8.1.3) lib/active_record/connection_adapters/mysql/schema_statements.rb:264:in ‘ActiveRecord::ConnectionAdapters::MySQL::SchemaStatements#data_source_sql’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract/schema_statements.rb:61:in ‘ActiveRecord::ConnectionAdapters::SchemaStatements#table_exists?’ activerecord (8.1.3) lib/active_record/schema_migration.rb:55:in ‘block in ActiveRecord::SchemaMigration#create_table’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract/connection_pool.rb:463:in ‘ActiveRecord::ConnectionAdapters::ConnectionPool#with_connection’ activerecord (8.1.3) lib/active_record/schema_migration.rb:54:in ‘ActiveRecord::SchemaMigration#create_table’ activerecord (8.1.3) lib/active_record/migration.rb:1440:in ‘ActiveRecord::Migrator#initialize’ activerecord (8.1.3) lib/active_record/migration.rb:1288:in ‘ActiveRecord::MigrationContext#open’ activerecord (8.1.3) lib/active_record/migration.rb:763:in ‘block (2 levels) in ActiveRecord::Migration.pending_migrations’ activerecord (8.1.3) lib/active_record/migration/pending_migration_connection.rb:8:in ‘ActiveRecord::PendingMigrationConnection.with_temporary_pool’ activerecord (8.1.3) lib/active_record/migration.rb:762:in ‘block in ActiveRecord::Migration.pending_migrations’ activerecord (8.1.3) lib/active_record/migration.rb:761:in ‘Array#each’ activerecord (8.1.3) lib/active_record/migration.rb:761:in ‘ActiveRecord::Migration.pending_migrations’ activerecord (8.1.3) lib/active_record/migration.rb:740:in ‘ActiveRecord::Migration.check_pending_migrations’ activerecord (8.1.3) lib/active_record/migration.rb:660:in ‘block (2 levels) in ActiveRecord::Migration::CheckPending#call’ activesupport (8.1.3) lib/active_support/file_update_checker.rb:88:in ‘ActiveSupport::FileUpdateChecker#execute’ activerecord (8.1.3) lib/active_record/migration.rb:665:in ‘block in ActiveRecord::Migration::CheckPending#call’ activerecord (8.1.3) lib/active_record/migration.rb:657:in ‘Thread::Mutex#synchronize’ activerecord (8.1.3) lib/active_record/migration.rb:657:in ‘ActiveRecord::Migration::CheckPending#call’ actionpack (8.1.3) lib/action_dispatch/middleware/callbacks.rb:31:in ‘block in ActionDispatch::Callbacks#call’ activesupport (8.1.3) lib/active_support/callbacks.rb:101:in ‘ActiveSupport::Callbacks#run_callbacks’ actionpack (8.1.3) lib/action_dispatch/middleware/callbacks.rb:30:in ‘ActionDispatch::Callbacks#call’ actionpack (8.1.3) lib/action_dispatch/middleware/executor.rb:20:in ‘ActionDispatch::Executor#call’ actionpack (8.1.3) lib/action_dispatch/middleware/actionable_exceptions.rb:18:in ‘ActionDispatch::ActionableExceptions#call’ actionpack (8.1.3) lib/action_dispatch/middleware/debug_exceptions.rb:31:in ‘ActionDispatch::DebugExceptions#call’ web-console (4.3.0) lib/web_console/middleware.rb:132:in ‘WebConsole::Middleware#call_app’ web-console (4.3.0) lib/web_console/middleware.rb:28:in ‘block in WebConsole::Middleware#call’ web-console (4.3.0) lib/web_console/middleware.rb:17:in ‘Kernel#catch’ web-console (4.3.0) lib/web_console/middleware.rb:17:in ‘WebConsole::Middleware#call’ actionpack (8.1.3) lib/action_dispatch/middleware/show_exceptions.rb:32:in ‘ActionDispatch::ShowExceptions#call’ railties (8.1.3) lib/rails/rack/logger.rb:41:in ‘Rails::Rack::Logger#call_app’ railties (8.1.3) lib/rails/rack/logger.rb:29:in ‘Rails::Rack::Logger#call’ propshaft (1.3.2) lib/propshaft/quiet_assets.rb:11:in ‘Propshaft::QuietAssets#call’ actionpack (8.1.3) lib/action_dispatch/middleware/remote_ip.rb:98:in ‘ActionDispatch::RemoteIp#call’ actionpack (8.1.3) lib/action_dispatch/middleware/request_id.rb:34:in ‘ActionDispatch::RequestId#call’ rack (3.2.6) lib/rack/method_override.rb:28:in ‘Rack::MethodOverride#call’ rack (3.2.6) lib/rack/runtime.rb:24:in ‘Rack::Runtime#call’ activesupport (8.1.3) lib/active_support/cache/strategy/local_cache_middleware.rb:30:in ‘ActiveSupport::Cache::Strategy::LocalCache::Middleware#call’ actionpack (8.1.3) lib/action_dispatch/middleware/server_timing.rb:61:in ‘block in ActionDispatch::ServerTiming#call’ actionpack (8.1.3) lib/action_dispatch/middleware/server_timing.rb:26:in ‘ActionDispatch::ServerTiming::Subscriber#collect_events’ actionpack (8.1.3) lib/action_dispatch/middleware/server_timing.rb:60:in ‘ActionDispatch::ServerTiming#call’ actionpack (8.1.3) lib/action_dispatch/middleware/executor.rb:20:in ‘ActionDispatch::Executor#call’ propshaft (1.3.2) lib/propshaft/server.rb:37:in ‘Propshaft::Server#call’ actionpack (8.1.3) lib/action_dispatch/middleware/static.rb:27:in ‘ActionDispatch::Static#call’ rack (3.2.6) lib/rack/sendfile.rb:131:in ‘Rack::Sendfile#call’ actionpack (8.1.3) lib/action_dispatch/middleware/host_authorization.rb:143:in ‘ActionDispatch::HostAuthorization#call’ railties (8.1.3) lib/rails/engine.rb:534:in ‘Rails::Engine#call’ puma (8.0.1) lib/puma/configuration.rb:305:in ‘Puma::Configuration::ConfigMiddleware#call’ puma (8.0.1) lib/puma/response.rb:79:in ‘block in Puma::Response#handle_request’ puma (8.0.1) lib/puma/thread_pool.rb:434:in ‘Puma::ThreadPool#with_force_shutdown’ puma (8.0.1) lib/puma/response.rb:78:in ‘Puma::Response#handle_request’ puma (8.0.1) lib/puma/server.rb:508:in ‘Puma::Server#process_client’ puma (8.0.1) lib/puma/server.rb:263:in ‘block in Puma::Server#run’ puma (8.0.1) lib/puma/thread_pool.rb:246:in ‘block in Puma::ThreadPool#spawn_thread’

+ +

Information for cause: Mysql2::Error (Unknown database ‘camaar_development’):

+ +

mysql2 (0.5.7) lib/mysql2/client.rb:92:in ‘Mysql2::Client#connect’ mysql2 (0.5.7) lib/mysql2/client.rb:92:in ‘Mysql2::Client#initialize’ activerecord (8.1.3) lib/active_record/connection_adapters/mysql2_adapter.rb:26:in ‘ActiveRecord::ConnectionAdapters::Mysql2Adapter.new_client’ activerecord (8.1.3) lib/active_record/connection_adapters/mysql2_adapter.rb:144:in ‘ActiveRecord::ConnectionAdapters::Mysql2Adapter#connect’ activerecord (8.1.3) lib/active_record/connection_adapters/mysql2_adapter.rb:153:in ‘block in ActiveRecord::ConnectionAdapters::Mysql2Adapter#reconnect’ activesupport (8.1.3) lib/active_support/concurrency/null_lock.rb:9:in ‘ActiveSupport::Concurrency::NullLock#synchronize’ activerecord (8.1.3) lib/active_record/connection_adapters/mysql2_adapter.rb:150:in ‘ActiveRecord::ConnectionAdapters::Mysql2Adapter#reconnect’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract_adapter.rb:719:in ‘block (2 levels) in ActiveRecord::ConnectionAdapters::AbstractAdapter#reconnect!’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract_adapter.rb:1290:in ‘ActiveRecord::ConnectionAdapters::AbstractAdapter#attempt_configure_connection’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract_adapter.rb:716:in ‘block in ActiveRecord::ConnectionAdapters::AbstractAdapter#reconnect!’ activesupport (8.1.3) lib/active_support/concurrency/null_lock.rb:9:in ‘ActiveSupport::Concurrency::NullLock#synchronize’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract_adapter.rb:715:in ‘ActiveRecord::ConnectionAdapters::AbstractAdapter#reconnect!’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract_adapter.rb:830:in ‘block in ActiveRecord::ConnectionAdapters::AbstractAdapter#verify!’ activesupport (8.1.3) lib/active_support/concurrency/null_lock.rb:9:in ‘ActiveSupport::Concurrency::NullLock#synchronize’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract_adapter.rb:817:in ‘ActiveRecord::ConnectionAdapters::AbstractAdapter#verify!’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract_adapter.rb:839:in ‘ActiveRecord::ConnectionAdapters::AbstractAdapter#connect!’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract_adapter.rb:1056:in ‘block in ActiveRecord::ConnectionAdapters::AbstractAdapter#with_raw_connection’ activesupport (8.1.3) lib/active_support/concurrency/null_lock.rb:9:in ‘ActiveSupport::Concurrency::NullLock#synchronize’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract_adapter.rb:1055:in ‘ActiveRecord::ConnectionAdapters::AbstractAdapter#with_raw_connection’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract_mysql_adapter.rb:722:in ‘ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter#quote_string’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract/quoting.rb:75:in ‘ActiveRecord::ConnectionAdapters::Quoting#quote’ activerecord (8.1.3) lib/active_record/connection_adapters/mysql/schema_statements.rb:282:in ‘ActiveRecord::ConnectionAdapters::MySQL::SchemaStatements#quoted_scope’ activerecord (8.1.3) lib/active_record/connection_adapters/mysql/schema_statements.rb:264:in ‘ActiveRecord::ConnectionAdapters::MySQL::SchemaStatements#data_source_sql’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract/schema_statements.rb:61:in ‘ActiveRecord::ConnectionAdapters::SchemaStatements#table_exists?’ activerecord (8.1.3) lib/active_record/schema_migration.rb:55:in ‘block in ActiveRecord::SchemaMigration#create_table’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract/connection_pool.rb:463:in ‘ActiveRecord::ConnectionAdapters::ConnectionPool#with_connection’ activerecord (8.1.3) lib/active_record/schema_migration.rb:54:in ‘ActiveRecord::SchemaMigration#create_table’ activerecord (8.1.3) lib/active_record/migration.rb:1440:in ‘ActiveRecord::Migrator#initialize’ activerecord (8.1.3) lib/active_record/migration.rb:1288:in ‘ActiveRecord::MigrationContext#open’ activerecord (8.1.3) lib/active_record/migration.rb:763:in ‘block (2 levels) in ActiveRecord::Migration.pending_migrations’ activerecord (8.1.3) lib/active_record/migration/pending_migration_connection.rb:8:in ‘ActiveRecord::PendingMigrationConnection.with_temporary_pool’ activerecord (8.1.3) lib/active_record/migration.rb:762:in ‘block in ActiveRecord::Migration.pending_migrations’ activerecord (8.1.3) lib/active_record/migration.rb:761:in ‘Array#each’ activerecord (8.1.3) lib/active_record/migration.rb:761:in ‘ActiveRecord::Migration.pending_migrations’ activerecord (8.1.3) lib/active_record/migration.rb:740:in ‘ActiveRecord::Migration.check_pending_migrations’ activerecord (8.1.3) lib/active_record/migration.rb:660:in ‘block (2 levels) in ActiveRecord::Migration::CheckPending#call’ activesupport (8.1.3) lib/active_support/file_update_checker.rb:88:in ‘ActiveSupport::FileUpdateChecker#execute’ activerecord (8.1.3) lib/active_record/migration.rb:665:in ‘block in ActiveRecord::Migration::CheckPending#call’ activerecord (8.1.3) lib/active_record/migration.rb:657:in ‘Thread::Mutex#synchronize’ activerecord (8.1.3) lib/active_record/migration.rb:657:in ‘ActiveRecord::Migration::CheckPending#call’ actionpack (8.1.3) lib/action_dispatch/middleware/callbacks.rb:31:in ‘block in ActionDispatch::Callbacks#call’ activesupport (8.1.3) lib/active_support/callbacks.rb:101:in ‘ActiveSupport::Callbacks#run_callbacks’ actionpack (8.1.3) lib/action_dispatch/middleware/callbacks.rb:30:in ‘ActionDispatch::Callbacks#call’ actionpack (8.1.3) lib/action_dispatch/middleware/executor.rb:20:in ‘ActionDispatch::Executor#call’ actionpack (8.1.3) lib/action_dispatch/middleware/actionable_exceptions.rb:18:in ‘ActionDispatch::ActionableExceptions#call’ actionpack (8.1.3) lib/action_dispatch/middleware/debug_exceptions.rb:31:in ‘ActionDispatch::DebugExceptions#call’ web-console (4.3.0) lib/web_console/middleware.rb:132:in ‘WebConsole::Middleware#call_app’ web-console (4.3.0) lib/web_console/middleware.rb:28:in ‘block in WebConsole::Middleware#call’ web-console (4.3.0) lib/web_console/middleware.rb:17:in ‘Kernel#catch’ web-console (4.3.0) lib/web_console/middleware.rb:17:in ‘WebConsole::Middleware#call’ actionpack (8.1.3) lib/action_dispatch/middleware/show_exceptions.rb:32:in ‘ActionDispatch::ShowExceptions#call’ railties (8.1.3) lib/rails/rack/logger.rb:41:in ‘Rails::Rack::Logger#call_app’ railties (8.1.3) lib/rails/rack/logger.rb:29:in ‘Rails::Rack::Logger#call’ propshaft (1.3.2) lib/propshaft/quiet_assets.rb:11:in ‘Propshaft::QuietAssets#call’ actionpack (8.1.3) lib/action_dispatch/middleware/remote_ip.rb:98:in ‘ActionDispatch::RemoteIp#call’ actionpack (8.1.3) lib/action_dispatch/middleware/request_id.rb:34:in ‘ActionDispatch::RequestId#call’ rack (3.2.6) lib/rack/method_override.rb:28:in ‘Rack::MethodOverride#call’ rack (3.2.6) lib/rack/runtime.rb:24:in ‘Rack::Runtime#call’ activesupport (8.1.3) lib/active_support/cache/strategy/local_cache_middleware.rb:30:in ‘ActiveSupport::Cache::Strategy::LocalCache::Middleware#call’ actionpack (8.1.3) lib/action_dispatch/middleware/server_timing.rb:61:in ‘block in ActionDispatch::ServerTiming#call’ actionpack (8.1.3) lib/action_dispatch/middleware/server_timing.rb:26:in ‘ActionDispatch::ServerTiming::Subscriber#collect_events’ actionpack (8.1.3) lib/action_dispatch/middleware/server_timing.rb:60:in ‘ActionDispatch::ServerTiming#call’ actionpack (8.1.3) lib/action_dispatch/middleware/executor.rb:20:in ‘ActionDispatch::Executor#call’ propshaft (1.3.2) lib/propshaft/server.rb:37:in ‘Propshaft::Server#call’ actionpack (8.1.3) lib/action_dispatch/middleware/static.rb:27:in ‘ActionDispatch::Static#call’ rack (3.2.6) lib/rack/sendfile.rb:131:in ‘Rack::Sendfile#call’ actionpack (8.1.3) lib/action_dispatch/middleware/host_authorization.rb:143:in ‘ActionDispatch::HostAuthorization#call’ railties (8.1.3) lib/rails/engine.rb:534:in ‘Rails::Engine#call’ puma (8.0.1) lib/puma/configuration.rb:305:in ‘Puma::Configuration::ConfigMiddleware#call’ puma (8.0.1) lib/puma/response.rb:79:in ‘block in Puma::Response#handle_request’ puma (8.0.1) lib/puma/thread_pool.rb:434:in ‘Puma::ThreadPool#with_force_shutdown’ puma (8.0.1) lib/puma/response.rb:78:in ‘Puma::Response#handle_request’ puma (8.0.1) lib/puma/server.rb:508:in ‘Puma::Server#process_client’ puma (8.0.1) lib/puma/server.rb:263:in ‘block in Puma::Server#run’ puma (8.0.1) lib/puma/thread_pool.rb:246:in ‘block in Puma::ThreadPool#spawn_thread’ Started GET “/favicon.ico” for ::1 at 2026-05-20 08:33:11 -0300

+ +

ActiveRecord::NoDatabaseError (Database not found: camaar_development. Available database configurations can be found in config/database.yml.

+ +

To resolve this error:

+
  • +

    Create the database by running:

    + +
    bin/rails db:create
    +
  • +

    Verify that config/database.yml contains the correct database name.

    +
+ +

) Caused by: Mysql2::Error (Unknown database ‘camaar_development’)

+ +

Information for: ActiveRecord::NoDatabaseError (Database not found: camaar_development. Available database configurations can be found in config/database.yml.

+ +

To resolve this error:

+
  • +

    Create the database by running:

    + +
    bin/rails db:create
    +
  • +

    Verify that config/database.yml contains the correct database name.

    +
+ +

):

+ +

activerecord (8.1.3) lib/active_record/connection_adapters/mysql2_adapter.rb:30:in ‘ActiveRecord::ConnectionAdapters::Mysql2Adapter.new_client’ activerecord (8.1.3) lib/active_record/connection_adapters/mysql2_adapter.rb:144:in ‘ActiveRecord::ConnectionAdapters::Mysql2Adapter#connect’ activerecord (8.1.3) lib/active_record/connection_adapters/mysql2_adapter.rb:153:in ‘block in ActiveRecord::ConnectionAdapters::Mysql2Adapter#reconnect’ activesupport (8.1.3) lib/active_support/concurrency/null_lock.rb:9:in ‘ActiveSupport::Concurrency::NullLock#synchronize’ activerecord (8.1.3) lib/active_record/connection_adapters/mysql2_adapter.rb:150:in ‘ActiveRecord::ConnectionAdapters::Mysql2Adapter#reconnect’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract_adapter.rb:719:in ‘block (2 levels) in ActiveRecord::ConnectionAdapters::AbstractAdapter#reconnect!’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract_adapter.rb:1290:in ‘ActiveRecord::ConnectionAdapters::AbstractAdapter#attempt_configure_connection’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract_adapter.rb:716:in ‘block in ActiveRecord::ConnectionAdapters::AbstractAdapter#reconnect!’ activesupport (8.1.3) lib/active_support/concurrency/null_lock.rb:9:in ‘ActiveSupport::Concurrency::NullLock#synchronize’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract_adapter.rb:715:in ‘ActiveRecord::ConnectionAdapters::AbstractAdapter#reconnect!’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract_adapter.rb:830:in ‘block in ActiveRecord::ConnectionAdapters::AbstractAdapter#verify!’ activesupport (8.1.3) lib/active_support/concurrency/null_lock.rb:9:in ‘ActiveSupport::Concurrency::NullLock#synchronize’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract_adapter.rb:817:in ‘ActiveRecord::ConnectionAdapters::AbstractAdapter#verify!’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract_adapter.rb:839:in ‘ActiveRecord::ConnectionAdapters::AbstractAdapter#connect!’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract_adapter.rb:1056:in ‘block in ActiveRecord::ConnectionAdapters::AbstractAdapter#with_raw_connection’ activesupport (8.1.3) lib/active_support/concurrency/null_lock.rb:9:in ‘ActiveSupport::Concurrency::NullLock#synchronize’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract_adapter.rb:1055:in ‘ActiveRecord::ConnectionAdapters::AbstractAdapter#with_raw_connection’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract_mysql_adapter.rb:722:in ‘ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter#quote_string’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract/quoting.rb:75:in ‘ActiveRecord::ConnectionAdapters::Quoting#quote’ activerecord (8.1.3) lib/active_record/connection_adapters/mysql/schema_statements.rb:282:in ‘ActiveRecord::ConnectionAdapters::MySQL::SchemaStatements#quoted_scope’ activerecord (8.1.3) lib/active_record/connection_adapters/mysql/schema_statements.rb:264:in ‘ActiveRecord::ConnectionAdapters::MySQL::SchemaStatements#data_source_sql’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract/schema_statements.rb:61:in ‘ActiveRecord::ConnectionAdapters::SchemaStatements#table_exists?’ activerecord (8.1.3) lib/active_record/schema_migration.rb:55:in ‘block in ActiveRecord::SchemaMigration#create_table’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract/connection_pool.rb:463:in ‘ActiveRecord::ConnectionAdapters::ConnectionPool#with_connection’ activerecord (8.1.3) lib/active_record/schema_migration.rb:54:in ‘ActiveRecord::SchemaMigration#create_table’ activerecord (8.1.3) lib/active_record/migration.rb:1440:in ‘ActiveRecord::Migrator#initialize’ activerecord (8.1.3) lib/active_record/migration.rb:1288:in ‘ActiveRecord::MigrationContext#open’ activerecord (8.1.3) lib/active_record/migration.rb:763:in ‘block (2 levels) in ActiveRecord::Migration.pending_migrations’ activerecord (8.1.3) lib/active_record/migration/pending_migration_connection.rb:8:in ‘ActiveRecord::PendingMigrationConnection.with_temporary_pool’ activerecord (8.1.3) lib/active_record/migration.rb:762:in ‘block in ActiveRecord::Migration.pending_migrations’ activerecord (8.1.3) lib/active_record/migration.rb:761:in ‘Array#each’ activerecord (8.1.3) lib/active_record/migration.rb:761:in ‘ActiveRecord::Migration.pending_migrations’ activerecord (8.1.3) lib/active_record/migration.rb:740:in ‘ActiveRecord::Migration.check_pending_migrations’ activerecord (8.1.3) lib/active_record/migration.rb:660:in ‘block (2 levels) in ActiveRecord::Migration::CheckPending#call’ activesupport (8.1.3) lib/active_support/file_update_checker.rb:88:in ‘ActiveSupport::FileUpdateChecker#execute’ activerecord (8.1.3) lib/active_record/migration.rb:665:in ‘block in ActiveRecord::Migration::CheckPending#call’ activerecord (8.1.3) lib/active_record/migration.rb:657:in ‘Thread::Mutex#synchronize’ activerecord (8.1.3) lib/active_record/migration.rb:657:in ‘ActiveRecord::Migration::CheckPending#call’ actionpack (8.1.3) lib/action_dispatch/middleware/callbacks.rb:31:in ‘block in ActionDispatch::Callbacks#call’ activesupport (8.1.3) lib/active_support/callbacks.rb:101:in ‘ActiveSupport::Callbacks#run_callbacks’ actionpack (8.1.3) lib/action_dispatch/middleware/callbacks.rb:30:in ‘ActionDispatch::Callbacks#call’ actionpack (8.1.3) lib/action_dispatch/middleware/executor.rb:20:in ‘ActionDispatch::Executor#call’ actionpack (8.1.3) lib/action_dispatch/middleware/actionable_exceptions.rb:18:in ‘ActionDispatch::ActionableExceptions#call’ actionpack (8.1.3) lib/action_dispatch/middleware/debug_exceptions.rb:31:in ‘ActionDispatch::DebugExceptions#call’ web-console (4.3.0) lib/web_console/middleware.rb:132:in ‘WebConsole::Middleware#call_app’ web-console (4.3.0) lib/web_console/middleware.rb:28:in ‘block in WebConsole::Middleware#call’ web-console (4.3.0) lib/web_console/middleware.rb:17:in ‘Kernel#catch’ web-console (4.3.0) lib/web_console/middleware.rb:17:in ‘WebConsole::Middleware#call’ actionpack (8.1.3) lib/action_dispatch/middleware/show_exceptions.rb:32:in ‘ActionDispatch::ShowExceptions#call’ railties (8.1.3) lib/rails/rack/logger.rb:41:in ‘Rails::Rack::Logger#call_app’ railties (8.1.3) lib/rails/rack/logger.rb:29:in ‘Rails::Rack::Logger#call’ propshaft (1.3.2) lib/propshaft/quiet_assets.rb:11:in ‘Propshaft::QuietAssets#call’ actionpack (8.1.3) lib/action_dispatch/middleware/remote_ip.rb:98:in ‘ActionDispatch::RemoteIp#call’ actionpack (8.1.3) lib/action_dispatch/middleware/request_id.rb:34:in ‘ActionDispatch::RequestId#call’ rack (3.2.6) lib/rack/method_override.rb:28:in ‘Rack::MethodOverride#call’ rack (3.2.6) lib/rack/runtime.rb:24:in ‘Rack::Runtime#call’ activesupport (8.1.3) lib/active_support/cache/strategy/local_cache_middleware.rb:30:in ‘ActiveSupport::Cache::Strategy::LocalCache::Middleware#call’ actionpack (8.1.3) lib/action_dispatch/middleware/server_timing.rb:61:in ‘block in ActionDispatch::ServerTiming#call’ actionpack (8.1.3) lib/action_dispatch/middleware/server_timing.rb:26:in ‘ActionDispatch::ServerTiming::Subscriber#collect_events’ actionpack (8.1.3) lib/action_dispatch/middleware/server_timing.rb:60:in ‘ActionDispatch::ServerTiming#call’ actionpack (8.1.3) lib/action_dispatch/middleware/executor.rb:20:in ‘ActionDispatch::Executor#call’ propshaft (1.3.2) lib/propshaft/server.rb:37:in ‘Propshaft::Server#call’ actionpack (8.1.3) lib/action_dispatch/middleware/static.rb:27:in ‘ActionDispatch::Static#call’ rack (3.2.6) lib/rack/sendfile.rb:131:in ‘Rack::Sendfile#call’ actionpack (8.1.3) lib/action_dispatch/middleware/host_authorization.rb:143:in ‘ActionDispatch::HostAuthorization#call’ railties (8.1.3) lib/rails/engine.rb:534:in ‘Rails::Engine#call’ puma (8.0.1) lib/puma/configuration.rb:305:in ‘Puma::Configuration::ConfigMiddleware#call’ puma (8.0.1) lib/puma/response.rb:79:in ‘block in Puma::Response#handle_request’ puma (8.0.1) lib/puma/thread_pool.rb:434:in ‘Puma::ThreadPool#with_force_shutdown’ puma (8.0.1) lib/puma/response.rb:78:in ‘Puma::Response#handle_request’ puma (8.0.1) lib/puma/server.rb:508:in ‘Puma::Server#process_client’ puma (8.0.1) lib/puma/server.rb:263:in ‘block in Puma::Server#run’ puma (8.0.1) lib/puma/thread_pool.rb:246:in ‘block in Puma::ThreadPool#spawn_thread’

+ +

Information for cause: Mysql2::Error (Unknown database ‘camaar_development’):

+ +

mysql2 (0.5.7) lib/mysql2/client.rb:92:in ‘Mysql2::Client#connect’ mysql2 (0.5.7) lib/mysql2/client.rb:92:in ‘Mysql2::Client#initialize’ activerecord (8.1.3) lib/active_record/connection_adapters/mysql2_adapter.rb:26:in ‘ActiveRecord::ConnectionAdapters::Mysql2Adapter.new_client’ activerecord (8.1.3) lib/active_record/connection_adapters/mysql2_adapter.rb:144:in ‘ActiveRecord::ConnectionAdapters::Mysql2Adapter#connect’ activerecord (8.1.3) lib/active_record/connection_adapters/mysql2_adapter.rb:153:in ‘block in ActiveRecord::ConnectionAdapters::Mysql2Adapter#reconnect’ activesupport (8.1.3) lib/active_support/concurrency/null_lock.rb:9:in ‘ActiveSupport::Concurrency::NullLock#synchronize’ activerecord (8.1.3) lib/active_record/connection_adapters/mysql2_adapter.rb:150:in ‘ActiveRecord::ConnectionAdapters::Mysql2Adapter#reconnect’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract_adapter.rb:719:in ‘block (2 levels) in ActiveRecord::ConnectionAdapters::AbstractAdapter#reconnect!’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract_adapter.rb:1290:in ‘ActiveRecord::ConnectionAdapters::AbstractAdapter#attempt_configure_connection’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract_adapter.rb:716:in ‘block in ActiveRecord::ConnectionAdapters::AbstractAdapter#reconnect!’ activesupport (8.1.3) lib/active_support/concurrency/null_lock.rb:9:in ‘ActiveSupport::Concurrency::NullLock#synchronize’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract_adapter.rb:715:in ‘ActiveRecord::ConnectionAdapters::AbstractAdapter#reconnect!’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract_adapter.rb:830:in ‘block in ActiveRecord::ConnectionAdapters::AbstractAdapter#verify!’ activesupport (8.1.3) lib/active_support/concurrency/null_lock.rb:9:in ‘ActiveSupport::Concurrency::NullLock#synchronize’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract_adapter.rb:817:in ‘ActiveRecord::ConnectionAdapters::AbstractAdapter#verify!’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract_adapter.rb:839:in ‘ActiveRecord::ConnectionAdapters::AbstractAdapter#connect!’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract_adapter.rb:1056:in ‘block in ActiveRecord::ConnectionAdapters::AbstractAdapter#with_raw_connection’ activesupport (8.1.3) lib/active_support/concurrency/null_lock.rb:9:in ‘ActiveSupport::Concurrency::NullLock#synchronize’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract_adapter.rb:1055:in ‘ActiveRecord::ConnectionAdapters::AbstractAdapter#with_raw_connection’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract_mysql_adapter.rb:722:in ‘ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter#quote_string’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract/quoting.rb:75:in ‘ActiveRecord::ConnectionAdapters::Quoting#quote’ activerecord (8.1.3) lib/active_record/connection_adapters/mysql/schema_statements.rb:282:in ‘ActiveRecord::ConnectionAdapters::MySQL::SchemaStatements#quoted_scope’ activerecord (8.1.3) lib/active_record/connection_adapters/mysql/schema_statements.rb:264:in ‘ActiveRecord::ConnectionAdapters::MySQL::SchemaStatements#data_source_sql’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract/schema_statements.rb:61:in ‘ActiveRecord::ConnectionAdapters::SchemaStatements#table_exists?’ activerecord (8.1.3) lib/active_record/schema_migration.rb:55:in ‘block in ActiveRecord::SchemaMigration#create_table’ activerecord (8.1.3) lib/active_record/connection_adapters/abstract/connection_pool.rb:463:in ‘ActiveRecord::ConnectionAdapters::ConnectionPool#with_connection’ activerecord (8.1.3) lib/active_record/schema_migration.rb:54:in ‘ActiveRecord::SchemaMigration#create_table’ activerecord (8.1.3) lib/active_record/migration.rb:1440:in ‘ActiveRecord::Migrator#initialize’ activerecord (8.1.3) lib/active_record/migration.rb:1288:in ‘ActiveRecord::MigrationContext#open’ activerecord (8.1.3) lib/active_record/migration.rb:763:in ‘block (2 levels) in ActiveRecord::Migration.pending_migrations’ activerecord (8.1.3) lib/active_record/migration/pending_migration_connection.rb:8:in ‘ActiveRecord::PendingMigrationConnection.with_temporary_pool’ activerecord (8.1.3) lib/active_record/migration.rb:762:in ‘block in ActiveRecord::Migration.pending_migrations’ activerecord (8.1.3) lib/active_record/migration.rb:761:in ‘Array#each’ activerecord (8.1.3) lib/active_record/migration.rb:761:in ‘ActiveRecord::Migration.pending_migrations’ activerecord (8.1.3) lib/active_record/migration.rb:740:in ‘ActiveRecord::Migration.check_pending_migrations’ activerecord (8.1.3) lib/active_record/migration.rb:660:in ‘block (2 levels) in ActiveRecord::Migration::CheckPending#call’ activesupport (8.1.3) lib/active_support/file_update_checker.rb:88:in ‘ActiveSupport::FileUpdateChecker#execute’ activerecord (8.1.3) lib/active_record/migration.rb:665:in ‘block in ActiveRecord::Migration::CheckPending#call’ activerecord (8.1.3) lib/active_record/migration.rb:657:in ‘Thread::Mutex#synchronize’ activerecord (8.1.3) lib/active_record/migration.rb:657:in ‘ActiveRecord::Migration::CheckPending#call’ actionpack (8.1.3) lib/action_dispatch/middleware/callbacks.rb:31:in ‘block in ActionDispatch::Callbacks#call’ activesupport (8.1.3) lib/active_support/callbacks.rb:101:in ‘ActiveSupport::Callbacks#run_callbacks’ actionpack (8.1.3) lib/action_dispatch/middleware/callbacks.rb:30:in ‘ActionDispatch::Callbacks#call’ actionpack (8.1.3) lib/action_dispatch/middleware/executor.rb:20:in ‘ActionDispatch::Executor#call’ actionpack (8.1.3) lib/action_dispatch/middleware/actionable_exceptions.rb:18:in ‘ActionDispatch::ActionableExceptions#call’ actionpack (8.1.3) lib/action_dispatch/middleware/debug_exceptions.rb:31:in ‘ActionDispatch::DebugExceptions#call’ web-console (4.3.0) lib/web_console/middleware.rb:132:in ‘WebConsole::Middleware#call_app’ web-console (4.3.0) lib/web_console/middleware.rb:28:in ‘block in WebConsole::Middleware#call’ web-console (4.3.0) lib/web_console/middleware.rb:17:in ‘Kernel#catch’ web-console (4.3.0) lib/web_console/middleware.rb:17:in ‘WebConsole::Middleware#call’ actionpack (8.1.3) lib/action_dispatch/middleware/show_exceptions.rb:32:in ‘ActionDispatch::ShowExceptions#call’ railties (8.1.3) lib/rails/rack/logger.rb:41:in ‘Rails::Rack::Logger#call_app’ railties (8.1.3) lib/rails/rack/logger.rb:29:in ‘Rails::Rack::Logger#call’ propshaft (1.3.2) lib/propshaft/quiet_assets.rb:11:in ‘Propshaft::QuietAssets#call’ actionpack (8.1.3) lib/action_dispatch/middleware/remote_ip.rb:98:in ‘ActionDispatch::RemoteIp#call’ actionpack (8.1.3) lib/action_dispatch/middleware/request_id.rb:34:in ‘ActionDispatch::RequestId#call’ rack (3.2.6) lib/rack/method_override.rb:28:in ‘Rack::MethodOverride#call’ rack (3.2.6) lib/rack/runtime.rb:24:in ‘Rack::Runtime#call’ activesupport (8.1.3) lib/active_support/cache/strategy/local_cache_middleware.rb:30:in ‘ActiveSupport::Cache::Strategy::LocalCache::Middleware#call’ actionpack (8.1.3) lib/action_dispatch/middleware/server_timing.rb:61:in ‘block in ActionDispatch::ServerTiming#call’ actionpack (8.1.3) lib/action_dispatch/middleware/server_timing.rb:26:in ‘ActionDispatch::ServerTiming::Subscriber#collect_events’ actionpack (8.1.3) lib/action_dispatch/middleware/server_timing.rb:60:in ‘ActionDispatch::ServerTiming#call’ actionpack (8.1.3) lib/action_dispatch/middleware/executor.rb:20:in ‘ActionDispatch::Executor#call’ propshaft (1.3.2) lib/propshaft/server.rb:37:in ‘Propshaft::Server#call’ actionpack (8.1.3) lib/action_dispatch/middleware/static.rb:27:in ‘ActionDispatch::Static#call’ rack (3.2.6) lib/rack/sendfile.rb:131:in ‘Rack::Sendfile#call’ actionpack (8.1.3) lib/action_dispatch/middleware/host_authorization.rb:143:in ‘ActionDispatch::HostAuthorization#call’ railties (8.1.3) lib/rails/engine.rb:534:in ‘Rails::Engine#call’ puma (8.0.1) lib/puma/configuration.rb:305:in ‘Puma::Configuration::ConfigMiddleware#call’ puma (8.0.1) lib/puma/response.rb:79:in ‘block in Puma::Response#handle_request’ puma (8.0.1) lib/puma/thread_pool.rb:434:in ‘Puma::ThreadPool#with_force_shutdown’ puma (8.0.1) lib/puma/response.rb:78:in ‘Puma::Response#handle_request’ puma (8.0.1) lib/puma/server.rb:508:in ‘Puma::Server#process_client’ puma (8.0.1) lib/puma/server.rb:263:in ‘block in Puma::Server#run’ puma (8.0.1) lib/puma/thread_pool.rb:246:in ‘block in Puma::ThreadPool#spawn_thread’ Started POST “/rails/actions” for ::1 at 2026-05-20 08:33:16 -0300

+ +
 (9.4ms)  CREATE DATABASE `camaar_development` DEFAULT CHARACTER SET `utf8mb4` /*application='Camaar'*/
+ (3.1ms)  CREATE DATABASE `camaar_test` DEFAULT CHARACTER SET `utf8mb4` /*application='Camaar'*/
+ +

Started GET “/” for ::1 at 2026-05-20 08:33:16 -0300

+ +
 (7.0ms)  CREATE TABLE `schema_migrations` (`version` varchar(255) NOT NULL PRIMARY KEY) /*application='Camaar'*/
+ (6.1ms)  CREATE TABLE `ar_internal_metadata` (`key` varchar(255) NOT NULL PRIMARY KEY, `value` varchar(255), `created_at` datetime(6) NOT NULL, `updated_at` datetime(6) NOT NULL) /*application='Camaar'*/
+ActiveRecord::SchemaMigration Load (1.7ms)  SELECT `schema_migrations`.`version` FROM `schema_migrations` ORDER BY `schema_migrations`.`version` ASC /*application='Camaar'*/
+ +

Processing by Rails::WelcomeController#index as HTML

+ +
Rendering /Users/elvismirandajunior/.rbenv/versions/4.0.2/lib/ruby/gems/4.0.0/gems/railties-8.1.3/lib/rails/templates/rails/welcome/index.html.erb
+Rendered /Users/elvismirandajunior/.rbenv/versions/4.0.2/lib/ruby/gems/4.0.0/gems/railties-8.1.3/lib/rails/templates/rails/welcome/index.html.erb (Duration: 0.2ms | GC: 0.0ms)
+ +

Completed 200 OK in 4ms (Views: 0.6ms | ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 0.0ms)

+ +
ActiveRecord::SchemaMigration Load (3.6ms)  SELECT `schema_migrations`.`version` FROM `schema_migrations` ORDER BY `schema_migrations`.`version` ASC /*application='Camaar'*/
+ActiveRecord::InternalMetadata Load (1.8ms)  SELECT * FROM `ar_internal_metadata` WHERE `ar_internal_metadata`.`key` = 'environment' ORDER BY `ar_internal_metadata`.`key` ASC LIMIT 1 /*application='Camaar'*/
+ActiveRecord::SchemaMigration Load (0.2ms)  SELECT `schema_migrations`.`version` FROM `schema_migrations` ORDER BY `schema_migrations`.`version` ASC /*application='Camaar'*/
+ActiveRecord::InternalMetadata Load (0.2ms)  SELECT * FROM `ar_internal_metadata` WHERE `ar_internal_metadata`.`key` = 'environment' ORDER BY `ar_internal_metadata`.`key` ASC LIMIT 1 /*application='Camaar'*/
+ActiveRecord::SchemaMigration Load (0.2ms)  SELECT `schema_migrations`.`version` FROM `schema_migrations` ORDER BY `schema_migrations`.`version` ASC /*application='Camaar'*/
+ActiveRecord::InternalMetadata Load (0.2ms)  SELECT * FROM `ar_internal_metadata` WHERE `ar_internal_metadata`.`key` = 'environment' ORDER BY `ar_internal_metadata`.`key` ASC LIMIT 1 /*application='Camaar'*/
+ (50.0ms)  DROP DATABASE IF EXISTS `camaar_development` /*application='Camaar'*/
+ (39.7ms)  DROP DATABASE IF EXISTS `camaar_test` /*application='Camaar'*/
+ (9.5ms)  CREATE DATABASE `camaar_development` DEFAULT CHARACTER SET `utf8mb4` /*application='Camaar'*/
+ (10.7ms)  CREATE DATABASE `camaar_test` DEFAULT CHARACTER SET `utf8mb4` /*application='Camaar'*/
+ (0.6ms)  DROP TABLE IF EXISTS `campo_forms` CASCADE /*application='Camaar'*/
+ (2.9ms)  CREATE TABLE `campo_forms` (`id` bigint NOT NULL AUTO_INCREMENT PRIMARY KEY, `created_at` datetime(6) NOT NULL, `elemento_form_id` bigint NOT NULL, `enunciado` varchar(255), `ordem` int, `tipo_elemento` varchar(255), `updated_at` datetime(6) NOT NULL, INDEX `index_campo_forms_on_elemento_form_id` (`elemento_form_id`)) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci /*application='Camaar'*/
+ (0.3ms)  DROP TABLE IF EXISTS `campos` CASCADE /*application='Camaar'*/
+ (1.7ms)  CREATE TABLE `campos` (`id` bigint NOT NULL AUTO_INCREMENT PRIMARY KEY, `created_at` datetime(6) NOT NULL, `elemento_id` bigint NOT NULL, `enunciado` varchar(255), `ordem` int, `tipo_elemento` varchar(255), `updated_at` datetime(6) NOT NULL, INDEX `index_campos_on_elemento_id` (`elemento_id`)) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci /*application='Camaar'*/
+ (0.3ms)  DROP TABLE IF EXISTS `cursos` CASCADE /*application='Camaar'*/
+ (3.0ms)  CREATE TABLE `cursos` (`id` bigint NOT NULL AUTO_INCREMENT PRIMARY KEY, `codigo` varchar(255), `created_at` datetime(6) NOT NULL, `departamento_id` bigint NOT NULL, `nome` varchar(255), `updated_at` datetime(6) NOT NULL, UNIQUE INDEX `index_cursos_on_codigo` (`codigo`), INDEX `index_cursos_on_departamento_id` (`departamento_id`)) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci /*application='Camaar'*/
+ (0.3ms)  DROP TABLE IF EXISTS `departamentos` CASCADE /*application='Camaar'*/
+ (1.5ms)  CREATE TABLE `departamentos` (`id` bigint NOT NULL AUTO_INCREMENT PRIMARY KEY, `codigo` varchar(255), `created_at` datetime(6) NOT NULL, `nome` varchar(255), `updated_at` datetime(6) NOT NULL, UNIQUE INDEX `index_departamentos_on_codigo` (`codigo`)) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci /*application='Camaar'*/
+ (0.3ms)  DROP TABLE IF EXISTS `discentes_turmas` CASCADE /*application='Camaar'*/
+ (1.5ms)  CREATE TABLE `discentes_turmas` (`discente_id` bigint NOT NULL, `turma_id` bigint NOT NULL) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci /*application='Camaar'*/
+ (0.3ms)  DROP TABLE IF EXISTS `disciplinas` CASCADE /*application='Camaar'*/
+ (2.4ms)  CREATE TABLE `disciplinas` (`id` bigint NOT NULL AUTO_INCREMENT PRIMARY KEY, `codigo` varchar(255), `created_at` datetime(6) NOT NULL, `departamento_id` bigint NOT NULL, `nome` varchar(255), `updated_at` datetime(6) NOT NULL, UNIQUE INDEX `index_disciplinas_on_codigo` (`codigo`), INDEX `index_disciplinas_on_departamento_id` (`departamento_id`)) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci /*application='Camaar'*/
+ (0.2ms)  DROP TABLE IF EXISTS `docentes_turmas` CASCADE /*application='Camaar'*/
+ (1.4ms)  CREATE TABLE `docentes_turmas` (`docente_id` bigint NOT NULL, `turma_id` bigint NOT NULL) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci /*application='Camaar'*/
+ (0.2ms)  DROP TABLE IF EXISTS `elemento_forms` CASCADE /*application='Camaar'*/
+ (2.0ms)  CREATE TABLE `elemento_forms` (`id` bigint NOT NULL AUTO_INCREMENT PRIMARY KEY, `created_at` datetime(6) NOT NULL, `enunciado` varchar(255), `formulario_id` bigint NOT NULL, `ordem` int, `tipo` varchar(255), `updated_at` datetime(6) NOT NULL, INDEX `index_elemento_forms_on_formulario_id` (`formulario_id`)) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci /*application='Camaar'*/
+ (0.2ms)  DROP TABLE IF EXISTS `elementos` CASCADE /*application='Camaar'*/
+ (1.7ms)  CREATE TABLE `elementos` (`id` bigint NOT NULL AUTO_INCREMENT PRIMARY KEY, `created_at` datetime(6) NOT NULL, `enunciado` varchar(255), `ordem` int, `template_id` bigint NOT NULL, `updated_at` datetime(6) NOT NULL, INDEX `index_elementos_on_template_id` (`template_id`)) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci /*application='Camaar'*/
+ (0.2ms)  DROP TABLE IF EXISTS `formularios` CASCADE /*application='Camaar'*/
+ (1.6ms)  CREATE TABLE `formularios` (`id` bigint NOT NULL AUTO_INCREMENT PRIMARY KEY, `created_at` datetime(6) NOT NULL, `data_fim` date, `data_inicio` date, `nome` varchar(255), `titulo` varchar(255), `turma_id` bigint, `updated_at` datetime(6) NOT NULL, INDEX `index_formularios_on_turma_id` (`turma_id`)) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci /*application='Camaar'*/
+ (0.3ms)  DROP TABLE IF EXISTS `resposta_elems` CASCADE /*application='Camaar'*/
+ (2.8ms)  CREATE TABLE `resposta_elems` (`id` bigint NOT NULL AUTO_INCREMENT PRIMARY KEY, `campo_form_id` bigint, `created_at` datetime(6) NOT NULL, `elemento_form_id` bigint NOT NULL, `resposta_form_id` bigint NOT NULL, `texto_resposta` text, `updated_at` datetime(6) NOT NULL, INDEX `index_resposta_elems_on_campo_form_id` (`campo_form_id`), INDEX `index_resposta_elems_on_elemento_form_id` (`elemento_form_id`), INDEX `index_resposta_elems_on_resposta_form_id` (`resposta_form_id`)) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci /*application='Camaar'*/
+ (0.2ms)  DROP TABLE IF EXISTS `resposta_forms` CASCADE /*application='Camaar'*/
+ (2.2ms)  CREATE TABLE `resposta_forms` (`id` bigint NOT NULL AUTO_INCREMENT PRIMARY KEY, `created_at` datetime(6) NOT NULL, `data_submissao` date, `formulario_id` bigint NOT NULL, `updated_at` datetime(6) NOT NULL, `usuario_id` bigint NOT NULL, INDEX `index_resposta_forms_on_formulario_id` (`formulario_id`), INDEX `index_resposta_forms_on_usuario_id` (`usuario_id`)) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci /*application='Camaar'*/
+ (0.3ms)  DROP TABLE IF EXISTS `templates` CASCADE /*application='Camaar'*/
+ (1.5ms)  CREATE TABLE `templates` (`id` bigint NOT NULL AUTO_INCREMENT PRIMARY KEY, `created_at` datetime(6) NOT NULL, `nome` varchar(255), `updated_at` datetime(6) NOT NULL, `usuario_id` bigint NOT NULL, INDEX `index_templates_on_usuario_id` (`usuario_id`)) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci /*application='Camaar'*/
+ (0.3ms)  DROP TABLE IF EXISTS `turmas` CASCADE /*application='Camaar'*/
+ (2.5ms)  CREATE TABLE `turmas` (`id` bigint NOT NULL AUTO_INCREMENT PRIMARY KEY, `created_at` datetime(6) NOT NULL, `disciplina_id` bigint NOT NULL, `horario` varchar(255), `numero_da_turma` varchar(255), `semestre` varchar(255), `updated_at` datetime(6) NOT NULL, INDEX `index_turmas_on_disciplina_id` (`disciplina_id`)) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci /*application='Camaar'*/
+ (0.3ms)  DROP TABLE IF EXISTS `usuarios` CASCADE /*application='Camaar'*/
+ (3.8ms)  CREATE TABLE `usuarios` (`id` bigint NOT NULL AUTO_INCREMENT PRIMARY KEY, `created_at` datetime(6) NOT NULL, `curso_id` bigint, `definicao_senha_sent_at` datetime(6), `definicao_senha_token` varchar(255), `departamento_id` bigint, `email` varchar(255), `formacao` varchar(255), `matricula` varchar(255), `nome` varchar(255), `redefinicao_senha_sent_at` datetime(6), `redefinicao_senha_token` varchar(255), `senha_hash` varchar(255), `type` varchar(255), `updated_at` datetime(6) NOT NULL, INDEX `index_usuarios_on_curso_id` (`curso_id`), UNIQUE INDEX `index_usuarios_on_definicao_senha_token` (`definicao_senha_token`), INDEX `index_usuarios_on_departamento_id` (`departamento_id`), UNIQUE INDEX `index_usuarios_on_matricula` (`matricula`), UNIQUE INDEX `index_usuarios_on_redefinicao_senha_token` (`redefinicao_senha_token`)) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci /*application='Camaar'*/
+ (7.0ms)  ALTER TABLE `campo_forms` ADD CONSTRAINT `fk_rails_60e170cc42`
+ +

FOREIGN KEY (elemento_form_id)

+ +
 REFERENCES `elemento_forms` (`id`)
+/*application='Camaar'*/
+  (7.7ms)  ALTER TABLE `campos` ADD CONSTRAINT `fk_rails_093ff779d5`
+ +

FOREIGN KEY (elemento_id)

+ +
 REFERENCES `elementos` (`id`)
+/*application='Camaar'*/
+  (7.8ms)  ALTER TABLE `cursos` ADD CONSTRAINT `fk_rails_46092b12ee`
+ +

FOREIGN KEY (departamento_id)

+ +
 REFERENCES `departamentos` (`id`)
+/*application='Camaar'*/
+  (8.7ms)  ALTER TABLE `disciplinas` ADD CONSTRAINT `fk_rails_a98996a2d4`
+ +

FOREIGN KEY (departamento_id)

+ +
 REFERENCES `departamentos` (`id`)
+/*application='Camaar'*/
+  (8.6ms)  ALTER TABLE `elemento_forms` ADD CONSTRAINT `fk_rails_ce2bb731de`
+ +

FOREIGN KEY (formulario_id)

+ +
 REFERENCES `formularios` (`id`)
+/*application='Camaar'*/
+  (8.0ms)  ALTER TABLE `elementos` ADD CONSTRAINT `fk_rails_09f770d3fe`
+ +

FOREIGN KEY (template_id)

+ +
 REFERENCES `templates` (`id`)
+/*application='Camaar'*/
+  (10.9ms)  ALTER TABLE `formularios` ADD CONSTRAINT `fk_rails_5a2be0c3c1`
+ +

FOREIGN KEY (turma_id)

+ +
 REFERENCES `turmas` (`id`)
+/*application='Camaar'*/
+  (9.5ms)  ALTER TABLE `resposta_elems` ADD CONSTRAINT `fk_rails_ecb8874f2e`
+ +

FOREIGN KEY (campo_form_id)

+ +
 REFERENCES `campo_forms` (`id`)
+/*application='Camaar'*/
+  (10.7ms)  ALTER TABLE `resposta_elems` ADD CONSTRAINT `fk_rails_ea4cd9531e`
+ +

FOREIGN KEY (elemento_form_id)

+ +
 REFERENCES `elemento_forms` (`id`)
+/*application='Camaar'*/
+  (9.8ms)  ALTER TABLE `resposta_elems` ADD CONSTRAINT `fk_rails_3e0ef8f9d3`
+ +

FOREIGN KEY (resposta_form_id)

+ +
 REFERENCES `resposta_forms` (`id`)
+/*application='Camaar'*/
+  (9.2ms)  ALTER TABLE `resposta_forms` ADD CONSTRAINT `fk_rails_268bf3b7d8`
+ +

FOREIGN KEY (formulario_id)

+ +
 REFERENCES `formularios` (`id`)
+/*application='Camaar'*/
+  (10.1ms)  ALTER TABLE `resposta_forms` ADD CONSTRAINT `fk_rails_983127f47b`
+ +

FOREIGN KEY (usuario_id)

+ +
 REFERENCES `usuarios` (`id`)
+/*application='Camaar'*/
+  (7.2ms)  ALTER TABLE `templates` ADD CONSTRAINT `fk_rails_c09983659b`
+ +

FOREIGN KEY (usuario_id)

+ +
 REFERENCES `usuarios` (`id`)
+/*application='Camaar'*/
+  (8.5ms)  ALTER TABLE `turmas` ADD CONSTRAINT `fk_rails_76e53910e3`
+ +

FOREIGN KEY (disciplina_id)

+ +
 REFERENCES `disciplinas` (`id`)
+/*application='Camaar'*/
+  (12.7ms)  ALTER TABLE `usuarios` ADD CONSTRAINT `fk_rails_5560801d4f`
+ +

FOREIGN KEY (curso_id)

+ +
 REFERENCES `cursos` (`id`)
+/*application='Camaar'*/
+  (12.2ms)  ALTER TABLE `usuarios` ADD CONSTRAINT `fk_rails_cd805621d1`
+ +

FOREIGN KEY (departamento_id)

+ +
 REFERENCES `departamentos` (`id`)
+/*application='Camaar'*/
+  (1.7ms)  CREATE TABLE `schema_migrations` (`version` varchar(255) NOT NULL PRIMARY KEY) /*application='Camaar'*/
+ ActiveRecord::SchemaMigration Load (0.3ms)  SELECT `schema_migrations`.`version` FROM `schema_migrations` ORDER BY `schema_migrations`.`version` ASC /*application='Camaar'*/
+  (0.3ms)  INSERT INTO `schema_migrations` (version) VALUES (20260616201400) /*application='Camaar'*/
+  (0.4ms)  INSERT INTO `schema_migrations` (version) VALUES
+ +

(20260616193744), (20260615105458), (20260602090000), (20260601120000), (20260528002258), (20260528000109), (20260528000107), (20260527235104), (20260527235101), (20260527235057), (20260527235055), (20260527235053), (20260527235031), (20260527235028), (20260527235026), (20260527235010), (20260527234838), (20260527234836), (20260527234834), (20260527234832); /*application=‘Camaar’*/

+ +
 (2.0ms)  CREATE TABLE `ar_internal_metadata` (`key` varchar(255) NOT NULL PRIMARY KEY, `value` varchar(255), `created_at` datetime(6) NOT NULL, `updated_at` datetime(6) NOT NULL) /*application='Camaar'*/
+ActiveRecord::InternalMetadata Load (0.4ms)  SELECT * FROM `ar_internal_metadata` WHERE `ar_internal_metadata`.`key` = 'environment' ORDER BY `ar_internal_metadata`.`key` ASC LIMIT 1 /*application='Camaar'*/
+ActiveRecord::InternalMetadata Create (0.3ms)  INSERT INTO `ar_internal_metadata` (`key`, `value`, `created_at`, `updated_at`) VALUES ('environment', 'development', '2026-06-30 17:29:56.496357', '2026-06-30 17:29:56.496360') /*application='Camaar'*/
+ActiveRecord::InternalMetadata Load (0.1ms)  SELECT * FROM `ar_internal_metadata` WHERE `ar_internal_metadata`.`key` = 'environment' ORDER BY `ar_internal_metadata`.`key` ASC LIMIT 1 /*application='Camaar'*/
+ActiveRecord::InternalMetadata Load (0.2ms)  SELECT * FROM `ar_internal_metadata` WHERE `ar_internal_metadata`.`key` = 'schema_sha1' ORDER BY `ar_internal_metadata`.`key` ASC LIMIT 1 /*application='Camaar'*/
+ActiveRecord::InternalMetadata Create (0.3ms)  INSERT INTO `ar_internal_metadata` (`key`, `value`, `created_at`, `updated_at`) VALUES ('schema_sha1', 'e1b78fd7ae7089effd3f16f06c428e1d3c71f2d4', '2026-06-30 17:29:56.501114', '2026-06-30 17:29:56.501116') /*application='Camaar'*/
+ (0.8ms)  DROP TABLE IF EXISTS `campo_forms` CASCADE /*application='Camaar'*/
+ (3.6ms)  CREATE TABLE `campo_forms` (`id` bigint NOT NULL AUTO_INCREMENT PRIMARY KEY, `created_at` datetime(6) NOT NULL, `elemento_form_id` bigint NOT NULL, `enunciado` varchar(255), `ordem` int, `tipo_elemento` varchar(255), `updated_at` datetime(6) NOT NULL, INDEX `index_campo_forms_on_elemento_form_id` (`elemento_form_id`)) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci /*application='Camaar'*/
+ (0.4ms)  DROP TABLE IF EXISTS `campos` CASCADE /*application='Camaar'*/
+ (2.4ms)  CREATE TABLE `campos` (`id` bigint NOT NULL AUTO_INCREMENT PRIMARY KEY, `created_at` datetime(6) NOT NULL, `elemento_id` bigint NOT NULL, `enunciado` varchar(255), `ordem` int, `tipo_elemento` varchar(255), `updated_at` datetime(6) NOT NULL, INDEX `index_campos_on_elemento_id` (`elemento_id`)) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci /*application='Camaar'*/
+ (0.4ms)  DROP TABLE IF EXISTS `cursos` CASCADE /*application='Camaar'*/
+ (2.7ms)  CREATE TABLE `cursos` (`id` bigint NOT NULL AUTO_INCREMENT PRIMARY KEY, `codigo` varchar(255), `created_at` datetime(6) NOT NULL, `departamento_id` bigint NOT NULL, `nome` varchar(255), `updated_at` datetime(6) NOT NULL, UNIQUE INDEX `index_cursos_on_codigo` (`codigo`), INDEX `index_cursos_on_departamento_id` (`departamento_id`)) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci /*application='Camaar'*/
+ (0.4ms)  DROP TABLE IF EXISTS `departamentos` CASCADE /*application='Camaar'*/
+ (2.9ms)  CREATE TABLE `departamentos` (`id` bigint NOT NULL AUTO_INCREMENT PRIMARY KEY, `codigo` varchar(255), `created_at` datetime(6) NOT NULL, `nome` varchar(255), `updated_at` datetime(6) NOT NULL, UNIQUE INDEX `index_departamentos_on_codigo` (`codigo`)) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci /*application='Camaar'*/
+ (0.4ms)  DROP TABLE IF EXISTS `discentes_turmas` CASCADE /*application='Camaar'*/
+ (2.1ms)  CREATE TABLE `discentes_turmas` (`discente_id` bigint NOT NULL, `turma_id` bigint NOT NULL) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci /*application='Camaar'*/
+ (0.5ms)  DROP TABLE IF EXISTS `disciplinas` CASCADE /*application='Camaar'*/
+ (3.5ms)  CREATE TABLE `disciplinas` (`id` bigint NOT NULL AUTO_INCREMENT PRIMARY KEY, `codigo` varchar(255), `created_at` datetime(6) NOT NULL, `departamento_id` bigint NOT NULL, `nome` varchar(255), `updated_at` datetime(6) NOT NULL, UNIQUE INDEX `index_disciplinas_on_codigo` (`codigo`), INDEX `index_disciplinas_on_departamento_id` (`departamento_id`)) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci /*application='Camaar'*/
+ (0.4ms)  DROP TABLE IF EXISTS `docentes_turmas` CASCADE /*application='Camaar'*/
+ (2.8ms)  CREATE TABLE `docentes_turmas` (`docente_id` bigint NOT NULL, `turma_id` bigint NOT NULL) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci /*application='Camaar'*/
+ (0.7ms)  DROP TABLE IF EXISTS `elemento_forms` CASCADE /*application='Camaar'*/
+ (3.6ms)  CREATE TABLE `elemento_forms` (`id` bigint NOT NULL AUTO_INCREMENT PRIMARY KEY, `created_at` datetime(6) NOT NULL, `enunciado` varchar(255), `formulario_id` bigint NOT NULL, `ordem` int, `tipo` varchar(255), `updated_at` datetime(6) NOT NULL, INDEX `index_elemento_forms_on_formulario_id` (`formulario_id`)) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci /*application='Camaar'*/
+ (0.4ms)  DROP TABLE IF EXISTS `elementos` CASCADE /*application='Camaar'*/
+ (4.2ms)  CREATE TABLE `elementos` (`id` bigint NOT NULL AUTO_INCREMENT PRIMARY KEY, `created_at` datetime(6) NOT NULL, `enunciado` varchar(255), `ordem` int, `template_id` bigint NOT NULL, `updated_at` datetime(6) NOT NULL, INDEX `index_elementos_on_template_id` (`template_id`)) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci /*application='Camaar'*/
+ (0.4ms)  DROP TABLE IF EXISTS `formularios` CASCADE /*application='Camaar'*/
+ (2.6ms)  CREATE TABLE `formularios` (`id` bigint NOT NULL AUTO_INCREMENT PRIMARY KEY, `created_at` datetime(6) NOT NULL, `data_fim` date, `data_inicio` date, `nome` varchar(255), `titulo` varchar(255), `turma_id` bigint, `updated_at` datetime(6) NOT NULL, INDEX `index_formularios_on_turma_id` (`turma_id`)) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci /*application='Camaar'*/
+ (0.4ms)  DROP TABLE IF EXISTS `resposta_elems` CASCADE /*application='Camaar'*/
+ (3.8ms)  CREATE TABLE `resposta_elems` (`id` bigint NOT NULL AUTO_INCREMENT PRIMARY KEY, `campo_form_id` bigint, `created_at` datetime(6) NOT NULL, `elemento_form_id` bigint NOT NULL, `resposta_form_id` bigint NOT NULL, `texto_resposta` text, `updated_at` datetime(6) NOT NULL, INDEX `index_resposta_elems_on_campo_form_id` (`campo_form_id`), INDEX `index_resposta_elems_on_elemento_form_id` (`elemento_form_id`), INDEX `index_resposta_elems_on_resposta_form_id` (`resposta_form_id`)) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci /*application='Camaar'*/
+ (0.4ms)  DROP TABLE IF EXISTS `resposta_forms` CASCADE /*application='Camaar'*/
+ (3.3ms)  CREATE TABLE `resposta_forms` (`id` bigint NOT NULL AUTO_INCREMENT PRIMARY KEY, `created_at` datetime(6) NOT NULL, `data_submissao` date, `formulario_id` bigint NOT NULL, `updated_at` datetime(6) NOT NULL, `usuario_id` bigint NOT NULL, INDEX `index_resposta_forms_on_formulario_id` (`formulario_id`), INDEX `index_resposta_forms_on_usuario_id` (`usuario_id`)) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci /*application='Camaar'*/
+ (0.4ms)  DROP TABLE IF EXISTS `templates` CASCADE /*application='Camaar'*/
+ (2.9ms)  CREATE TABLE `templates` (`id` bigint NOT NULL AUTO_INCREMENT PRIMARY KEY, `created_at` datetime(6) NOT NULL, `nome` varchar(255), `updated_at` datetime(6) NOT NULL, `usuario_id` bigint NOT NULL, INDEX `index_templates_on_usuario_id` (`usuario_id`)) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci /*application='Camaar'*/
+ (0.4ms)  DROP TABLE IF EXISTS `turmas` CASCADE /*application='Camaar'*/
+ (3.0ms)  CREATE TABLE `turmas` (`id` bigint NOT NULL AUTO_INCREMENT PRIMARY KEY, `created_at` datetime(6) NOT NULL, `disciplina_id` bigint NOT NULL, `horario` varchar(255), `numero_da_turma` varchar(255), `semestre` varchar(255), `updated_at` datetime(6) NOT NULL, INDEX `index_turmas_on_disciplina_id` (`disciplina_id`)) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci /*application='Camaar'*/
+ (0.4ms)  DROP TABLE IF EXISTS `usuarios` CASCADE /*application='Camaar'*/
+ (5.1ms)  CREATE TABLE `usuarios` (`id` bigint NOT NULL AUTO_INCREMENT PRIMARY KEY, `created_at` datetime(6) NOT NULL, `curso_id` bigint, `definicao_senha_sent_at` datetime(6), `definicao_senha_token` varchar(255), `departamento_id` bigint, `email` varchar(255), `formacao` varchar(255), `matricula` varchar(255), `nome` varchar(255), `redefinicao_senha_sent_at` datetime(6), `redefinicao_senha_token` varchar(255), `senha_hash` varchar(255), `type` varchar(255), `updated_at` datetime(6) NOT NULL, INDEX `index_usuarios_on_curso_id` (`curso_id`), UNIQUE INDEX `index_usuarios_on_definicao_senha_token` (`definicao_senha_token`), INDEX `index_usuarios_on_departamento_id` (`departamento_id`), UNIQUE INDEX `index_usuarios_on_matricula` (`matricula`), UNIQUE INDEX `index_usuarios_on_redefinicao_senha_token` (`redefinicao_senha_token`)) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci /*application='Camaar'*/
+ (9.1ms)  ALTER TABLE `campo_forms` ADD CONSTRAINT `fk_rails_60e170cc42`
+ +

FOREIGN KEY (elemento_form_id)

+ +
 REFERENCES `elemento_forms` (`id`)
+/*application='Camaar'*/
+  (8.3ms)  ALTER TABLE `campos` ADD CONSTRAINT `fk_rails_093ff779d5`
+ +

FOREIGN KEY (elemento_id)

+ +
 REFERENCES `elementos` (`id`)
+/*application='Camaar'*/
+  (8.8ms)  ALTER TABLE `cursos` ADD CONSTRAINT `fk_rails_46092b12ee`
+ +

FOREIGN KEY (departamento_id)

+ +
 REFERENCES `departamentos` (`id`)
+/*application='Camaar'*/
+  (7.4ms)  ALTER TABLE `disciplinas` ADD CONSTRAINT `fk_rails_a98996a2d4`
+ +

FOREIGN KEY (departamento_id)

+ +
 REFERENCES `departamentos` (`id`)
+/*application='Camaar'*/
+  (9.6ms)  ALTER TABLE `elemento_forms` ADD CONSTRAINT `fk_rails_ce2bb731de`
+ +

FOREIGN KEY (formulario_id)

+ +
 REFERENCES `formularios` (`id`)
+/*application='Camaar'*/
+  (8.0ms)  ALTER TABLE `elementos` ADD CONSTRAINT `fk_rails_09f770d3fe`
+ +

FOREIGN KEY (template_id)

+ +
 REFERENCES `templates` (`id`)
+/*application='Camaar'*/
+  (8.0ms)  ALTER TABLE `formularios` ADD CONSTRAINT `fk_rails_5a2be0c3c1`
+ +

FOREIGN KEY (turma_id)

+ +
 REFERENCES `turmas` (`id`)
+/*application='Camaar'*/
+  (8.8ms)  ALTER TABLE `resposta_elems` ADD CONSTRAINT `fk_rails_ecb8874f2e`
+ +

FOREIGN KEY (campo_form_id)

+ +
 REFERENCES `campo_forms` (`id`)
+/*application='Camaar'*/
+  (9.0ms)  ALTER TABLE `resposta_elems` ADD CONSTRAINT `fk_rails_ea4cd9531e`
+ +

FOREIGN KEY (elemento_form_id)

+ +
 REFERENCES `elemento_forms` (`id`)
+/*application='Camaar'*/
+  (10.7ms)  ALTER TABLE `resposta_elems` ADD CONSTRAINT `fk_rails_3e0ef8f9d3`
+ +

FOREIGN KEY (resposta_form_id)

+ +
 REFERENCES `resposta_forms` (`id`)
+/*application='Camaar'*/
+  (9.8ms)  ALTER TABLE `resposta_forms` ADD CONSTRAINT `fk_rails_268bf3b7d8`
+ +

FOREIGN KEY (formulario_id)

+ +
 REFERENCES `formularios` (`id`)
+/*application='Camaar'*/
+  (11.7ms)  ALTER TABLE `resposta_forms` ADD CONSTRAINT `fk_rails_983127f47b`
+ +

FOREIGN KEY (usuario_id)

+ +
 REFERENCES `usuarios` (`id`)
+/*application='Camaar'*/
+  (7.9ms)  ALTER TABLE `templates` ADD CONSTRAINT `fk_rails_c09983659b`
+ +

FOREIGN KEY (usuario_id)

+ +
 REFERENCES `usuarios` (`id`)
+/*application='Camaar'*/
+  (8.0ms)  ALTER TABLE `turmas` ADD CONSTRAINT `fk_rails_76e53910e3`
+ +

FOREIGN KEY (disciplina_id)

+ +
 REFERENCES `disciplinas` (`id`)
+/*application='Camaar'*/
+  (13.5ms)  ALTER TABLE `usuarios` ADD CONSTRAINT `fk_rails_5560801d4f`
+ +

FOREIGN KEY (curso_id)

+ +
 REFERENCES `cursos` (`id`)
+/*application='Camaar'*/
+  (14.0ms)  ALTER TABLE `usuarios` ADD CONSTRAINT `fk_rails_cd805621d1`
+ +

FOREIGN KEY (departamento_id)

+ +
 REFERENCES `departamentos` (`id`)
+/*application='Camaar'*/
+  (30.7ms)  CREATE TABLE `schema_migrations` (`version` varchar(255) NOT NULL PRIMARY KEY) /*application='Camaar'*/
+ ActiveRecord::SchemaMigration Load (0.4ms)  SELECT `schema_migrations`.`version` FROM `schema_migrations` ORDER BY `schema_migrations`.`version` ASC /*application='Camaar'*/
+  (0.4ms)  INSERT INTO `schema_migrations` (version) VALUES (20260616201400) /*application='Camaar'*/
+  (0.7ms)  INSERT INTO `schema_migrations` (version) VALUES
+ +

(20260616193744), (20260615105458), (20260602090000), (20260601120000), (20260528002258), (20260528000109), (20260528000107), (20260527235104), (20260527235101), (20260527235057), (20260527235055), (20260527235053), (20260527235031), (20260527235028), (20260527235026), (20260527235010), (20260527234838), (20260527234836), (20260527234834), (20260527234832); /*application=‘Camaar’*/

+ +
 (2.0ms)  CREATE TABLE `ar_internal_metadata` (`key` varchar(255) NOT NULL PRIMARY KEY, `value` varchar(255), `created_at` datetime(6) NOT NULL, `updated_at` datetime(6) NOT NULL) /*application='Camaar'*/
+ActiveRecord::InternalMetadata Load (0.4ms)  SELECT * FROM `ar_internal_metadata` WHERE `ar_internal_metadata`.`key` = 'environment' ORDER BY `ar_internal_metadata`.`key` ASC LIMIT 1 /*application='Camaar'*/
+ActiveRecord::InternalMetadata Create (0.3ms)  INSERT INTO `ar_internal_metadata` (`key`, `value`, `created_at`, `updated_at`) VALUES ('environment', 'development', '2026-06-30 17:29:56.833883', '2026-06-30 17:29:56.833885') /*application='Camaar'*/
+ActiveRecord::InternalMetadata Load (0.2ms)  SELECT * FROM `ar_internal_metadata` WHERE `ar_internal_metadata`.`key` = 'environment' ORDER BY `ar_internal_metadata`.`key` ASC LIMIT 1 /*application='Camaar'*/
+ActiveRecord::InternalMetadata Update (0.4ms)  UPDATE `ar_internal_metadata` SET `ar_internal_metadata`.`value` = 'test', `ar_internal_metadata`.`updated_at` = '2026-06-30 17:29:56.837410' WHERE `ar_internal_metadata`.`key` = 'environment' /*application='Camaar'*/
+ActiveRecord::InternalMetadata Load (0.3ms)  SELECT * FROM `ar_internal_metadata` WHERE `ar_internal_metadata`.`key` = 'schema_sha1' ORDER BY `ar_internal_metadata`.`key` ASC LIMIT 1 /*application='Camaar'*/
+ActiveRecord::InternalMetadata Create (0.4ms)  INSERT INTO `ar_internal_metadata` (`key`, `value`, `created_at`, `updated_at`) VALUES ('schema_sha1', 'e1b78fd7ae7089effd3f16f06c428e1d3c71f2d4', '2026-06-30 17:29:56.840475', '2026-06-30 17:29:56.840477') /*application='Camaar'*/
+ActiveRecord::SchemaMigration Load (0.2ms)  SELECT `schema_migrations`.`version` FROM `schema_migrations` ORDER BY `schema_migrations`.`version` ASC /*application='Camaar'*/
+Departamento Load (0.6ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1 /*application='Camaar'*/
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:29:56.915722', 'Ciência da Computação', '2026-06-30 17:29:56.915722') /*application='Camaar'*/
+TRANSACTION (1.1ms)  COMMIT /*application='Camaar'*/
+Departamento Load (0.1ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`codigo` = 'MAT' LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+Departamento Exists? (0.8ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'MAT' LIMIT 1 /*application='Camaar'*/
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('MAT', '2026-06-30 17:29:56.920436', 'Matemática', '2026-06-30 17:29:56.920436') /*application='Camaar'*/
+TRANSACTION (0.3ms)  COMMIT /*application='Camaar'*/
+Curso Load (0.4ms)  SELECT `cursos`.* FROM `cursos` WHERE `cursos`.`codigo` = 'CC' LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+Curso Exists? (0.3ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`codigo` = 'CC' LIMIT 1 /*application='Camaar'*/
+Curso Create (0.3ms)  INSERT INTO `cursos` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CC', '2026-06-30 17:29:56.933128', 1, 'Bacharelado em Ciência da Computação', '2026-06-30 17:29:56.933128') /*application='Camaar'*/
+TRANSACTION (0.5ms)  COMMIT /*application='Camaar'*/
+Disciplina Load (0.7ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0001' LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+Disciplina Exists? (0.2ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0001' LIMIT 1 /*application='Camaar'*/
+Disciplina Create (0.3ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0001', '2026-06-30 17:29:56.943337', 1, 'Estrutura de Dados', '2026-06-30 17:29:56.943337') /*application='Camaar'*/
+TRANSACTION (0.5ms)  COMMIT /*application='Camaar'*/
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0002' LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+Disciplina Exists? (1.0ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0002' LIMIT 1 /*application='Camaar'*/
+Disciplina Create (1.6ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0002', '2026-06-30 17:29:56.947267', 1, 'Introdução aos Sistemas de Computação', '2026-06-30 17:29:56.947267') /*application='Camaar'*/
+TRANSACTION (0.4ms)  COMMIT /*application='Camaar'*/
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0003' LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+Disciplina Exists? (0.9ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0003' LIMIT 1 /*application='Camaar'*/
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0003', '2026-06-30 17:29:56.952367', 1, 'Algoritmos e Programação de Computadores', '2026-06-30 17:29:56.952367') /*application='Camaar'*/
+TRANSACTION (0.4ms)  COMMIT /*application='Camaar'*/
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'A' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 1 LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+Turma Exists? (0.2ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'A' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 1 LIMIT 1 /*application='Camaar'*/
+Turma Create (0.3ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:29:56.962516', 1, '35T23', 'A', '2026.1', '2026-06-30 17:29:56.962516') /*application='Camaar'*/
+TRANSACTION (0.4ms)  COMMIT /*application='Camaar'*/
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'B' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 1 LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+Turma Exists? (1.0ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'B' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 1 LIMIT 1 /*application='Camaar'*/
+Turma Create (0.3ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:29:56.966470', 1, '35M23', 'B', '2026.1', '2026-06-30 17:29:56.966470') /*application='Camaar'*/
+TRANSACTION (0.5ms)  COMMIT /*application='Camaar'*/
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'A' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 2 LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+Turma Exists? (1.0ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'A' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 2 LIMIT 1 /*application='Camaar'*/
+Turma Create (0.3ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:29:56.970610', 2, '24T23', 'A', '2026.1', '2026-06-30 17:29:56.970610') /*application='Camaar'*/
+TRANSACTION (0.6ms)  COMMIT /*application='Camaar'*/
+Docente Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Docente' AND `usuarios`.`email` = 'docente1@teste.com' LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.2ms)  BEGIN /*application='Camaar'*/
+Usuario Exists? (0.9ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '241000001' LIMIT 1 /*application='Camaar'*/
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'docente1@teste.com' LIMIT 1 /*application='Camaar'*/
+Docente Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:29:57.176998', NULL, NULL, NULL, 1, 'docente1@teste.com', 'doutorado', '241000001', 'Professor de ED', NULL, NULL, '$2a$12$s.KJTaL5v0GwtjKG8kiJg.i8dRHdDbc0ZgQB30VLU.b.I/lD22HBy', 'Docente', '2026-06-30 17:29:57.176998') /*application='Camaar'*/
+TRANSACTION (0.9ms)  COMMIT /*application='Camaar'*/
+Docente Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Docente' AND `usuarios`.`email` = 'docente2@teste.com' LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+Usuario Exists? (0.8ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '241000011' LIMIT 1 /*application='Camaar'*/
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'docente2@teste.com' LIMIT 1 /*application='Camaar'*/
+Docente Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:29:57.371629', NULL, NULL, NULL, 1, 'docente2@teste.com', 'doutorado', '241000011', 'Professor de ISC', NULL, NULL, '$2a$12$w7NlFfwvL7KNacIKffyxUOMDPw2noq2ANlq.9kOlI8aq7sm/ro.Pq', 'Docente', '2026-06-30 17:29:57.371629') /*application='Camaar'*/
+TRANSACTION (1.2ms)  COMMIT /*application='Camaar'*/
+Docente Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Docente' AND `usuarios`.`email` = 'docente3@teste.com' LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+Usuario Exists? (0.7ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '241000069' LIMIT 1 /*application='Camaar'*/
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'docente3@teste.com' LIMIT 1 /*application='Camaar'*/
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:29:57.564552', NULL, NULL, NULL, 1, 'docente3@teste.com', 'doutorado', '241000069', 'Zequinha Banana', NULL, NULL, '$2a$12$IooVbJ8I5NVFwj2sIl4kQegXtblhVYBhRvoGU/i5MM2cLu58qW2OO', 'Docente', '2026-06-30 17:29:57.564552') /*application='Camaar'*/
+TRANSACTION (0.8ms)  COMMIT /*application='Camaar'*/
+Administrador Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`email` = 'admin@teste.com' LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.2ms)  BEGIN /*application='Camaar'*/
+Usuario Exists? (0.8ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '240000003' LIMIT 1 /*application='Camaar'*/
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@teste.com' LIMIT 1 /*application='Camaar'*/
+Administrador Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:29:57.759745', NULL, NULL, NULL, 1, 'admin@teste.com', NULL, '240000003', 'Admin Teste', NULL, NULL, '$2a$12$ERP7F0ACQb31pxI4ja.GTuT7tQ43oheVePIVP.SCxLKvloJFSkKX2', 'Administrador', '2026-06-30 17:29:57.759745') /*application='Camaar'*/
+TRANSACTION (0.8ms)  COMMIT /*application='Camaar'*/
+Discente Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Discente' AND `usuarios`.`email` = 'discente1@teste.com' LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+Usuario Exists? (0.8ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '241000002' LIMIT 1 /*application='Camaar'*/
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'discente1@teste.com' LIMIT 1 /*application='Camaar'*/
+Discente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:29:57.955636', 1, NULL, NULL, NULL, 'discente1@teste.com', NULL, '241000002', 'Ana Silva', NULL, NULL, '$2a$12$tuapuPJRiKFBbXYhhxxeP.yX2p61Y6RBnKHGvo/stYNSimJW6fiKa', 'Discente', '2026-06-30 17:29:57.955636') /*application='Camaar'*/
+TRANSACTION (0.8ms)  COMMIT /*application='Camaar'*/
+Discente Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Discente' AND `usuarios`.`email` = 'discente2@teste.com' LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+Usuario Exists? (0.8ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '241000004' LIMIT 1 /*application='Camaar'*/
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'discente2@teste.com' LIMIT 1 /*application='Camaar'*/
+Discente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:29:58.148203', 1, NULL, NULL, NULL, 'discente2@teste.com', NULL, '241000004', 'Bruno Santos', NULL, NULL, '$2a$12$53Rnv3MrRej2M5umNHDcOukfIKRJVhNWat6azCfOLZ4/3R1odj6zO', 'Discente', '2026-06-30 17:29:58.148203') /*application='Camaar'*/
+TRANSACTION (0.9ms)  COMMIT /*application='Camaar'*/
+Discente Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Discente' AND `usuarios`.`email` = 'discente3@teste.com' LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.2ms)  BEGIN /*application='Camaar'*/
+Usuario Exists? (0.8ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '241000005' LIMIT 1 /*application='Camaar'*/
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'discente3@teste.com' LIMIT 1 /*application='Camaar'*/
+Discente Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:29:58.348168', 1, NULL, NULL, NULL, 'discente3@teste.com', NULL, '241000005', 'Carlos Oliveira', NULL, NULL, '$2a$12$OvhcYtSGvOJmmiGKAqMOReEjFmK/Mvoniyjr0VjDB22phA4QWbExu', 'Discente', '2026-06-30 17:29:58.348168') /*application='Camaar'*/
+TRANSACTION (0.8ms)  COMMIT /*application='Camaar'*/
+Discente Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Discente' AND `usuarios`.`email` = 'discente4@teste.com' LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+Usuario Exists? (0.8ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '241000006' LIMIT 1 /*application='Camaar'*/
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'discente4@teste.com' LIMIT 1 /*application='Camaar'*/
+Discente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:29:58.541937', 1, NULL, NULL, NULL, 'discente4@teste.com', NULL, '241000006', 'Diana Costa', NULL, NULL, '$2a$12$ZpqHeawAb5gspxWUs/NIk.dv.Pbx.Y69iwrkx2gdQrIHDjVdLn/0O', 'Discente', '2026-06-30 17:29:58.541937') /*application='Camaar'*/
+TRANSACTION (0.7ms)  COMMIT /*application='Camaar'*/
+Discente Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Discente' AND `usuarios`.`email` = 'discente5@teste.com' LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+Usuario Exists? (1.0ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '241000007' LIMIT 1 /*application='Camaar'*/
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'discente5@teste.com' LIMIT 1 /*application='Camaar'*/
+Discente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:29:58.734556', 1, NULL, NULL, NULL, 'discente5@teste.com', NULL, '241000007', 'Eduardo Ribeiro', NULL, NULL, '$2a$12$bVKIM1aemNcdgrJWfqBDjOdNOaC4rYwTD.zSkLgp0zXZ/lFN4Bztu', 'Discente', '2026-06-30 17:29:58.734556') /*application='Camaar'*/
+TRANSACTION (0.6ms)  COMMIT /*application='Camaar'*/
+Docente Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Docente' AND `usuarios`.`email` = 'gusfring.a@gmail.com' LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+Usuario Exists? (0.7ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '241000067' LIMIT 1 /*application='Camaar'*/
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'gusfring.a@gmail.com' LIMIT 1 /*application='Camaar'*/
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:29:58.929617', NULL, NULL, NULL, 1, 'gusfring.a@gmail.com', 'doutorado', '241000067', 'GUS', NULL, NULL, '$2a$12$gKGe32zuNYtVI93kX2LV1OWzUJ7wofZNKeWfnhg10SlNi8C62Cg7i', 'Docente', '2026-06-30 17:29:58.929617') /*application='Camaar'*/
+TRANSACTION (0.8ms)  COMMIT /*application='Camaar'*/
+Turma Exists? (0.8ms)  SELECT 1 AS one FROM `turmas` INNER JOIN `docentes_turmas` ON `turmas`.`id` = `docentes_turmas`.`turma_id` WHERE `docentes_turmas`.`docente_id` = 1 AND `turmas`.`id` = 1 LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.2ms)  BEGIN /*application='Camaar'*/
+Docente::HABTM_Turmas Create (0.3ms)  INSERT INTO `docentes_turmas` (`docente_id`, `turma_id`) VALUES (1, 1) /*application='Camaar'*/
+TRANSACTION (0.4ms)  COMMIT /*application='Camaar'*/
+Turma Exists? (0.3ms)  SELECT 1 AS one FROM `turmas` INNER JOIN `docentes_turmas` ON `turmas`.`id` = `docentes_turmas`.`turma_id` WHERE `docentes_turmas`.`docente_id` = 1 AND `turmas`.`id` = 2 LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+Docente::HABTM_Turmas Create (0.8ms)  INSERT INTO `docentes_turmas` (`docente_id`, `turma_id`) VALUES (1, 2) /*application='Camaar'*/
+TRANSACTION (43.2ms)  COMMIT /*application='Camaar'*/
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` INNER JOIN `docentes_turmas` ON `turmas`.`id` = `docentes_turmas`.`turma_id` WHERE `docentes_turmas`.`docente_id` = 2 AND `turmas`.`id` = 3 LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+Docente::HABTM_Turmas Create (0.8ms)  INSERT INTO `docentes_turmas` (`docente_id`, `turma_id`) VALUES (2, 3) /*application='Camaar'*/
+TRANSACTION (0.4ms)  COMMIT /*application='Camaar'*/
+Turma Exists? (0.3ms)  SELECT 1 AS one FROM `turmas` INNER JOIN `docentes_turmas` ON `turmas`.`id` = `docentes_turmas`.`turma_id` WHERE `docentes_turmas`.`docente_id` = 3 AND `turmas`.`id` = 1 LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+Docente::HABTM_Turmas Create (1.0ms)  INSERT INTO `docentes_turmas` (`docente_id`, `turma_id`) VALUES (3, 1) /*application='Camaar'*/
+TRANSACTION (0.3ms)  COMMIT /*application='Camaar'*/
+Turma Exists? (0.6ms)  SELECT 1 AS one FROM `turmas` INNER JOIN `discentes_turmas` ON `turmas`.`id` = `discentes_turmas`.`turma_id` WHERE `discentes_turmas`.`discente_id` = 5 AND `turmas`.`id` = 1 LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+Discente::HABTM_Turmas Create (0.2ms)  INSERT INTO `discentes_turmas` (`discente_id`, `turma_id`) VALUES (5, 1) /*application='Camaar'*/
+TRANSACTION (0.4ms)  COMMIT /*application='Camaar'*/
+Turma Exists? (0.3ms)  SELECT 1 AS one FROM `turmas` INNER JOIN `discentes_turmas` ON `turmas`.`id` = `discentes_turmas`.`turma_id` WHERE `discentes_turmas`.`discente_id` = 6 AND `turmas`.`id` = 1 LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+Discente::HABTM_Turmas Create (0.9ms)  INSERT INTO `discentes_turmas` (`discente_id`, `turma_id`) VALUES (6, 1) /*application='Camaar'*/
+TRANSACTION (0.4ms)  COMMIT /*application='Camaar'*/
+Turma Exists? (0.3ms)  SELECT 1 AS one FROM `turmas` INNER JOIN `discentes_turmas` ON `turmas`.`id` = `discentes_turmas`.`turma_id` WHERE `discentes_turmas`.`discente_id` = 7 AND `turmas`.`id` = 1 LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+Discente::HABTM_Turmas Create (0.7ms)  INSERT INTO `discentes_turmas` (`discente_id`, `turma_id`) VALUES (7, 1) /*application='Camaar'*/
+TRANSACTION (0.4ms)  COMMIT /*application='Camaar'*/
+Turma Exists? (0.2ms)  SELECT 1 AS one FROM `turmas` INNER JOIN `discentes_turmas` ON `turmas`.`id` = `discentes_turmas`.`turma_id` WHERE `discentes_turmas`.`discente_id` = 7 AND `turmas`.`id` = 2 LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+Discente::HABTM_Turmas Create (0.6ms)  INSERT INTO `discentes_turmas` (`discente_id`, `turma_id`) VALUES (7, 2) /*application='Camaar'*/
+TRANSACTION (0.2ms)  COMMIT /*application='Camaar'*/
+Turma Exists? (0.2ms)  SELECT 1 AS one FROM `turmas` INNER JOIN `discentes_turmas` ON `turmas`.`id` = `discentes_turmas`.`turma_id` WHERE `discentes_turmas`.`discente_id` = 8 AND `turmas`.`id` = 2 LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.2ms)  BEGIN /*application='Camaar'*/
+Discente::HABTM_Turmas Create (0.9ms)  INSERT INTO `discentes_turmas` (`discente_id`, `turma_id`) VALUES (8, 2) /*application='Camaar'*/
+TRANSACTION (0.4ms)  COMMIT /*application='Camaar'*/
+Turma Exists? (0.2ms)  SELECT 1 AS one FROM `turmas` INNER JOIN `discentes_turmas` ON `turmas`.`id` = `discentes_turmas`.`turma_id` WHERE `discentes_turmas`.`discente_id` = 9 AND `turmas`.`id` = 2 LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+Discente::HABTM_Turmas Create (0.7ms)  INSERT INTO `discentes_turmas` (`discente_id`, `turma_id`) VALUES (9, 2) /*application='Camaar'*/
+TRANSACTION (0.3ms)  COMMIT /*application='Camaar'*/
+Turma Exists? (0.2ms)  SELECT 1 AS one FROM `turmas` INNER JOIN `discentes_turmas` ON `turmas`.`id` = `discentes_turmas`.`turma_id` WHERE `discentes_turmas`.`discente_id` = 5 AND `turmas`.`id` = 3 LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+Discente::HABTM_Turmas Create (0.7ms)  INSERT INTO `discentes_turmas` (`discente_id`, `turma_id`) VALUES (5, 3) /*application='Camaar'*/
+TRANSACTION (0.3ms)  COMMIT /*application='Camaar'*/
+Turma Exists? (0.3ms)  SELECT 1 AS one FROM `turmas` INNER JOIN `discentes_turmas` ON `turmas`.`id` = `discentes_turmas`.`turma_id` WHERE `discentes_turmas`.`discente_id` = 9 AND `turmas`.`id` = 3 LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+Discente::HABTM_Turmas Create (0.7ms)  INSERT INTO `discentes_turmas` (`discente_id`, `turma_id`) VALUES (9, 3) /*application='Camaar'*/
+TRANSACTION (0.5ms)  COMMIT /*application='Camaar'*/
+Turma Exists? (0.3ms)  SELECT 1 AS one FROM `turmas` INNER JOIN `discentes_turmas` ON `turmas`.`id` = `discentes_turmas`.`turma_id` WHERE `discentes_turmas`.`discente_id` = 8 AND `turmas`.`id` = 3 LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+Discente::HABTM_Turmas Create (0.7ms)  INSERT INTO `discentes_turmas` (`discente_id`, `turma_id`) VALUES (8, 3) /*application='Camaar'*/
+TRANSACTION (0.4ms)  COMMIT /*application='Camaar'*/
+Template Load (0.6ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`nome` = 'Avaliação de Disciplina Padrão' LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+Campo Exists? (1.3ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` IS NULL LIMIT 1 /*application='Camaar'*/
+Campo Exists? (0.2ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 2 AND `campos`.`elemento_id` IS NULL LIMIT 1 /*application='Camaar'*/
+Campo Exists? (0.2ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 3 AND `campos`.`elemento_id` IS NULL LIMIT 1 /*application='Camaar'*/
+Campo Exists? (0.2ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 4 AND `campos`.`elemento_id` IS NULL LIMIT 1 /*application='Camaar'*/
+Campo Exists? (0.2ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 5 AND `campos`.`elemento_id` IS NULL LIMIT 1 /*application='Camaar'*/
+CACHE Campo Exists? (0.0ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` IS NULL LIMIT 1
+CACHE Campo Exists? (0.0ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 2 AND `campos`.`elemento_id` IS NULL LIMIT 1
+CACHE Campo Exists? (0.0ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 3 AND `campos`.`elemento_id` IS NULL LIMIT 1
+CACHE Campo Exists? (0.0ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Template Create (0.4ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:29:59.058312', 'Avaliação de Disciplina Padrão', '2026-06-30 17:29:59.058312', 4) /*application='Camaar'*/
+Elemento Create (0.9ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:29:59.059329', 'Avalie a didática do professor', 1, 1, '2026-06-30 17:29:59.059329') /*application='Camaar'*/
+Campo Create (0.3ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:29:59.060820', 1, '1', 1, 'Múltipla Escolha', '2026-06-30 17:29:59.060820') /*application='Camaar'*/
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:29:59.061756', 1, '2', 2, 'Múltipla Escolha', '2026-06-30 17:29:59.061756') /*application='Camaar'*/
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:29:59.063180', 1, '3', 3, 'Múltipla Escolha', '2026-06-30 17:29:59.063180') /*application='Camaar'*/
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:29:59.064039', 1, '4', 4, 'Múltipla Escolha', '2026-06-30 17:29:59.064039') /*application='Camaar'*/
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:29:59.064868', 1, '5', 5, 'Múltipla Escolha', '2026-06-30 17:29:59.064868') /*application='Camaar'*/
+Elemento Create (0.2ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:29:59.065690', 'Como você avalia a dificuldade das listas de exercícios?', 2, 1, '2026-06-30 17:29:59.065690') /*application='Camaar'*/
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:29:59.066449', 2, 'Muito Fácil', 1, 'Múltipla Escolha', '2026-06-30 17:29:59.066449') /*application='Camaar'*/
+Campo Create (0.1ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:29:59.067694', 2, 'Adequada', 2, 'Múltipla Escolha', '2026-06-30 17:29:59.067694') /*application='Camaar'*/
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:29:59.068498', 2, 'Muito Difícil', 3, 'Múltipla Escolha', '2026-06-30 17:29:59.068498') /*application='Camaar'*/
+Elemento Create (0.2ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:29:59.069376', 'Deixe um comentário ou sugestão sobre a disciplina', 3, 1, '2026-06-30 17:29:59.069376') /*application='Camaar'*/
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:29:59.070171', 3, NULL, 1, 'Texto', '2026-06-30 17:29:59.070171') /*application='Camaar'*/
+TRANSACTION (0.5ms)  COMMIT /*application='Camaar'*/
+Formulario Load (1.0ms)  SELECT `formularios`.* FROM `formularios` WHERE `formularios`.`turma_id` = 1 LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+Formulario Create (0.3ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:29:59.080826', NULL, NULL, NULL, NULL, 1, '2026-06-30 17:29:59.080826') /*application='Camaar'*/
+TRANSACTION (0.6ms)  COMMIT /*application='Camaar'*/
+Elemento Load (0.4ms)  SELECT `elementos`.* FROM `elementos` WHERE `elementos`.`template_id` = 1 ORDER BY `elementos`.`ordem` ASC /*application='Camaar'*/
+Campo Load (0.3ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` = 1 ORDER BY `campos`.`id` ASC LIMIT 1 /*application='Camaar'*/
+ElementoForm Load (0.7ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`enunciado` = 'Avalie a didática do professor' AND `elemento_forms`.`formulario_id` = 1 LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+ElementoForm Create (0.3ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:29:59.091028', 'Avalie a didática do professor', 1, 1, 'Múltipla Escolha', '2026-06-30 17:29:59.091028') /*application='Camaar'*/
+TRANSACTION (0.5ms)  COMMIT /*application='Camaar'*/
+Campo Load (0.3ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` = 1 ORDER BY `campos`.`ordem` ASC /*application='Camaar'*/
+CampoForm Load (0.8ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`enunciado` = '1' AND `campo_forms`.`elemento_form_id` = 1 LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+CampoForm Create (0.3ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:29:59.100197', 1, '1', 1, NULL, '2026-06-30 17:29:59.100197') /*application='Camaar'*/
+TRANSACTION (0.3ms)  COMMIT /*application='Camaar'*/
+CampoForm Load (0.3ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`enunciado` = '2' AND `campo_forms`.`elemento_form_id` = 1 LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+CampoForm Create (0.8ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:29:59.102433', 1, '2', 2, NULL, '2026-06-30 17:29:59.102433') /*application='Camaar'*/
+TRANSACTION (20.3ms)  COMMIT /*application='Camaar'*/
+CampoForm Load (0.3ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`enunciado` = '3' AND `campo_forms`.`elemento_form_id` = 1 LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+CampoForm Create (1.2ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:29:59.125381', 1, '3', 3, NULL, '2026-06-30 17:29:59.125381') /*application='Camaar'*/
+TRANSACTION (0.3ms)  COMMIT /*application='Camaar'*/
+CampoForm Load (0.3ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`enunciado` = '4' AND `campo_forms`.`elemento_form_id` = 1 LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+CampoForm Create (0.8ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:29:59.128657', 1, '4', 4, NULL, '2026-06-30 17:29:59.128657') /*application='Camaar'*/
+TRANSACTION (0.3ms)  COMMIT /*application='Camaar'*/
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`enunciado` = '5' AND `campo_forms`.`elemento_form_id` = 1 LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+CampoForm Create (0.8ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:29:59.131281', 1, '5', 5, NULL, '2026-06-30 17:29:59.131281') /*application='Camaar'*/
+TRANSACTION (0.3ms)  COMMIT /*application='Camaar'*/
+Campo Load (0.2ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` = 2 ORDER BY `campos`.`id` ASC LIMIT 1 /*application='Camaar'*/
+ElementoForm Load (0.2ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`enunciado` = 'Como você avalia a dificuldade das listas de exercícios?' AND `elemento_forms`.`formulario_id` = 1 LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+ElementoForm Create (0.6ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:29:59.134542', 'Como você avalia a dificuldade das listas de exercícios?', 1, 2, 'Múltipla Escolha', '2026-06-30 17:29:59.134542') /*application='Camaar'*/
+TRANSACTION (0.3ms)  COMMIT /*application='Camaar'*/
+Campo Load (0.2ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` = 2 ORDER BY `campos`.`ordem` ASC /*application='Camaar'*/
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`enunciado` = 'Muito Fácil' AND `campo_forms`.`elemento_form_id` = 2 LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+CampoForm Create (0.7ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:29:59.137415', 2, 'Muito Fácil', 1, NULL, '2026-06-30 17:29:59.137415') /*application='Camaar'*/
+TRANSACTION (0.4ms)  COMMIT /*application='Camaar'*/
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`enunciado` = 'Adequada' AND `campo_forms`.`elemento_form_id` = 2 LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+CampoForm Create (0.7ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:29:59.139829', 2, 'Adequada', 2, NULL, '2026-06-30 17:29:59.139829') /*application='Camaar'*/
+TRANSACTION (0.4ms)  COMMIT /*application='Camaar'*/
+CampoForm Load (0.3ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`enunciado` = 'Muito Difícil' AND `campo_forms`.`elemento_form_id` = 2 LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+CampoForm Create (0.7ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:29:59.142373', 2, 'Muito Difícil', 3, NULL, '2026-06-30 17:29:59.142373') /*application='Camaar'*/
+TRANSACTION (0.4ms)  COMMIT /*application='Camaar'*/
+Campo Load (0.3ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` = 3 ORDER BY `campos`.`id` ASC LIMIT 1 /*application='Camaar'*/
+ElementoForm Load (0.2ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`enunciado` = 'Deixe um comentário ou sugestão sobre a disciplina' AND `elemento_forms`.`formulario_id` = 1 LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+ElementoForm Create (0.7ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:29:59.145656', 'Deixe um comentário ou sugestão sobre a disciplina', 1, 3, 'Texto', '2026-06-30 17:29:59.145656') /*application='Camaar'*/
+TRANSACTION (0.4ms)  COMMIT /*application='Camaar'*/
+RespostaForm Load (0.4ms)  SELECT `resposta_forms`.* FROM `resposta_forms` WHERE `resposta_forms`.`formulario_id` = 1 AND `resposta_forms`.`usuario_id` = 5 LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+RespostaForm Exists? (0.2ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 5 AND `resposta_forms`.`formulario_id` = 1 LIMIT 1 /*application='Camaar'*/
+RespostaForm Create (0.3ms)  INSERT INTO `resposta_forms` (`created_at`, `data_submissao`, `formulario_id`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:29:59.154837', '2026-06-30', 1, '2026-06-30 17:29:59.154837', 5) /*application='Camaar'*/
+TRANSACTION (0.4ms)  COMMIT /*application='Camaar'*/
+ElementoForm Load (0.1ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`formulario_id` = 1 ORDER BY `elemento_forms`.`ordem` ASC /*application='Camaar'*/
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` = 1 AND `campo_forms`.`enunciado` = '5' LIMIT 1 /*application='Camaar'*/
+RespostaElem Load (0.8ms)  SELECT `resposta_elems`.* FROM `resposta_elems` WHERE `resposta_elems`.`resposta_form_id` = 1 AND `resposta_elems`.`elemento_form_id` = 1 LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+RespostaElem Create (0.3ms)  INSERT INTO `resposta_elems` (`campo_form_id`, `created_at`, `elemento_form_id`, `resposta_form_id`, `texto_resposta`, `updated_at`) VALUES (5, '2026-06-30 17:29:59.164970', 1, 1, '5', '2026-06-30 17:29:59.164970') /*application='Camaar'*/
+TRANSACTION (0.5ms)  COMMIT /*application='Camaar'*/
+CampoForm Load (0.3ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` = 2 AND `campo_forms`.`enunciado` = 'Adequada' LIMIT 1 /*application='Camaar'*/
+RespostaElem Load (0.2ms)  SELECT `resposta_elems`.* FROM `resposta_elems` WHERE `resposta_elems`.`resposta_form_id` = 1 AND `resposta_elems`.`elemento_form_id` = 2 LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+RespostaElem Create (0.8ms)  INSERT INTO `resposta_elems` (`campo_form_id`, `created_at`, `elemento_form_id`, `resposta_form_id`, `texto_resposta`, `updated_at`) VALUES (7, '2026-06-30 17:29:59.172223', 2, 1, 'Adequada', '2026-06-30 17:29:59.172223') /*application='Camaar'*/
+TRANSACTION (0.4ms)  COMMIT /*application='Camaar'*/
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` = 3 AND `campo_forms`.`enunciado` = 'Ótima didática, recomendo!' LIMIT 1 /*application='Camaar'*/
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` = 3 ORDER BY `campo_forms`.`id` ASC LIMIT 1 /*application='Camaar'*/
+RespostaElem Load (0.2ms)  SELECT `resposta_elems`.* FROM `resposta_elems` WHERE `resposta_elems`.`resposta_form_id` = 1 AND `resposta_elems`.`elemento_form_id` = 3 LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+RespostaElem Create (0.8ms)  INSERT INTO `resposta_elems` (`campo_form_id`, `created_at`, `elemento_form_id`, `resposta_form_id`, `texto_resposta`, `updated_at`) VALUES (NULL, '2026-06-30 17:29:59.176349', 3, 1, 'Ótima didática, recomendo!', '2026-06-30 17:29:59.176349') /*application='Camaar'*/
+TRANSACTION (0.4ms)  COMMIT /*application='Camaar'*/
+RespostaForm Load (0.3ms)  SELECT `resposta_forms`.* FROM `resposta_forms` WHERE `resposta_forms`.`formulario_id` = 1 AND `resposta_forms`.`usuario_id` = 6 LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+RespostaForm Exists? (0.8ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 6 AND `resposta_forms`.`formulario_id` = 1 LIMIT 1 /*application='Camaar'*/
+RespostaForm Create (0.2ms)  INSERT INTO `resposta_forms` (`created_at`, `data_submissao`, `formulario_id`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:29:59.180886', '2026-06-30', 1, '2026-06-30 17:29:59.180886', 6) /*application='Camaar'*/
+TRANSACTION (0.4ms)  COMMIT /*application='Camaar'*/
+ElementoForm Load (0.2ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`formulario_id` = 1 ORDER BY `elemento_forms`.`ordem` ASC /*application='Camaar'*/
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` = 1 AND `campo_forms`.`enunciado` = '4' LIMIT 1 /*application='Camaar'*/
+RespostaElem Load (0.2ms)  SELECT `resposta_elems`.* FROM `resposta_elems` WHERE `resposta_elems`.`resposta_form_id` = 2 AND `resposta_elems`.`elemento_form_id` = 1 LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+RespostaElem Create (0.6ms)  INSERT INTO `resposta_elems` (`campo_form_id`, `created_at`, `elemento_form_id`, `resposta_form_id`, `texto_resposta`, `updated_at`) VALUES (4, '2026-06-30 17:29:59.184381', 1, 2, '4', '2026-06-30 17:29:59.184381') /*application='Camaar'*/
+TRANSACTION (0.3ms)  COMMIT /*application='Camaar'*/
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` = 2 AND `campo_forms`.`enunciado` = 'Muito Difícil' LIMIT 1 /*application='Camaar'*/
+RespostaElem Load (0.2ms)  SELECT `resposta_elems`.* FROM `resposta_elems` WHERE `resposta_elems`.`resposta_form_id` = 2 AND `resposta_elems`.`elemento_form_id` = 2 LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+RespostaElem Create (0.7ms)  INSERT INTO `resposta_elems` (`campo_form_id`, `created_at`, `elemento_form_id`, `resposta_form_id`, `texto_resposta`, `updated_at`) VALUES (8, '2026-06-30 17:29:59.187485', 2, 2, 'Muito Difícil', '2026-06-30 17:29:59.187485') /*application='Camaar'*/
+TRANSACTION (0.4ms)  COMMIT /*application='Camaar'*/
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` = 3 AND `campo_forms`.`enunciado` = 'As listas poderiam ter mais exemplos práticos.' LIMIT 1 /*application='Camaar'*/
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` = 3 ORDER BY `campo_forms`.`id` ASC LIMIT 1 /*application='Camaar'*/
+RespostaElem Load (0.2ms)  SELECT `resposta_elems`.* FROM `resposta_elems` WHERE `resposta_elems`.`resposta_form_id` = 2 AND `resposta_elems`.`elemento_form_id` = 3 LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+RespostaElem Create (0.9ms)  INSERT INTO `resposta_elems` (`campo_form_id`, `created_at`, `elemento_form_id`, `resposta_form_id`, `texto_resposta`, `updated_at`) VALUES (NULL, '2026-06-30 17:29:59.191756', 3, 2, 'As listas poderiam ter mais exemplos práticos.', '2026-06-30 17:29:59.191756') /*application='Camaar'*/
+TRANSACTION (0.6ms)  COMMIT /*application='Camaar'*/
+RespostaForm Load (0.3ms)  SELECT `resposta_forms`.* FROM `resposta_forms` WHERE `resposta_forms`.`formulario_id` = 1 AND `resposta_forms`.`usuario_id` = 7 LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+RespostaForm Exists? (0.8ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 7 AND `resposta_forms`.`formulario_id` = 1 LIMIT 1 /*application='Camaar'*/
+RespostaForm Create (0.2ms)  INSERT INTO `resposta_forms` (`created_at`, `data_submissao`, `formulario_id`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:29:59.196046', '2026-06-30', 1, '2026-06-30 17:29:59.196046', 7) /*application='Camaar'*/
+TRANSACTION (0.4ms)  COMMIT /*application='Camaar'*/
+ElementoForm Load (0.2ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`formulario_id` = 1 ORDER BY `elemento_forms`.`ordem` ASC /*application='Camaar'*/
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` = 1 AND `campo_forms`.`enunciado` = '5' LIMIT 1 /*application='Camaar'*/
+RespostaElem Load (0.2ms)  SELECT `resposta_elems`.* FROM `resposta_elems` WHERE `resposta_elems`.`resposta_form_id` = 3 AND `resposta_elems`.`elemento_form_id` = 1 LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+RespostaElem Create (0.8ms)  INSERT INTO `resposta_elems` (`campo_form_id`, `created_at`, `elemento_form_id`, `resposta_form_id`, `texto_resposta`, `updated_at`) VALUES (5, '2026-06-30 17:29:59.199262', 1, 3, '5', '2026-06-30 17:29:59.199262') /*application='Camaar'*/
+TRANSACTION (0.4ms)  COMMIT /*application='Camaar'*/
+CampoForm Load (0.1ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` = 2 AND `campo_forms`.`enunciado` = 'Adequada' LIMIT 1 /*application='Camaar'*/
+RespostaElem Load (0.1ms)  SELECT `resposta_elems`.* FROM `resposta_elems` WHERE `resposta_elems`.`resposta_form_id` = 3 AND `resposta_elems`.`elemento_form_id` = 2 LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+RespostaElem Create (0.7ms)  INSERT INTO `resposta_elems` (`campo_form_id`, `created_at`, `elemento_form_id`, `resposta_form_id`, `texto_resposta`, `updated_at`) VALUES (7, '2026-06-30 17:29:59.202179', 2, 3, 'Adequada', '2026-06-30 17:29:59.202179') /*application='Camaar'*/
+TRANSACTION (0.4ms)  COMMIT /*application='Camaar'*/
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` = 3 AND `campo_forms`.`enunciado` = 'Sem reclamações, matéria excelente.' LIMIT 1 /*application='Camaar'*/
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` = 3 ORDER BY `campo_forms`.`id` ASC LIMIT 1 /*application='Camaar'*/
+RespostaElem Load (0.3ms)  SELECT `resposta_elems`.* FROM `resposta_elems` WHERE `resposta_elems`.`resposta_form_id` = 3 AND `resposta_elems`.`elemento_form_id` = 3 LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+RespostaElem Create (0.8ms)  INSERT INTO `resposta_elems` (`campo_form_id`, `created_at`, `elemento_form_id`, `resposta_form_id`, `texto_resposta`, `updated_at`) VALUES (NULL, '2026-06-30 17:29:59.205866', 3, 3, 'Sem reclamações, matéria excelente.', '2026-06-30 17:29:59.205866') /*application='Camaar'*/
+TRANSACTION (0.4ms)  COMMIT /*application='Camaar'*/
+Formulario Load (0.2ms)  SELECT `formularios`.* FROM `formularios` WHERE `formularios`.`turma_id` = 2 LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+Formulario Create (0.8ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:29:59.208299', NULL, NULL, NULL, NULL, 2, '2026-06-30 17:29:59.208299') /*application='Camaar'*/
+TRANSACTION (0.5ms)  COMMIT /*application='Camaar'*/
+Elemento Load (0.3ms)  SELECT `elementos`.* FROM `elementos` WHERE `elementos`.`template_id` = 1 ORDER BY `elementos`.`ordem` ASC /*application='Camaar'*/
+Campo Load (0.2ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` = 1 ORDER BY `campos`.`id` ASC LIMIT 1 /*application='Camaar'*/
+ElementoForm Load (0.2ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`enunciado` = 'Avalie a didática do professor' AND `elemento_forms`.`formulario_id` = 2 LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+ElementoForm Create (0.8ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:29:59.212193', 'Avalie a didática do professor', 2, 1, 'Múltipla Escolha', '2026-06-30 17:29:59.212193') /*application='Camaar'*/
+TRANSACTION (0.5ms)  COMMIT /*application='Camaar'*/
+Campo Load (0.2ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` = 1 ORDER BY `campos`.`ordem` ASC /*application='Camaar'*/
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`enunciado` = '1' AND `campo_forms`.`elemento_form_id` = 4 LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+CampoForm Create (0.8ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:29:59.215412', 4, '1', 1, NULL, '2026-06-30 17:29:59.215412') /*application='Camaar'*/
+TRANSACTION (0.4ms)  COMMIT /*application='Camaar'*/
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`enunciado` = '2' AND `campo_forms`.`elemento_form_id` = 4 LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+CampoForm Create (0.8ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:29:59.217909', 4, '2', 2, NULL, '2026-06-30 17:29:59.217909') /*application='Camaar'*/
+TRANSACTION (0.4ms)  COMMIT /*application='Camaar'*/
+CampoForm Load (0.1ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`enunciado` = '3' AND `campo_forms`.`elemento_form_id` = 4 LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+CampoForm Create (0.7ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:29:59.220558', 4, '3', 3, NULL, '2026-06-30 17:29:59.220558') /*application='Camaar'*/
+TRANSACTION (0.2ms)  COMMIT /*application='Camaar'*/
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`enunciado` = '4' AND `campo_forms`.`elemento_form_id` = 4 LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+CampoForm Create (0.8ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:29:59.222878', 4, '4', 4, NULL, '2026-06-30 17:29:59.222878') /*application='Camaar'*/
+TRANSACTION (0.4ms)  COMMIT /*application='Camaar'*/
+CampoForm Load (0.3ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`enunciado` = '5' AND `campo_forms`.`elemento_form_id` = 4 LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+CampoForm Create (0.8ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:29:59.228001', 4, '5', 5, NULL, '2026-06-30 17:29:59.228001') /*application='Camaar'*/
+TRANSACTION (0.3ms)  COMMIT /*application='Camaar'*/
+Campo Load (0.2ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` = 2 ORDER BY `campos`.`id` ASC LIMIT 1 /*application='Camaar'*/
+ElementoForm Load (0.2ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`enunciado` = 'Como você avalia a dificuldade das listas de exercícios?' AND `elemento_forms`.`formulario_id` = 2 LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+ElementoForm Create (1.1ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:29:59.231376', 'Como você avalia a dificuldade das listas de exercícios?', 2, 2, 'Múltipla Escolha', '2026-06-30 17:29:59.231376') /*application='Camaar'*/
+TRANSACTION (0.4ms)  COMMIT /*application='Camaar'*/
+Campo Load (0.3ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` = 2 ORDER BY `campos`.`ordem` ASC /*application='Camaar'*/
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`enunciado` = 'Muito Fácil' AND `campo_forms`.`elemento_form_id` = 5 LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+CampoForm Create (0.8ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:29:59.234977', 5, 'Muito Fácil', 1, NULL, '2026-06-30 17:29:59.234977') /*application='Camaar'*/
+TRANSACTION (0.4ms)  COMMIT /*application='Camaar'*/
+CampoForm Load (0.3ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`enunciado` = 'Adequada' AND `campo_forms`.`elemento_form_id` = 5 LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+CampoForm Create (0.7ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:29:59.238301', 5, 'Adequada', 2, NULL, '2026-06-30 17:29:59.238301') /*application='Camaar'*/
+TRANSACTION (0.3ms)  COMMIT /*application='Camaar'*/
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`enunciado` = 'Muito Difícil' AND `campo_forms`.`elemento_form_id` = 5 LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+CampoForm Create (1.0ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:29:59.240749', 5, 'Muito Difícil', 3, NULL, '2026-06-30 17:29:59.240749') /*application='Camaar'*/
+TRANSACTION (1.8ms)  COMMIT /*application='Camaar'*/
+Campo Load (0.4ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` = 3 ORDER BY `campos`.`id` ASC LIMIT 1 /*application='Camaar'*/
+ElementoForm Load (0.2ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`enunciado` = 'Deixe um comentário ou sugestão sobre a disciplina' AND `elemento_forms`.`formulario_id` = 2 LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+ElementoForm Create (0.8ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:29:59.245923', 'Deixe um comentário ou sugestão sobre a disciplina', 2, 3, 'Texto', '2026-06-30 17:29:59.245923') /*application='Camaar'*/
+TRANSACTION (0.5ms)  COMMIT /*application='Camaar'*/
+RespostaForm Load (0.2ms)  SELECT `resposta_forms`.* FROM `resposta_forms` WHERE `resposta_forms`.`formulario_id` = 2 AND `resposta_forms`.`usuario_id` = 7 LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+RespostaForm Exists? (0.9ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 7 AND `resposta_forms`.`formulario_id` = 2 LIMIT 1 /*application='Camaar'*/
+RespostaForm Create (0.3ms)  INSERT INTO `resposta_forms` (`created_at`, `data_submissao`, `formulario_id`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:29:59.250277', '2026-06-30', 2, '2026-06-30 17:29:59.250277', 7) /*application='Camaar'*/
+TRANSACTION (0.4ms)  COMMIT /*application='Camaar'*/
+ElementoForm Load (0.1ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`formulario_id` = 2 ORDER BY `elemento_forms`.`ordem` ASC /*application='Camaar'*/
+CampoForm Load (0.1ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` = 4 AND `campo_forms`.`enunciado` = '3' LIMIT 1 /*application='Camaar'*/
+RespostaElem Load (0.2ms)  SELECT `resposta_elems`.* FROM `resposta_elems` WHERE `resposta_elems`.`resposta_form_id` = 4 AND `resposta_elems`.`elemento_form_id` = 4 LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+RespostaElem Create (0.8ms)  INSERT INTO `resposta_elems` (`campo_form_id`, `created_at`, `elemento_form_id`, `resposta_form_id`, `texto_resposta`, `updated_at`) VALUES (11, '2026-06-30 17:29:59.253961', 4, 4, '3', '2026-06-30 17:29:59.253961') /*application='Camaar'*/
+TRANSACTION (0.4ms)  COMMIT /*application='Camaar'*/
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` = 5 AND `campo_forms`.`enunciado` = 'Muito Difícil' LIMIT 1 /*application='Camaar'*/
+RespostaElem Load (0.2ms)  SELECT `resposta_elems`.* FROM `resposta_elems` WHERE `resposta_elems`.`resposta_form_id` = 4 AND `resposta_elems`.`elemento_form_id` = 5 LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+RespostaElem Create (0.8ms)  INSERT INTO `resposta_elems` (`campo_form_id`, `created_at`, `elemento_form_id`, `resposta_form_id`, `texto_resposta`, `updated_at`) VALUES (16, '2026-06-30 17:29:59.257091', 5, 4, 'Muito Difícil', '2026-06-30 17:29:59.257091') /*application='Camaar'*/
+TRANSACTION (0.4ms)  COMMIT /*application='Camaar'*/
+CampoForm Load (0.3ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` = 6 AND `campo_forms`.`enunciado` = 'O ritmo das aulas está muito acelerado.' LIMIT 1 /*application='Camaar'*/
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` = 6 ORDER BY `campo_forms`.`id` ASC LIMIT 1 /*application='Camaar'*/
+RespostaElem Load (0.2ms)  SELECT `resposta_elems`.* FROM `resposta_elems` WHERE `resposta_elems`.`resposta_form_id` = 4 AND `resposta_elems`.`elemento_form_id` = 6 LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+RespostaElem Create (0.9ms)  INSERT INTO `resposta_elems` (`campo_form_id`, `created_at`, `elemento_form_id`, `resposta_form_id`, `texto_resposta`, `updated_at`) VALUES (NULL, '2026-06-30 17:29:59.260819', 6, 4, 'O ritmo das aulas está muito acelerado.', '2026-06-30 17:29:59.260819') /*application='Camaar'*/
+TRANSACTION (0.5ms)  COMMIT /*application='Camaar'*/
+RespostaForm Load (0.3ms)  SELECT `resposta_forms`.* FROM `resposta_forms` WHERE `resposta_forms`.`formulario_id` = 2 AND `resposta_forms`.`usuario_id` = 8 LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+RespostaForm Exists? (0.8ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 8 AND `resposta_forms`.`formulario_id` = 2 LIMIT 1 /*application='Camaar'*/
+RespostaForm Create (0.2ms)  INSERT INTO `resposta_forms` (`created_at`, `data_submissao`, `formulario_id`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:29:59.264827', '2026-06-30', 2, '2026-06-30 17:29:59.264827', 8) /*application='Camaar'*/
+TRANSACTION (0.4ms)  COMMIT /*application='Camaar'*/
+ElementoForm Load (0.3ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`formulario_id` = 2 ORDER BY `elemento_forms`.`ordem` ASC /*application='Camaar'*/
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` = 4 AND `campo_forms`.`enunciado` = '4' LIMIT 1 /*application='Camaar'*/
+RespostaElem Load (0.1ms)  SELECT `resposta_elems`.* FROM `resposta_elems` WHERE `resposta_elems`.`resposta_form_id` = 5 AND `resposta_elems`.`elemento_form_id` = 4 LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+RespostaElem Create (0.7ms)  INSERT INTO `resposta_elems` (`campo_form_id`, `created_at`, `elemento_form_id`, `resposta_form_id`, `texto_resposta`, `updated_at`) VALUES (12, '2026-06-30 17:29:59.268021', 4, 5, '4', '2026-06-30 17:29:59.268021') /*application='Camaar'*/
+TRANSACTION (0.4ms)  COMMIT /*application='Camaar'*/
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` = 5 AND `campo_forms`.`enunciado` = 'Adequada' LIMIT 1 /*application='Camaar'*/
+RespostaElem Load (0.2ms)  SELECT `resposta_elems`.* FROM `resposta_elems` WHERE `resposta_elems`.`resposta_form_id` = 5 AND `resposta_elems`.`elemento_form_id` = 5 LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+RespostaElem Create (0.8ms)  INSERT INTO `resposta_elems` (`campo_form_id`, `created_at`, `elemento_form_id`, `resposta_form_id`, `texto_resposta`, `updated_at`) VALUES (15, '2026-06-30 17:29:59.271036', 5, 5, 'Adequada', '2026-06-30 17:29:59.271036') /*application='Camaar'*/
+TRANSACTION (0.6ms)  COMMIT /*application='Camaar'*/
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` = 6 AND `campo_forms`.`enunciado` = 'Gostei da metodologia.' LIMIT 1 /*application='Camaar'*/
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` = 6 ORDER BY `campo_forms`.`id` ASC LIMIT 1 /*application='Camaar'*/
+RespostaElem Load (0.2ms)  SELECT `resposta_elems`.* FROM `resposta_elems` WHERE `resposta_elems`.`resposta_form_id` = 5 AND `resposta_elems`.`elemento_form_id` = 6 LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+RespostaElem Create (0.8ms)  INSERT INTO `resposta_elems` (`campo_form_id`, `created_at`, `elemento_form_id`, `resposta_form_id`, `texto_resposta`, `updated_at`) VALUES (NULL, '2026-06-30 17:29:59.274950', 6, 5, 'Gostei da metodologia.', '2026-06-30 17:29:59.274950') /*application='Camaar'*/
+TRANSACTION (0.5ms)  COMMIT /*application='Camaar'*/
+RespostaForm Load (0.3ms)  SELECT `resposta_forms`.* FROM `resposta_forms` WHERE `resposta_forms`.`formulario_id` = 2 AND `resposta_forms`.`usuario_id` = 9 LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+RespostaForm Exists? (0.8ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 9 AND `resposta_forms`.`formulario_id` = 2 LIMIT 1 /*application='Camaar'*/
+RespostaForm Create (0.2ms)  INSERT INTO `resposta_forms` (`created_at`, `data_submissao`, `formulario_id`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:29:59.278936', '2026-06-30', 2, '2026-06-30 17:29:59.278936', 9) /*application='Camaar'*/
+TRANSACTION (0.4ms)  COMMIT /*application='Camaar'*/
+ElementoForm Load (0.2ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`formulario_id` = 2 ORDER BY `elemento_forms`.`ordem` ASC /*application='Camaar'*/
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` = 4 AND `campo_forms`.`enunciado` = '2' LIMIT 1 /*application='Camaar'*/
+RespostaElem Load (0.2ms)  SELECT `resposta_elems`.* FROM `resposta_elems` WHERE `resposta_elems`.`resposta_form_id` = 6 AND `resposta_elems`.`elemento_form_id` = 4 LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+RespostaElem Create (0.8ms)  INSERT INTO `resposta_elems` (`campo_form_id`, `created_at`, `elemento_form_id`, `resposta_form_id`, `texto_resposta`, `updated_at`) VALUES (10, '2026-06-30 17:29:59.282185', 4, 6, '2', '2026-06-30 17:29:59.282185') /*application='Camaar'*/
+TRANSACTION (0.4ms)  COMMIT /*application='Camaar'*/
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` = 5 AND `campo_forms`.`enunciado` = 'Muito Difícil' LIMIT 1 /*application='Camaar'*/
+RespostaElem Load (0.1ms)  SELECT `resposta_elems`.* FROM `resposta_elems` WHERE `resposta_elems`.`resposta_form_id` = 6 AND `resposta_elems`.`elemento_form_id` = 5 LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+RespostaElem Create (0.8ms)  INSERT INTO `resposta_elems` (`campo_form_id`, `created_at`, `elemento_form_id`, `resposta_form_id`, `texto_resposta`, `updated_at`) VALUES (16, '2026-06-30 17:29:59.285244', 5, 6, 'Muito Difícil', '2026-06-30 17:29:59.285244') /*application='Camaar'*/
+TRANSACTION (0.4ms)  COMMIT /*application='Camaar'*/
+CampoForm Load (0.3ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` = 6 AND `campo_forms`.`enunciado` = 'Preciso de mais monitoria para acompanhar.' LIMIT 1 /*application='Camaar'*/
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` = 6 ORDER BY `campo_forms`.`id` ASC LIMIT 1 /*application='Camaar'*/
+RespostaElem Load (0.3ms)  SELECT `resposta_elems`.* FROM `resposta_elems` WHERE `resposta_elems`.`resposta_form_id` = 6 AND `resposta_elems`.`elemento_form_id` = 6 LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+RespostaElem Create (0.8ms)  INSERT INTO `resposta_elems` (`campo_form_id`, `created_at`, `elemento_form_id`, `resposta_form_id`, `texto_resposta`, `updated_at`) VALUES (NULL, '2026-06-30 17:29:59.290480', 6, 6, 'Preciso de mais monitoria para acompanhar.', '2026-06-30 17:29:59.290480') /*application='Camaar'*/
+TRANSACTION (0.4ms)  COMMIT /*application='Camaar'*/
+Formulario Load (0.2ms)  SELECT `formularios`.* FROM `formularios` WHERE `formularios`.`turma_id` = 3 LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+Formulario Create (1.1ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:29:59.293057', NULL, NULL, NULL, NULL, 3, '2026-06-30 17:29:59.293057') /*application='Camaar'*/
+TRANSACTION (0.4ms)  COMMIT /*application='Camaar'*/
+Elemento Load (0.3ms)  SELECT `elementos`.* FROM `elementos` WHERE `elementos`.`template_id` = 1 ORDER BY `elementos`.`ordem` ASC /*application='Camaar'*/
+Campo Load (0.2ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` = 1 ORDER BY `campos`.`id` ASC LIMIT 1 /*application='Camaar'*/
+ElementoForm Load (0.2ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`enunciado` = 'Avalie a didática do professor' AND `elemento_forms`.`formulario_id` = 3 LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+ElementoForm Create (0.8ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:29:59.297242', 'Avalie a didática do professor', 3, 1, 'Múltipla Escolha', '2026-06-30 17:29:59.297242') /*application='Camaar'*/
+TRANSACTION (0.4ms)  COMMIT /*application='Camaar'*/
+Campo Load (0.2ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` = 1 ORDER BY `campos`.`ordem` ASC /*application='Camaar'*/
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`enunciado` = '1' AND `campo_forms`.`elemento_form_id` = 7 LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+CampoForm Create (0.7ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:29:59.300954', 7, '1', 1, NULL, '2026-06-30 17:29:59.300954') /*application='Camaar'*/
+TRANSACTION (0.4ms)  COMMIT /*application='Camaar'*/
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`enunciado` = '2' AND `campo_forms`.`elemento_form_id` = 7 LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+CampoForm Create (0.7ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:29:59.303570', 7, '2', 2, NULL, '2026-06-30 17:29:59.303570') /*application='Camaar'*/
+TRANSACTION (0.4ms)  COMMIT /*application='Camaar'*/
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`enunciado` = '3' AND `campo_forms`.`elemento_form_id` = 7 LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+CampoForm Create (0.7ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:29:59.306080', 7, '3', 3, NULL, '2026-06-30 17:29:59.306080') /*application='Camaar'*/
+TRANSACTION (0.4ms)  COMMIT /*application='Camaar'*/
+CampoForm Load (0.3ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`enunciado` = '4' AND `campo_forms`.`elemento_form_id` = 7 LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+CampoForm Create (1.1ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:29:59.308911', 7, '4', 4, NULL, '2026-06-30 17:29:59.308911') /*application='Camaar'*/
+TRANSACTION (0.4ms)  COMMIT /*application='Camaar'*/
+CampoForm Load (0.3ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`enunciado` = '5' AND `campo_forms`.`elemento_form_id` = 7 LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+CampoForm Create (0.8ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:29:59.312214', 7, '5', 5, NULL, '2026-06-30 17:29:59.312214') /*application='Camaar'*/
+TRANSACTION (0.4ms)  COMMIT /*application='Camaar'*/
+Campo Load (0.2ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` = 2 ORDER BY `campos`.`id` ASC LIMIT 1 /*application='Camaar'*/
+ElementoForm Load (0.2ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`enunciado` = 'Como você avalia a dificuldade das listas de exercícios?' AND `elemento_forms`.`formulario_id` = 3 LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+ElementoForm Create (0.7ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:29:59.315404', 'Como você avalia a dificuldade das listas de exercícios?', 3, 2, 'Múltipla Escolha', '2026-06-30 17:29:59.315404') /*application='Camaar'*/
+TRANSACTION (0.4ms)  COMMIT /*application='Camaar'*/
+Campo Load (0.2ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` = 2 ORDER BY `campos`.`ordem` ASC /*application='Camaar'*/
+CampoForm Load (0.1ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`enunciado` = 'Muito Fácil' AND `campo_forms`.`elemento_form_id` = 8 LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+CampoForm Create (0.6ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:29:59.318465', 8, 'Muito Fácil', 1, NULL, '2026-06-30 17:29:59.318465') /*application='Camaar'*/
+TRANSACTION (0.4ms)  COMMIT /*application='Camaar'*/
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`enunciado` = 'Adequada' AND `campo_forms`.`elemento_form_id` = 8 LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+CampoForm Create (0.7ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:29:59.320795', 8, 'Adequada', 2, NULL, '2026-06-30 17:29:59.320795') /*application='Camaar'*/
+TRANSACTION (0.3ms)  COMMIT /*application='Camaar'*/
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`enunciado` = 'Muito Difícil' AND `campo_forms`.`elemento_form_id` = 8 LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+CampoForm Create (0.7ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:29:59.323223', 8, 'Muito Difícil', 3, NULL, '2026-06-30 17:29:59.323223') /*application='Camaar'*/
+TRANSACTION (0.4ms)  COMMIT /*application='Camaar'*/
+Campo Load (0.2ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` = 3 ORDER BY `campos`.`id` ASC LIMIT 1 /*application='Camaar'*/
+ElementoForm Load (0.2ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`enunciado` = 'Deixe um comentário ou sugestão sobre a disciplina' AND `elemento_forms`.`formulario_id` = 3 LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.2ms)  BEGIN /*application='Camaar'*/
+ElementoForm Create (0.9ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:29:59.326365', 'Deixe um comentário ou sugestão sobre a disciplina', 3, 3, 'Texto', '2026-06-30 17:29:59.326365') /*application='Camaar'*/
+TRANSACTION (0.4ms)  COMMIT /*application='Camaar'*/
+RespostaForm Load (0.3ms)  SELECT `resposta_forms`.* FROM `resposta_forms` WHERE `resposta_forms`.`formulario_id` = 3 AND `resposta_forms`.`usuario_id` = 5 LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+RespostaForm Exists? (0.8ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 5 AND `resposta_forms`.`formulario_id` = 3 LIMIT 1 /*application='Camaar'*/
+RespostaForm Create (0.2ms)  INSERT INTO `resposta_forms` (`created_at`, `data_submissao`, `formulario_id`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:29:59.330282', '2026-06-30', 3, '2026-06-30 17:29:59.330282', 5) /*application='Camaar'*/
+TRANSACTION (0.4ms)  COMMIT /*application='Camaar'*/
+ElementoForm Load (0.2ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`formulario_id` = 3 ORDER BY `elemento_forms`.`ordem` ASC /*application='Camaar'*/
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` = 7 AND `campo_forms`.`enunciado` = '5' LIMIT 1 /*application='Camaar'*/
+RespostaElem Load (0.2ms)  SELECT `resposta_elems`.* FROM `resposta_elems` WHERE `resposta_elems`.`resposta_form_id` = 7 AND `resposta_elems`.`elemento_form_id` = 7 LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+RespostaElem Create (0.8ms)  INSERT INTO `resposta_elems` (`campo_form_id`, `created_at`, `elemento_form_id`, `resposta_form_id`, `texto_resposta`, `updated_at`) VALUES (21, '2026-06-30 17:29:59.333512', 7, 7, '5', '2026-06-30 17:29:59.333512') /*application='Camaar'*/
+TRANSACTION (0.3ms)  COMMIT /*application='Camaar'*/
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` = 8 AND `campo_forms`.`enunciado` = 'Muito Fácil' LIMIT 1 /*application='Camaar'*/
+RespostaElem Load (0.1ms)  SELECT `resposta_elems`.* FROM `resposta_elems` WHERE `resposta_elems`.`resposta_form_id` = 7 AND `resposta_elems`.`elemento_form_id` = 8 LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+RespostaElem Create (0.6ms)  INSERT INTO `resposta_elems` (`campo_form_id`, `created_at`, `elemento_form_id`, `resposta_form_id`, `texto_resposta`, `updated_at`) VALUES (22, '2026-06-30 17:29:59.336659', 8, 7, 'Muito Fácil', '2026-06-30 17:29:59.336659') /*application='Camaar'*/
+TRANSACTION (0.6ms)  COMMIT /*application='Camaar'*/
+CampoForm Load (0.3ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` = 9 AND `campo_forms`.`enunciado` = 'Projetos práticos são muito divertidos!' LIMIT 1 /*application='Camaar'*/
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` = 9 ORDER BY `campo_forms`.`id` ASC LIMIT 1 /*application='Camaar'*/
+RespostaElem Load (0.2ms)  SELECT `resposta_elems`.* FROM `resposta_elems` WHERE `resposta_elems`.`resposta_form_id` = 7 AND `resposta_elems`.`elemento_form_id` = 9 LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+RespostaElem Create (0.8ms)  INSERT INTO `resposta_elems` (`campo_form_id`, `created_at`, `elemento_form_id`, `resposta_form_id`, `texto_resposta`, `updated_at`) VALUES (NULL, '2026-06-30 17:29:59.340415', 9, 7, 'Projetos práticos são muito divertidos!', '2026-06-30 17:29:59.340415') /*application='Camaar'*/
+TRANSACTION (0.7ms)  COMMIT /*application='Camaar'*/
+RespostaForm Load (0.3ms)  SELECT `resposta_forms`.* FROM `resposta_forms` WHERE `resposta_forms`.`formulario_id` = 3 AND `resposta_forms`.`usuario_id` = 9 LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+RespostaForm Exists? (1.8ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 9 AND `resposta_forms`.`formulario_id` = 3 LIMIT 1 /*application='Camaar'*/
+RespostaForm Create (0.3ms)  INSERT INTO `resposta_forms` (`created_at`, `data_submissao`, `formulario_id`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:29:59.345589', '2026-06-30', 3, '2026-06-30 17:29:59.345589', 9) /*application='Camaar'*/
+TRANSACTION (0.5ms)  COMMIT /*application='Camaar'*/
+ElementoForm Load (0.3ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`formulario_id` = 3 ORDER BY `elemento_forms`.`ordem` ASC /*application='Camaar'*/
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` = 7 AND `campo_forms`.`enunciado` = '5' LIMIT 1 /*application='Camaar'*/
+RespostaElem Load (0.2ms)  SELECT `resposta_elems`.* FROM `resposta_elems` WHERE `resposta_elems`.`resposta_form_id` = 8 AND `resposta_elems`.`elemento_form_id` = 7 LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+RespostaElem Create (1.0ms)  INSERT INTO `resposta_elems` (`campo_form_id`, `created_at`, `elemento_form_id`, `resposta_form_id`, `texto_resposta`, `updated_at`) VALUES (21, '2026-06-30 17:29:59.348967', 7, 8, '5', '2026-06-30 17:29:59.348967') /*application='Camaar'*/
+TRANSACTION (0.4ms)  COMMIT /*application='Camaar'*/
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` = 8 AND `campo_forms`.`enunciado` = 'Adequada' LIMIT 1 /*application='Camaar'*/
+RespostaElem Load (0.1ms)  SELECT `resposta_elems`.* FROM `resposta_elems` WHERE `resposta_elems`.`resposta_form_id` = 8 AND `resposta_elems`.`elemento_form_id` = 8 LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+RespostaElem Create (0.7ms)  INSERT INTO `resposta_elems` (`campo_form_id`, `created_at`, `elemento_form_id`, `resposta_form_id`, `texto_resposta`, `updated_at`) VALUES (23, '2026-06-30 17:29:59.352327', 8, 8, 'Adequada', '2026-06-30 17:29:59.352327') /*application='Camaar'*/
+TRANSACTION (0.4ms)  COMMIT /*application='Camaar'*/
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` = 9 AND `campo_forms`.`enunciado` = 'O professor tira todas as dúvidas e os projetos ajudam muito.' LIMIT 1 /*application='Camaar'*/
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` = 9 ORDER BY `campo_forms`.`id` ASC LIMIT 1 /*application='Camaar'*/
+RespostaElem Load (0.2ms)  SELECT `resposta_elems`.* FROM `resposta_elems` WHERE `resposta_elems`.`resposta_form_id` = 8 AND `resposta_elems`.`elemento_form_id` = 9 LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+RespostaElem Create (0.8ms)  INSERT INTO `resposta_elems` (`campo_form_id`, `created_at`, `elemento_form_id`, `resposta_form_id`, `texto_resposta`, `updated_at`) VALUES (NULL, '2026-06-30 17:29:59.356491', 9, 8, 'O professor tira todas as dúvidas e os projetos ajudam muito.', '2026-06-30 17:29:59.356491') /*application='Camaar'*/
+TRANSACTION (0.4ms)  COMMIT /*application='Camaar'*/
+RespostaForm Load (0.2ms)  SELECT `resposta_forms`.* FROM `resposta_forms` WHERE `resposta_forms`.`formulario_id` = 3 AND `resposta_forms`.`usuario_id` = 8 LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+RespostaForm Exists? (0.8ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 8 AND `resposta_forms`.`formulario_id` = 3 LIMIT 1 /*application='Camaar'*/
+RespostaForm Create (0.3ms)  INSERT INTO `resposta_forms` (`created_at`, `data_submissao`, `formulario_id`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:29:59.360445', '2026-06-30', 3, '2026-06-30 17:29:59.360445', 8) /*application='Camaar'*/
+TRANSACTION (0.4ms)  COMMIT /*application='Camaar'*/
+ElementoForm Load (0.2ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`formulario_id` = 3 ORDER BY `elemento_forms`.`ordem` ASC /*application='Camaar'*/
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` = 7 AND `campo_forms`.`enunciado` = '4' LIMIT 1 /*application='Camaar'*/
+RespostaElem Load (0.2ms)  SELECT `resposta_elems`.* FROM `resposta_elems` WHERE `resposta_elems`.`resposta_form_id` = 9 AND `resposta_elems`.`elemento_form_id` = 7 LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+RespostaElem Create (0.9ms)  INSERT INTO `resposta_elems` (`campo_form_id`, `created_at`, `elemento_form_id`, `resposta_form_id`, `texto_resposta`, `updated_at`) VALUES (20, '2026-06-30 17:29:59.363925', 7, 9, '4', '2026-06-30 17:29:59.363925') /*application='Camaar'*/
+TRANSACTION (0.4ms)  COMMIT /*application='Camaar'*/
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` = 8 AND `campo_forms`.`enunciado` = 'Adequada' LIMIT 1 /*application='Camaar'*/
+RespostaElem Load (0.2ms)  SELECT `resposta_elems`.* FROM `resposta_elems` WHERE `resposta_elems`.`resposta_form_id` = 9 AND `resposta_elems`.`elemento_form_id` = 8 LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+RespostaElem Create (0.9ms)  INSERT INTO `resposta_elems` (`campo_form_id`, `created_at`, `elemento_form_id`, `resposta_form_id`, `texto_resposta`, `updated_at`) VALUES (23, '2026-06-30 17:29:59.367632', 8, 9, 'Adequada', '2026-06-30 17:29:59.367632') /*application='Camaar'*/
+TRANSACTION (0.4ms)  COMMIT /*application='Camaar'*/
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` = 9 AND `campo_forms`.`enunciado` = 'Gostaria de mais exercícios de fixação antes das provas.' LIMIT 1 /*application='Camaar'*/
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` = 9 ORDER BY `campo_forms`.`id` ASC LIMIT 1 /*application='Camaar'*/
+RespostaElem Load (0.3ms)  SELECT `resposta_elems`.* FROM `resposta_elems` WHERE `resposta_elems`.`resposta_form_id` = 9 AND `resposta_elems`.`elemento_form_id` = 9 LIMIT 1 /*application='Camaar'*/
+TRANSACTION (0.1ms)  BEGIN /*application='Camaar'*/
+RespostaElem Create (0.8ms)  INSERT INTO `resposta_elems` (`campo_form_id`, `created_at`, `elemento_form_id`, `resposta_form_id`, `texto_resposta`, `updated_at`) VALUES (NULL, '2026-06-30 17:29:59.371441', 9, 9, 'Gostaria de mais exercícios de fixação antes das provas.', '2026-06-30 17:29:59.371441') /*application='Camaar'*/
+TRANSACTION (0.4ms)  COMMIT /*application='Camaar'*/
+ +
+ + + + + + + + diff --git a/doc/log/test_log.html b/doc/log/test_log.html new file mode 100644 index 0000000000..9dca07235e --- /dev/null +++ b/doc/log/test_log.html @@ -0,0 +1,29355 @@ + + + + + + + +test.log - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +
 (7.0ms)  CREATE TABLE `schema_migrations` (`version` varchar(255) NOT NULL PRIMARY KEY)
+ (5.0ms)  CREATE TABLE `ar_internal_metadata` (`key` varchar(255) NOT NULL PRIMARY KEY, `value` varchar(255), `created_at` datetime(6) NOT NULL, `updated_at` datetime(6) NOT NULL)
+ActiveRecord::SchemaMigration Load (1.5ms)  SELECT `schema_migrations`.`version` FROM `schema_migrations` ORDER BY `schema_migrations`.`version` ASC
+ActiveRecord::InternalMetadata Load (5.8ms)  SELECT * FROM `ar_internal_metadata` WHERE `ar_internal_metadata`.`key` = 'schema_sha1' ORDER BY `ar_internal_metadata`.`key` ASC LIMIT 1
+ActiveRecord::SchemaMigration Load (1.9ms)  SELECT `schema_migrations`.`version` FROM `schema_migrations` ORDER BY `schema_migrations`.`version` ASC
+ActiveRecord::InternalMetadata Load (0.2ms)  SELECT * FROM `ar_internal_metadata` WHERE `ar_internal_metadata`.`key` = 'environment' ORDER BY `ar_internal_metadata`.`key` ASC LIMIT 1
+ActiveRecord::SchemaMigration Load (0.1ms)  SELECT `schema_migrations`.`version` FROM `schema_migrations` ORDER BY `schema_migrations`.`version` ASC
+ActiveRecord::InternalMetadata Load (0.1ms)  SELECT * FROM `ar_internal_metadata` WHERE `ar_internal_metadata`.`key` = 'environment' ORDER BY `ar_internal_metadata`.`key` ASC LIMIT 1
+ActiveRecord::SchemaMigration Load (0.2ms)  SELECT `schema_migrations`.`version` FROM `schema_migrations` ORDER BY `schema_migrations`.`version` ASC
+ActiveRecord::InternalMetadata Load (0.2ms)  SELECT * FROM `ar_internal_metadata` WHERE `ar_internal_metadata`.`key` = 'environment' ORDER BY `ar_internal_metadata`.`key` ASC LIMIT 1
+ (79.6ms)  DROP DATABASE IF EXISTS `camaar_test`
+ (0.8ms)  CREATE DATABASE `camaar_test` DEFAULT CHARACTER SET `utf8mb4`
+ (0.5ms)  DROP TABLE IF EXISTS `campo_forms` CASCADE
+ (2.7ms)  CREATE TABLE `campo_forms` (`id` bigint NOT NULL AUTO_INCREMENT PRIMARY KEY, `created_at` datetime(6) NOT NULL, `elemento_form_id` bigint NOT NULL, `enunciado` varchar(255), `ordem` int, `tipo_elemento` varchar(255), `updated_at` datetime(6) NOT NULL, INDEX `index_campo_forms_on_elemento_form_id` (`elemento_form_id`)) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
+ (0.3ms)  DROP TABLE IF EXISTS `campos` CASCADE
+ (2.1ms)  CREATE TABLE `campos` (`id` bigint NOT NULL AUTO_INCREMENT PRIMARY KEY, `created_at` datetime(6) NOT NULL, `elemento_id` bigint NOT NULL, `enunciado` varchar(255), `ordem` int, `tipo_elemento` varchar(255), `updated_at` datetime(6) NOT NULL, INDEX `index_campos_on_elemento_id` (`elemento_id`)) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
+ (0.2ms)  DROP TABLE IF EXISTS `cursos` CASCADE
+ (2.3ms)  CREATE TABLE `cursos` (`id` bigint NOT NULL AUTO_INCREMENT PRIMARY KEY, `codigo` varchar(255), `created_at` datetime(6) NOT NULL, `departamento_id` bigint NOT NULL, `nome` varchar(255), `updated_at` datetime(6) NOT NULL, UNIQUE INDEX `index_cursos_on_codigo` (`codigo`), INDEX `index_cursos_on_departamento_id` (`departamento_id`)) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
+ (0.3ms)  DROP TABLE IF EXISTS `departamentos` CASCADE
+ (2.5ms)  CREATE TABLE `departamentos` (`id` bigint NOT NULL AUTO_INCREMENT PRIMARY KEY, `codigo` varchar(255), `created_at` datetime(6) NOT NULL, `nome` varchar(255), `updated_at` datetime(6) NOT NULL, UNIQUE INDEX `index_departamentos_on_codigo` (`codigo`)) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
+ (0.3ms)  DROP TABLE IF EXISTS `discentes_turmas` CASCADE
+ (1.2ms)  CREATE TABLE `discentes_turmas` (`discente_id` bigint NOT NULL, `turma_id` bigint NOT NULL) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
+ (0.2ms)  DROP TABLE IF EXISTS `disciplinas` CASCADE
+ (2.3ms)  CREATE TABLE `disciplinas` (`id` bigint NOT NULL AUTO_INCREMENT PRIMARY KEY, `codigo` varchar(255), `created_at` datetime(6) NOT NULL, `departamento_id` bigint NOT NULL, `nome` varchar(255), `updated_at` datetime(6) NOT NULL, UNIQUE INDEX `index_disciplinas_on_codigo` (`codigo`), INDEX `index_disciplinas_on_departamento_id` (`departamento_id`)) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
+ (0.2ms)  DROP TABLE IF EXISTS `docentes_turmas` CASCADE
+ (1.3ms)  CREATE TABLE `docentes_turmas` (`docente_id` bigint NOT NULL, `turma_id` bigint NOT NULL) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
+ (0.2ms)  DROP TABLE IF EXISTS `elemento_forms` CASCADE
+ (2.0ms)  CREATE TABLE `elemento_forms` (`id` bigint NOT NULL AUTO_INCREMENT PRIMARY KEY, `created_at` datetime(6) NOT NULL, `enunciado` varchar(255), `formulario_id` bigint NOT NULL, `ordem` int, `tipo` varchar(255), `updated_at` datetime(6) NOT NULL, INDEX `index_elemento_forms_on_formulario_id` (`formulario_id`)) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
+ (0.2ms)  DROP TABLE IF EXISTS `elementos` CASCADE
+ (2.0ms)  CREATE TABLE `elementos` (`id` bigint NOT NULL AUTO_INCREMENT PRIMARY KEY, `created_at` datetime(6) NOT NULL, `enunciado` varchar(255), `ordem` int, `template_id` bigint NOT NULL, `updated_at` datetime(6) NOT NULL, INDEX `index_elementos_on_template_id` (`template_id`)) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
+ (0.2ms)  DROP TABLE IF EXISTS `formularios` CASCADE
+ (1.9ms)  CREATE TABLE `formularios` (`id` bigint NOT NULL AUTO_INCREMENT PRIMARY KEY, `created_at` datetime(6) NOT NULL, `data_fim` date, `data_inicio` date, `nome` varchar(255), `titulo` varchar(255), `turma_id` bigint, `updated_at` datetime(6) NOT NULL, INDEX `index_formularios_on_turma_id` (`turma_id`)) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
+ (0.3ms)  DROP TABLE IF EXISTS `resposta_elems` CASCADE
+ (2.5ms)  CREATE TABLE `resposta_elems` (`id` bigint NOT NULL AUTO_INCREMENT PRIMARY KEY, `campo_form_id` bigint, `created_at` datetime(6) NOT NULL, `elemento_form_id` bigint NOT NULL, `resposta_form_id` bigint NOT NULL, `texto_resposta` text, `updated_at` datetime(6) NOT NULL, INDEX `index_resposta_elems_on_campo_form_id` (`campo_form_id`), INDEX `index_resposta_elems_on_elemento_form_id` (`elemento_form_id`), INDEX `index_resposta_elems_on_resposta_form_id` (`resposta_form_id`)) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
+ (0.2ms)  DROP TABLE IF EXISTS `resposta_forms` CASCADE
+ (2.4ms)  CREATE TABLE `resposta_forms` (`id` bigint NOT NULL AUTO_INCREMENT PRIMARY KEY, `created_at` datetime(6) NOT NULL, `data_submissao` date, `formulario_id` bigint NOT NULL, `updated_at` datetime(6) NOT NULL, `usuario_id` bigint NOT NULL, INDEX `index_resposta_forms_on_formulario_id` (`formulario_id`), INDEX `index_resposta_forms_on_usuario_id` (`usuario_id`)) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
+ (0.3ms)  DROP TABLE IF EXISTS `templates` CASCADE
+ (1.7ms)  CREATE TABLE `templates` (`id` bigint NOT NULL AUTO_INCREMENT PRIMARY KEY, `created_at` datetime(6) NOT NULL, `nome` varchar(255), `updated_at` datetime(6) NOT NULL, `usuario_id` bigint NOT NULL, INDEX `index_templates_on_usuario_id` (`usuario_id`)) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
+ (0.3ms)  DROP TABLE IF EXISTS `turmas` CASCADE
+ (2.1ms)  CREATE TABLE `turmas` (`id` bigint NOT NULL AUTO_INCREMENT PRIMARY KEY, `created_at` datetime(6) NOT NULL, `disciplina_id` bigint NOT NULL, `horario` varchar(255), `numero_da_turma` varchar(255), `semestre` varchar(255), `updated_at` datetime(6) NOT NULL, INDEX `index_turmas_on_disciplina_id` (`disciplina_id`)) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
+ (0.3ms)  DROP TABLE IF EXISTS `usuarios` CASCADE
+ (4.4ms)  CREATE TABLE `usuarios` (`id` bigint NOT NULL AUTO_INCREMENT PRIMARY KEY, `created_at` datetime(6) NOT NULL, `curso_id` bigint, `definicao_senha_sent_at` datetime(6), `definicao_senha_token` varchar(255), `departamento_id` bigint, `email` varchar(255), `formacao` varchar(255), `matricula` varchar(255), `nome` varchar(255), `redefinicao_senha_sent_at` datetime(6), `redefinicao_senha_token` varchar(255), `senha_hash` varchar(255), `type` varchar(255), `updated_at` datetime(6) NOT NULL, INDEX `index_usuarios_on_curso_id` (`curso_id`), UNIQUE INDEX `index_usuarios_on_definicao_senha_token` (`definicao_senha_token`), INDEX `index_usuarios_on_departamento_id` (`departamento_id`), UNIQUE INDEX `index_usuarios_on_matricula` (`matricula`), UNIQUE INDEX `index_usuarios_on_redefinicao_senha_token` (`redefinicao_senha_token`)) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
+ (9.0ms)  ALTER TABLE `campo_forms` ADD CONSTRAINT `fk_rails_60e170cc42`
+ +

FOREIGN KEY (elemento_form_id)

+ +
REFERENCES `elemento_forms` (`id`)
+ +



+ +
 (5.4ms)  ALTER TABLE `campos` ADD CONSTRAINT `fk_rails_093ff779d5`
+ +

FOREIGN KEY (elemento_id)

+ +
REFERENCES `elementos` (`id`)
+ +



+ +
 (5.6ms)  ALTER TABLE `cursos` ADD CONSTRAINT `fk_rails_46092b12ee`
+ +

FOREIGN KEY (departamento_id)

+ +
REFERENCES `departamentos` (`id`)
+ +



+ +
 (5.6ms)  ALTER TABLE `disciplinas` ADD CONSTRAINT `fk_rails_a98996a2d4`
+ +

FOREIGN KEY (departamento_id)

+ +
REFERENCES `departamentos` (`id`)
+ +



+ +
 (6.0ms)  ALTER TABLE `elemento_forms` ADD CONSTRAINT `fk_rails_ce2bb731de`
+ +

FOREIGN KEY (formulario_id)

+ +
REFERENCES `formularios` (`id`)
+ +



+ +
 (5.6ms)  ALTER TABLE `elementos` ADD CONSTRAINT `fk_rails_09f770d3fe`
+ +

FOREIGN KEY (template_id)

+ +
REFERENCES `templates` (`id`)
+ +



+ +
 (7.3ms)  ALTER TABLE `formularios` ADD CONSTRAINT `fk_rails_5a2be0c3c1`
+ +

FOREIGN KEY (turma_id)

+ +
REFERENCES `turmas` (`id`)
+ +



+ +
 (6.7ms)  ALTER TABLE `resposta_elems` ADD CONSTRAINT `fk_rails_ecb8874f2e`
+ +

FOREIGN KEY (campo_form_id)

+ +
REFERENCES `campo_forms` (`id`)
+ +



+ +
 (7.5ms)  ALTER TABLE `resposta_elems` ADD CONSTRAINT `fk_rails_ea4cd9531e`
+ +

FOREIGN KEY (elemento_form_id)

+ +
REFERENCES `elemento_forms` (`id`)
+ +



+ +
 (8.3ms)  ALTER TABLE `resposta_elems` ADD CONSTRAINT `fk_rails_3e0ef8f9d3`
+ +

FOREIGN KEY (resposta_form_id)

+ +
REFERENCES `resposta_forms` (`id`)
+ +



+ +
 (12.2ms)  ALTER TABLE `resposta_forms` ADD CONSTRAINT `fk_rails_268bf3b7d8`
+ +

FOREIGN KEY (formulario_id)

+ +
REFERENCES `formularios` (`id`)
+ +



+ +
 (10.3ms)  ALTER TABLE `resposta_forms` ADD CONSTRAINT `fk_rails_983127f47b`
+ +

FOREIGN KEY (usuario_id)

+ +
REFERENCES `usuarios` (`id`)
+ +



+ +
 (8.3ms)  ALTER TABLE `templates` ADD CONSTRAINT `fk_rails_c09983659b`
+ +

FOREIGN KEY (usuario_id)

+ +
REFERENCES `usuarios` (`id`)
+ +



+ +
 (7.7ms)  ALTER TABLE `turmas` ADD CONSTRAINT `fk_rails_76e53910e3`
+ +

FOREIGN KEY (disciplina_id)

+ +
REFERENCES `disciplinas` (`id`)
+ +



+ +
 (13.5ms)  ALTER TABLE `usuarios` ADD CONSTRAINT `fk_rails_5560801d4f`
+ +

FOREIGN KEY (curso_id)

+ +
REFERENCES `cursos` (`id`)
+ +



+ +
 (11.3ms)  ALTER TABLE `usuarios` ADD CONSTRAINT `fk_rails_cd805621d1`
+ +

FOREIGN KEY (departamento_id)

+ +
REFERENCES `departamentos` (`id`)
+ +



+ +
 (1.6ms)  CREATE TABLE `schema_migrations` (`version` varchar(255) NOT NULL PRIMARY KEY)
+ActiveRecord::SchemaMigration Load (0.2ms)  SELECT `schema_migrations`.`version` FROM `schema_migrations` ORDER BY `schema_migrations`.`version` ASC
+ (0.8ms)  INSERT INTO `schema_migrations` (version) VALUES (20260616201400)
+ (0.4ms)  INSERT INTO `schema_migrations` (version) VALUES
+ +

(20260616193744), (20260615105458), (20260602090000), (20260601120000), (20260528002258), (20260528000109), (20260528000107), (20260527235104), (20260527235101), (20260527235057), (20260527235055), (20260527235053), (20260527235031), (20260527235028), (20260527235026), (20260527235010), (20260527234838), (20260527234836), (20260527234834), (20260527234832);

+ +
 (1.9ms)  CREATE TABLE `ar_internal_metadata` (`key` varchar(255) NOT NULL PRIMARY KEY, `value` varchar(255), `created_at` datetime(6) NOT NULL, `updated_at` datetime(6) NOT NULL)
+ActiveRecord::InternalMetadata Load (0.3ms)  SELECT * FROM `ar_internal_metadata` WHERE `ar_internal_metadata`.`key` = 'environment' ORDER BY `ar_internal_metadata`.`key` ASC LIMIT 1
+ActiveRecord::InternalMetadata Create (0.2ms)  INSERT INTO `ar_internal_metadata` (`key`, `value`, `created_at`, `updated_at`) VALUES ('environment', 'test', '2026-06-30 17:24:20.826213', '2026-06-30 17:24:20.826214')
+ActiveRecord::InternalMetadata Load (0.1ms)  SELECT * FROM `ar_internal_metadata` WHERE `ar_internal_metadata`.`key` = 'environment' ORDER BY `ar_internal_metadata`.`key` ASC LIMIT 1
+ActiveRecord::InternalMetadata Load (0.1ms)  SELECT * FROM `ar_internal_metadata` WHERE `ar_internal_metadata`.`key` = 'schema_sha1' ORDER BY `ar_internal_metadata`.`key` ASC LIMIT 1
+ActiveRecord::InternalMetadata Create (0.2ms)  INSERT INTO `ar_internal_metadata` (`key`, `value`, `created_at`, `updated_at`) VALUES ('schema_sha1', 'e1b78fd7ae7089effd3f16f06c428e1d3c71f2d4', '2026-06-30 17:24:20.827742', '2026-06-30 17:24:20.827743')
+ActiveRecord::SchemaMigration Load (0.3ms)  SELECT `schema_migrations`.`version` FROM `schema_migrations` ORDER BY `schema_migrations`.`version` ASC
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (1.0ms)  SELECT `departamentos`.* FROM `departamentos` ORDER BY `departamentos`.`id` ASC LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:24:21.111177', 'Ciência da Computação', '2026-06-30 17:24:21.111177')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' ORDER BY `usuarios`.`id` ASC LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'admin' LIMIT 1
+Usuario Exists? (0.1ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@teste.com' LIMIT 1
+Administrador Create (1.1ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:24:21.312890', NULL, NULL, NULL, 1, 'admin@teste.com', NULL, 'admin', 'Admin Teste', NULL, NULL, '$2a$12$y8b9f1jE0.i0Ww6W0lhLUe04Urj5rRefA5hRB/LvbmZXJ8FGyrFgm', 'Administrador', '2026-06-30 17:24:21.312890')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/admin/1/gerenciamento” for 127.0.0.1 at 2026-06-30 14:24:21 -0300 Processing by AdminController#gerenciamento as HTML

+ +
Parameters: {"admin_id" => "1"}
+Administrador Load (0.6ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 1 LIMIT 1
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/gerenciamento.html.erb within layouts/gerenciamento
+Rendered admin/gerenciamento.html.erb within layouts/gerenciamento (Duration: 0.3ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 3.6ms | GC: 0.2ms)
+ +

Completed 200 OK in 14ms (Views: 5.5ms | ActiveRecord: 0.6ms (1 query, 0 cached) | GC: 0.4ms) Started POST “/admin/1/sincronizar_sigaa” for 127.0.0.1 at 2026-06-30 14:24:21 -0300 Processing by AdminController#sincronizar_sigaa as HTML

+ +
Parameters: {"acao" => "importar", "arquivo_classes" => #<ActionDispatch::Http::UploadedFile:0x000000012faa4bc0 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-98814-s3zhei.json>, @content_type="application/json", @original_filename="classes.json", @headers="content-disposition: form-data; name=\"arquivo_classes\"; filename=\"classes.json\"\r\ncontent-type: application/json\r\ncontent-length: 611\r\n">, "arquivo_membros" => #<ActionDispatch::Http::UploadedFile:0x000000012faa4ad0 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-98814-wki6dx.json>, @content_type="application/json", @original_filename="classes.json", @headers="content-disposition: form-data; name=\"arquivo_membros\"; filename=\"classes.json\"\r\ncontent-type: application/json\r\ncontent-length: 611\r\n">, "admin_id" => "1"}
+Administrador Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 1 LIMIT 1
+ +

Redirected to www.example.com/admin/1/gerenciamento Completed 302 Found in 1ms (ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/admin/1/gerenciamento” for 127.0.0.1 at 2026-06-30 14:24:21 -0300 Processing by AdminController#gerenciamento as HTML

+ +
Parameters: {"admin_id" => "1"}
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 1 LIMIT 1
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/gerenciamento.html.erb within layouts/gerenciamento
+Rendered admin/gerenciamento.html.erb within layouts/gerenciamento (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 2.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 3ms (Views: 2.5ms | ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started POST “/admin/1/sincronizar_sigaa” for 127.0.0.1 at 2026-06-30 14:24:21 -0300 Processing by AdminController#sincronizar_sigaa as HTML

+ +
Parameters: {"acao" => "atualizar", "arquivo_classes" => #<ActionDispatch::Http::UploadedFile:0x000000012fa84b18 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-98814-vuzi8w.json>, @content_type="application/json", @original_filename="classes.json", @headers="content-disposition: form-data; name=\"arquivo_classes\"; filename=\"classes.json\"\r\ncontent-type: application/json\r\ncontent-length: 611\r\n">, "arquivo_membros" => #<ActionDispatch::Http::UploadedFile:0x000000012fa84a78 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-98814-1mwx25.json>, @content_type="application/json", @original_filename="classes.json", @headers="content-disposition: form-data; name=\"arquivo_membros\"; filename=\"classes.json\"\r\ncontent-type: application/json\r\ncontent-length: 611\r\n">, "admin_id" => "1"}
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 1 LIMIT 1
+ +

Redirected to www.example.com/admin/1/gerenciamento Completed 302 Found in 1ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/admin/1/gerenciamento” for 127.0.0.1 at 2026-06-30 14:24:21 -0300 Processing by AdminController#gerenciamento as HTML

+ +
Parameters: {"admin_id" => "1"}
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 1 LIMIT 1
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/gerenciamento.html.erb within layouts/gerenciamento
+Rendered admin/gerenciamento.html.erb within layouts/gerenciamento (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 0.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.6ms | ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.4ms)  SELECT `departamentos`.* FROM `departamentos` ORDER BY `departamentos`.`id` ASC LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.4ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:24:21.394617', 'Ciência da Computação', '2026-06-30 17:24:21.394617')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' ORDER BY `usuarios`.`id` ASC LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'admin' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@teste.com' LIMIT 1
+Administrador Create (5.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:24:21.585156', NULL, NULL, NULL, 2, 'admin@teste.com', NULL, 'admin', 'Admin Teste', NULL, NULL, '$2a$12$ou3pcgPDLkLkhaQxFENSbefSIE.u0rz5HNBeC6Qr9aXitS8I6yVIW', 'Administrador', '2026-06-30 17:24:21.585156')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/admin/2/gerenciamento” for 127.0.0.1 at 2026-06-30 14:24:21 -0300 Processing by AdminController#gerenciamento as HTML

+ +
Parameters: {"admin_id" => "2"}
+Administrador Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 2 LIMIT 1
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/gerenciamento.html.erb within layouts/gerenciamento
+Rendered admin/gerenciamento.html.erb within layouts/gerenciamento (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 0.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 2ms (Views: 0.6ms | ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.1ms) Started POST “/admin/2/sincronizar_sigaa” for 127.0.0.1 at 2026-06-30 14:24:21 -0300 Processing by AdminController#sincronizar_sigaa as HTML

+ +
Parameters: {"acao" => "importar", "arquivo_classes" => #<ActionDispatch::Http::UploadedFile:0x00000001260254c8 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-98814-ft0q5p.json>, @content_type="application/json", @original_filename="classes.json", @headers="content-disposition: form-data; name=\"arquivo_classes\"; filename=\"classes.json\"\r\ncontent-type: application/json\r\ncontent-length: 611\r\n">, "arquivo_membros" => #<ActionDispatch::Http::UploadedFile:0x0000000126025478 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-98814-ewjc9d.json>, @content_type="application/json", @original_filename="classes.json", @headers="content-disposition: form-data; name=\"arquivo_membros\"; filename=\"classes.json\"\r\ncontent-type: application/json\r\ncontent-length: 611\r\n">, "admin_id" => "2"}
+Administrador Load (0.5ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 2 LIMIT 1
+ +

Redirected to www.example.com/admin/2/gerenciamento Completed 302 Found in 1ms (ActiveRecord: 0.5ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/admin/2/gerenciamento” for 127.0.0.1 at 2026-06-30 14:24:21 -0300 Processing by AdminController#gerenciamento as HTML

+ +
Parameters: {"admin_id" => "2"}
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 2 LIMIT 1
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/gerenciamento.html.erb within layouts/gerenciamento
+Rendered admin/gerenciamento.html.erb within layouts/gerenciamento (Duration: 0.2ms | GC: 0.1ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 0.4ms | GC: 0.1ms)
+ +

Completed 200 OK in 1ms (Views: 0.5ms | ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.1ms) Started POST “/admin/2/sincronizar_sigaa” for 127.0.0.1 at 2026-06-30 14:24:21 -0300 Processing by AdminController#sincronizar_sigaa as HTML

+ +
Parameters: {"acao" => "atualizar", "arquivo_classes" => #<ActionDispatch::Http::UploadedFile:0x0000000125de21c0 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-98814-4dzxkq.json>, @content_type="application/json", @original_filename="classes.json", @headers="content-disposition: form-data; name=\"arquivo_classes\"; filename=\"classes.json\"\r\ncontent-type: application/json\r\ncontent-length: 611\r\n">, "arquivo_membros" => #<ActionDispatch::Http::UploadedFile:0x0000000125de1f90 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-98814-uuhmfn.json>, @content_type="application/json", @original_filename="classes.json", @headers="content-disposition: form-data; name=\"arquivo_membros\"; filename=\"classes.json\"\r\ncontent-type: application/json\r\ncontent-length: 611\r\n">, "admin_id" => "2"}
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 2 LIMIT 1
+ +

Redirected to www.example.com/admin/2/gerenciamento Completed 302 Found in 1ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/admin/2/gerenciamento” for 127.0.0.1 at 2026-06-30 14:24:21 -0300 Processing by AdminController#gerenciamento as HTML

+ +
Parameters: {"admin_id" => "2"}
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 2 LIMIT 1
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/gerenciamento.html.erb within layouts/gerenciamento
+Rendered admin/gerenciamento.html.erb within layouts/gerenciamento (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 0.4ms | GC: 0.1ms)
+ +

Completed 200 OK in 1ms (Views: 0.5ms | ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.1ms)

+ +
TRANSACTION (0.3ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.4ms)  SELECT `departamentos`.* FROM `departamentos` ORDER BY `departamentos`.`id` ASC LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:24:21.605729', 'Ciência da Computação', '2026-06-30 17:24:21.605729')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' ORDER BY `usuarios`.`id` ASC LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'admin' LIMIT 1
+Usuario Exists? (0.1ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@teste.com' LIMIT 1
+Administrador Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:24:21.795895', NULL, NULL, NULL, 3, 'admin@teste.com', NULL, 'admin', 'Admin Teste', NULL, NULL, '$2a$12$KIKsW50/x0i9fL8w8tvaUOYL0k4Ri2eH2QC17DsuHZNLxS8jWtxo.', 'Administrador', '2026-06-30 17:24:21.795895')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/admin/3/gerenciamento” for 127.0.0.1 at 2026-06-30 14:24:21 -0300 Processing by AdminController#gerenciamento as HTML

+ +
Parameters: {"admin_id" => "3"}
+Administrador Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 3 LIMIT 1
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/gerenciamento.html.erb within layouts/gerenciamento
+Rendered admin/gerenciamento.html.erb within layouts/gerenciamento (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 0.3ms | GC: 0.0ms)
+ +

Completed 200 OK in 2ms (Views: 0.5ms | ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.2ms) Started POST “/admin/3/sincronizar_sigaa” for 127.0.0.1 at 2026-06-30 14:24:21 -0300 Processing by AdminController#sincronizar_sigaa as HTML

+ +
Parameters: {"acao" => "importar", "arquivo_classes" => #<ActionDispatch::Http::UploadedFile:0x00000001258088a8 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-98814-2ld8m1.json>, @content_type="application/json", @original_filename="classes.json", @headers="content-disposition: form-data; name=\"arquivo_classes\"; filename=\"classes.json\"\r\ncontent-type: application/json\r\ncontent-length: 611\r\n">, "arquivo_membros" => #<ActionDispatch::Http::UploadedFile:0x0000000125808858 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-98814-qcp6nm.json>, @content_type="application/json", @original_filename="classes.json", @headers="content-disposition: form-data; name=\"arquivo_membros\"; filename=\"classes.json\"\r\ncontent-type: application/json\r\ncontent-length: 611\r\n">, "admin_id" => "3"}
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 3 LIMIT 1
+ +

Redirected to www.example.com/admin/3/gerenciamento Completed 302 Found in 1ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/admin/3/gerenciamento” for 127.0.0.1 at 2026-06-30 14:24:21 -0300 Processing by AdminController#gerenciamento as HTML

+ +
Parameters: {"admin_id" => "3"}
+Administrador Load (0.1ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 3 LIMIT 1
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/gerenciamento.html.erb within layouts/gerenciamento
+Rendered admin/gerenciamento.html.erb within layouts/gerenciamento (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 0.3ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.4ms | ActiveRecord: 0.1ms (1 query, 0 cached) | GC: 0.0ms) Started POST “/admin/3/sincronizar_sigaa” for 127.0.0.1 at 2026-06-30 14:24:21 -0300 Processing by AdminController#sincronizar_sigaa as HTML

+ +
Parameters: {"acao" => "atualizar", "arquivo_classes" => #<ActionDispatch::Http::UploadedFile:0x0000000125707350 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-98814-qhptm.json>, @content_type="application/json", @original_filename="classes.json", @headers="content-disposition: form-data; name=\"arquivo_classes\"; filename=\"classes.json\"\r\ncontent-type: application/json\r\ncontent-length: 611\r\n">, "arquivo_membros" => #<ActionDispatch::Http::UploadedFile:0x00000001257072b0 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-98814-doyo0c.json>, @content_type="application/json", @original_filename="classes.json", @headers="content-disposition: form-data; name=\"arquivo_membros\"; filename=\"classes.json\"\r\ncontent-type: application/json\r\ncontent-length: 611\r\n">, "admin_id" => "3"}
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 3 LIMIT 1
+ +

Redirected to www.example.com/admin/3/gerenciamento Completed 302 Found in 1ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.1ms) Started GET “/admin/3/gerenciamento” for 127.0.0.1 at 2026-06-30 14:24:21 -0300 Processing by AdminController#gerenciamento as HTML

+ +
Parameters: {"admin_id" => "3"}
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 3 LIMIT 1
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/gerenciamento.html.erb within layouts/gerenciamento
+Rendered admin/gerenciamento.html.erb within layouts/gerenciamento (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 0.4ms | GC: 0.1ms)
+ +

Completed 200 OK in 1ms (Views: 0.5ms | ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.1ms)

+ +
TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.4ms)  SELECT `departamentos`.* FROM `departamentos` ORDER BY `departamentos`.`id` ASC LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:24:21.810997', 'Ciência da Computação', '2026-06-30 17:24:21.810997')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' ORDER BY `usuarios`.`id` ASC LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'admin' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@teste.com' LIMIT 1
+Administrador Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:24:22.001358', NULL, NULL, NULL, 4, 'admin@teste.com', NULL, 'admin', 'Admin Teste', NULL, NULL, '$2a$12$wSIwqiurl7pfAyrVUnFlH.dlqkMnIKgY.F72vBgTIj/j55dAKm2Ai', 'Administrador', '2026-06-30 17:24:22.001358')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/admin/4/gerenciamento” for 127.0.0.1 at 2026-06-30 14:24:22 -0300 Processing by AdminController#gerenciamento as HTML

+ +
Parameters: {"admin_id" => "4"}
+Administrador Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 4 LIMIT 1
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/gerenciamento.html.erb within layouts/gerenciamento
+Rendered admin/gerenciamento.html.erb within layouts/gerenciamento (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 0.4ms | GC: 0.1ms)
+ +

Completed 200 OK in 1ms (Views: 0.5ms | ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.1ms) Started POST “/admin/4/sincronizar_sigaa” for 127.0.0.1 at 2026-06-30 14:24:22 -0300 Processing by AdminController#sincronizar_sigaa as HTML

+ +
Parameters: {"acao" => "importar", "arquivo_classes" => #<ActionDispatch::Http::UploadedFile:0x00000001246965e8 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-98814-bc41zz.json>, @content_type="application/json", @original_filename="classes.json", @headers="content-disposition: form-data; name=\"arquivo_classes\"; filename=\"classes.json\"\r\ncontent-type: application/json\r\ncontent-length: 611\r\n">, "arquivo_membros" => #<ActionDispatch::Http::UploadedFile:0x00000001246964f8 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-98814-30a4wx.json>, @content_type="application/json", @original_filename="classes.json", @headers="content-disposition: form-data; name=\"arquivo_membros\"; filename=\"classes.json\"\r\ncontent-type: application/json\r\ncontent-length: 611\r\n">, "admin_id" => "4"}
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 4 LIMIT 1
+ +

Redirected to www.example.com/admin/4/gerenciamento Completed 302 Found in 1ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/admin/4/gerenciamento” for 127.0.0.1 at 2026-06-30 14:24:22 -0300 Processing by AdminController#gerenciamento as HTML

+ +
Parameters: {"admin_id" => "4"}
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 4 LIMIT 1
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/gerenciamento.html.erb within layouts/gerenciamento
+Rendered admin/gerenciamento.html.erb within layouts/gerenciamento (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 0.3ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.4ms | ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started POST “/admin/4/sincronizar_sigaa” for 127.0.0.1 at 2026-06-30 14:24:22 -0300 Processing by AdminController#sincronizar_sigaa as HTML

+ +
Parameters: {"acao" => "atualizar", "arquivo_classes" => #<ActionDispatch::Http::UploadedFile:0x0000000123cc2940 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-98814-kb3r6w.json>, @content_type="application/json", @original_filename="classes.json", @headers="content-disposition: form-data; name=\"arquivo_classes\"; filename=\"classes.json\"\r\ncontent-type: application/json\r\ncontent-length: 611\r\n">, "arquivo_membros" => #<ActionDispatch::Http::UploadedFile:0x0000000123cc2850 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-98814-xov0x3.json>, @content_type="application/json", @original_filename="classes.json", @headers="content-disposition: form-data; name=\"arquivo_membros\"; filename=\"classes.json\"\r\ncontent-type: application/json\r\ncontent-length: 611\r\n">, "admin_id" => "4"}
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 4 LIMIT 1
+ +

Redirected to www.example.com/admin/4/gerenciamento Completed 302 Found in 1ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/admin/4/gerenciamento” for 127.0.0.1 at 2026-06-30 14:24:22 -0300 Processing by AdminController#gerenciamento as HTML

+ +
Parameters: {"admin_id" => "4"}
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 4 LIMIT 1
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/gerenciamento.html.erb within layouts/gerenciamento
+Rendered admin/gerenciamento.html.erb within layouts/gerenciamento (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 0.3ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.3ms | ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.4ms)  SELECT `departamentos`.* FROM `departamentos` ORDER BY `departamentos`.`id` ASC LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:24:22.016384', 'Ciência da Computação', '2026-06-30 17:24:22.016384')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' ORDER BY `usuarios`.`id` ASC LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'admin' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@teste.com' LIMIT 1
+Administrador Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:24:22.213138', NULL, NULL, NULL, 5, 'admin@teste.com', NULL, 'admin', 'Admin Teste', NULL, NULL, '$2a$12$9QjnOe3fxAgSn6ZjjCnxKudZOxNoKV//150uiAhPDRYfbQw/AsOiS', 'Administrador', '2026-06-30 17:24:22.213138')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/admin/5/gerenciamento” for 127.0.0.1 at 2026-06-30 14:24:22 -0300 Processing by AdminController#gerenciamento as HTML

+ +
Parameters: {"admin_id" => "5"}
+Administrador Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 5 LIMIT 1
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/gerenciamento.html.erb within layouts/gerenciamento
+Rendered admin/gerenciamento.html.erb within layouts/gerenciamento (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 0.3ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.5ms | ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`codigo` = 'NAO_ESP' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'NAO_ESP' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('NAO_ESP', '2026-06-30 17:24:22.219299', 'Não especificado', '2026-06-30 17:24:22.219299')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Curso Load (0.3ms)  SELECT `cursos`.* FROM `cursos` WHERE `cursos`.`codigo` = 'TST' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Curso Exists? (0.4ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`codigo` = 'TST' LIMIT 1
+Curso Create (0.3ms)  INSERT INTO `cursos` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('TST', '2026-06-30 17:24:22.226753', 6, 'Curso Teste', '2026-06-30 17:24:22.226753')
+TRANSACTION (0.3ms)  RELEASE SAVEPOINT active_record_1
+Discente Load (0.6ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Discente' AND `usuarios`.`matricula` = 'USR001' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'USR001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' LIMIT 1
+Discente Create (0.3ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:24:22.232235', 1, NULL, NULL, NULL, 'usuario@teste.com', NULL, 'USR001', 'Usuário Teste', NULL, NULL, NULL, 'Discente', '2026-06-30 17:24:22.232235')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' LIMIT 1
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' AND `usuarios`.`id` != 6 LIMIT 1
+Discente Update (1.6ms)  UPDATE `usuarios` SET `usuarios`.`definicao_senha_sent_at` = '2026-06-30 17:24:22.235162', `usuarios`.`definicao_senha_token` = '4izS1yQjAqKHacxiFTtkCPQUQzGPsu4HRycCoyA6zJo', `usuarios`.`updated_at` = '2026-06-30 17:24:22.237986' WHERE `usuarios`.`id` = 6
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Rendering layout layouts/mailer.html.erb
+Rendering usuario_mailer/definicao_senha.html.erb within layouts/mailer
+Rendered usuario_mailer/definicao_senha.html.erb within layouts/mailer (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/mailer.html.erb (Duration: 0.2ms | GC: 0.0ms)
+Rendering layout layouts/mailer.text.erb
+Rendering usuario_mailer/definicao_senha.text.erb within layouts/mailer
+Rendered usuario_mailer/definicao_senha.text.erb within layouts/mailer (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/mailer.text.erb (Duration: 0.1ms | GC: 0.0ms)
+ +

UsuarioMailer#definicao_senha: processed outbound mail in 8.2ms Delivered mail 6a43fbc63d964_181feea0-361@MacBook-Air-de-Elvis.local.mail (7.7ms) Date: Tue, 30 Jun 2026 14:24:22 -0300 From: camaar@gmail.com To: usuario@teste.com Message-ID: <6a43fbc63d964_181feea0-361@MacBook-Air-de-Elvis.local.mail> Subject: =?UTF-8?Q?Defini=C3=A7=C3=A3o_de_senha?= MIME-Version: 1.0 Content-Type: multipart/alternative;

+ +
boundary="--==_mimepart_6a43fbc63cc95_181feea0-475";
+charset=UTF-8
+
+ +

Content-Transfer-Encoding: 7bit

+ +

—-==_mimepart_6a43fbc63cc95_181feea0-475 Content-Type: text/plain;

+ +
charset=UTF-8
+
+ +

Content-Transfer-Encoding: quoted-printable

+ +

Ol=C3=A1, Usu=C3=A1rio Teste.

+ +

Para definir sua senha e acessar o sistema, acesse o link abaixo:

+ +

example.com/definir_senha/4izS1yQjAqKHacxiFTtkCPQUQzGPsu4HRycCoyA6= zJo

+ +

—-==_mimepart_6a43fbc63cc95_181feea0-475 Content-Type: text/html;

+ +
charset=UTF-8
+
+ +

Content-Transfer-Encoding: quoted-printable

+ +

<!DOCTYPE html> <html>

+ +
<head>
+  <meta http-equiv=3D"Content-Type" content=3D"text/html; charset=3Dutf=
+ +

-8“>

+ +
  <style>
+    /* Email styles need to be inline */
+  </style>
+</head>
+
+<body>
+  <p>Ol=C3=A1, Usu=C3=A1rio Teste.</p>
+ +

<p>Para definir sua senha e acessar o sistema, acesse o link abaixo:</p>

+ +

<p><a href=3D“example.com/definir_senha/4izS1yQjAqKHacxiFTtkCPQUQz= GPsu4HRycCoyA6zJo”>example.com/definir_senha/4izS1yQjAqKHacxiFTtkC= PQUQzGPsu4HRycCoyA6zJo</a></p>

+ +
</body>
+ +

</html>

+ +

—-==_mimepart_6a43fbc63cc95_181feea0-475–

+ +
TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.2ms)  BEGIN
+Departamento Load (0.5ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Departamento' AND `departamentos`.`codigo` = 'TST' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.2ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'TST' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('TST', '2026-06-30 17:24:22.260278', 'Departamento', '2026-06-30 17:24:22.260278')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '123456789' LIMIT 1
+Usuario Exists? (0.1ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.3ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:24:22.261939', NULL, NULL, NULL, 7, 'admin@unb.br', NULL, '123456789', 'Admin', NULL, NULL, '123456', 'Administrador', '2026-06-30 17:24:22.261939')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/inicio” for 127.0.0.1 at 2026-06-30 14:24:22 -0300 Processing by HomeController#index as HTML

+ +
Rendering layout layouts/application.html.erb
+Rendering home/index.html.erb within layouts/application
+Rendered home/index.html.erb within layouts/application (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 3.2ms | GC: 0.0ms)
+ +

Completed 200 OK in 4ms (Views: 3.9ms | ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 0.0ms)

+ +
Administrador Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' ORDER BY `usuarios`.`id` ASC LIMIT 1
+ +

Started GET “/admin/7/templates/new” for 127.0.0.1 at 2026-06-30 14:24:22 -0300 Processing by TemplatesController#new as HTML

+ +
Parameters: {"admin_id" => "7"}
+Rendering layout layouts/gerenciamento.html.erb
+Rendering templates/new.html.erb within layouts/gerenciamento
+Template Load (0.3ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`usuario_id` = 7
+Rendered templates/_grid.html.erb (Duration: 1.2ms | GC: 0.0ms)
+Rendered templates/_form.html.erb (Duration: 2.5ms | GC: 0.0ms)
+Rendered templates/new.html.erb within layouts/gerenciamento (Duration: 4.6ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 4.8ms | GC: 0.0ms)
+ +

Completed 200 OK in 22ms (Views: 4.7ms | ActiveRecord: 7.2ms (1 query, 0 cached) | GC: 0.0ms) Started POST “/admin/7/templates” for 127.0.0.1 at 2026-06-30 14:24:22 -0300 Processing by TemplatesController#create as HTML

+ +
Parameters: {"template" => {"nome" => "Template Prova Matemática 2º semestre", "elementos_attributes" => {"0" => {"ordem" => "1", "_destroy" => "false", "enunciado" => "Questão desafio(1 ponto):", "campos_attributes" => {"0" => {"tipo_elemento" => "Múltipla Escolha", "ordem" => "1", "_destroy" => "false", "enunciado" => "d"}}}}}, "commit" => "Criar", "admin_id" => "7"}
+TRANSACTION (0.3ms)  SAVEPOINT active_record_1
+Administrador Load (0.8ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 7 LIMIT 1
+Campo Exists? (0.8ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Template Create (0.4ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:24:22.315566', 'Template Prova Matemática 2º semestre', '2026-06-30 17:24:22.315566', 7)
+Elemento Create (0.7ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:24:22.316228', 'Questão desafio(1 ponto):', 1, 1, '2026-06-30 17:24:22.316228')
+Campo Create (0.3ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:22.317525', 1, 'd', 1, 'Múltipla Escolha', '2026-06-30 17:24:22.317525')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/admin/7/templates Completed 302 Found in 15ms (ActiveRecord: 3.4ms (5 queries, 0 cached) | GC: 8.0ms) Started GET “/admin/7/templates” for 127.0.0.1 at 2026-06-30 14:24:22 -0300 Processing by TemplatesController#index as HTML

+ +
Parameters: {"admin_id" => "7"}
+Rendering layout layouts/gerenciamento.html.erb
+Rendering templates/index.html.erb within layouts/gerenciamento
+Template Exists? (0.3ms)  SELECT 1 AS one FROM `templates` WHERE `templates`.`usuario_id` = 7 LIMIT 1
+Template Load (0.2ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`usuario_id` = 7
+Elemento Load (0.4ms)  SELECT `elementos`.* FROM `elementos` WHERE `elementos`.`template_id` = 1
+Campo Load (0.2ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` = 1
+Rendered templates/_grid.html.erb (Duration: 5.8ms | GC: 0.3ms)
+Rendered templates/index.html.erb within layouts/gerenciamento (Duration: 6.0ms | GC: 0.3ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 6.3ms | GC: 0.3ms)
+ +

Completed 200 OK in 7ms (Views: 5.4ms | ActiveRecord: 1.1ms (4 queries, 0 cached) | GC: 0.3ms)

+ +
Administrador Load (0.5ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' ORDER BY `usuarios`.`id` ASC LIMIT 1
+ +

Started GET “/admin/7/templates/new” for 127.0.0.1 at 2026-06-30 14:24:22 -0300 Processing by TemplatesController#new as HTML

+ +
Parameters: {"admin_id" => "7"}
+Rendering layout layouts/gerenciamento.html.erb
+Rendering templates/new.html.erb within layouts/gerenciamento
+Rendered templates/_grid.html.erb (Duration: 0.5ms | GC: 0.3ms)
+Rendered templates/_form.html.erb (Duration: 0.5ms | GC: 0.0ms)
+Rendered templates/new.html.erb within layouts/gerenciamento (Duration: 1.0ms | GC: 0.3ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 1.3ms | GC: 0.3ms)
+ +

Completed 200 OK in 2ms (Views: 1.4ms | ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 0.3ms) Started POST “/admin/7/templates” for 127.0.0.1 at 2026-06-30 14:24:22 -0300 Processing by TemplatesController#create as HTML

+ +
Parameters: {"template" => {"nome" => "Template Prova Português 2º semestre", "elementos_attributes" => {"0" => {"ordem" => "1", "_destroy" => "false", "enunciado" => "Questão desafio(1 ponto):", "campos_attributes" => {"0" => {"tipo_elemento" => "Texto", "ordem" => "1", "_destroy" => "false", "enunciado" => ""}}}}}, "commit" => "Criar", "admin_id" => "7"}
+TRANSACTION (0.3ms)  SAVEPOINT active_record_1
+Administrador Load (0.8ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 7 LIMIT 1
+Campo Exists? (0.2ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Template Create (0.3ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:24:22.340270', 'Template Prova Português 2º semestre', '2026-06-30 17:24:22.340270', 7)
+Elemento Create (0.2ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:24:22.340925', 'Questão desafio(1 ponto):', 1, 2, '2026-06-30 17:24:22.340925')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:22.341366', 2, '', 1, 'Texto', '2026-06-30 17:24:22.341366')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/admin/7/templates Completed 302 Found in 5ms (ActiveRecord: 2.2ms (5 queries, 0 cached) | GC: 0.1ms) Started GET “/admin/7/templates” for 127.0.0.1 at 2026-06-30 14:24:22 -0300 Processing by TemplatesController#index as HTML

+ +
Parameters: {"admin_id" => "7"}
+Rendering layout layouts/gerenciamento.html.erb
+Rendering templates/index.html.erb within layouts/gerenciamento
+Template Exists? (0.3ms)  SELECT 1 AS one FROM `templates` WHERE `templates`.`usuario_id` = 7 LIMIT 1
+Template Load (0.3ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`usuario_id` = 7
+Elemento Load (0.3ms)  SELECT `elementos`.* FROM `elementos` WHERE `elementos`.`template_id` IN (1, 2)
+Campo Load (0.3ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` IN (1, 2)
+Rendered templates/_grid.html.erb (Duration: 2.2ms | GC: 0.0ms)
+Rendered templates/index.html.erb within layouts/gerenciamento (Duration: 2.3ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 2.5ms | GC: 0.0ms)
+ +

Completed 200 OK in 3ms (Views: 1.5ms | ActiveRecord: 1.1ms (4 queries, 0 cached) | GC: 0.1ms)

+ +
TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.5ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Departamento' AND `departamentos`.`codigo` = 'TST' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'TST' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('TST', '2026-06-30 17:24:22.350855', 'Departamento', '2026-06-30 17:24:22.350855')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '123456789' LIMIT 1
+Usuario Exists? (0.1ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.3ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:24:22.352499', NULL, NULL, NULL, 8, 'admin@unb.br', NULL, '123456789', 'Admin', NULL, NULL, '123456', 'Administrador', '2026-06-30 17:24:22.352499')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/inicio” for 127.0.0.1 at 2026-06-30 14:24:22 -0300 Processing by HomeController#index as HTML

+ +
Rendering layout layouts/application.html.erb
+Rendering home/index.html.erb within layouts/application
+Rendered home/index.html.erb within layouts/application (Duration: 0.0ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.3ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.4ms | ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 0.0ms)

+ +
Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' ORDER BY `usuarios`.`id` ASC LIMIT 1
+ +

Started GET “/admin/8/templates/new” for 127.0.0.1 at 2026-06-30 14:24:22 -0300 Processing by TemplatesController#new as HTML

+ +
Parameters: {"admin_id" => "8"}
+Rendering layout layouts/gerenciamento.html.erb
+Rendering templates/new.html.erb within layouts/gerenciamento
+Template Load (0.3ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`usuario_id` = 8
+Rendered templates/_grid.html.erb (Duration: 0.5ms | GC: 0.0ms)
+Rendered templates/_form.html.erb (Duration: 0.4ms | GC: 0.0ms)
+Rendered templates/new.html.erb within layouts/gerenciamento (Duration: 1.0ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 1.2ms | GC: 0.0ms)
+ +

Completed 200 OK in 2ms (Views: 1.0ms | ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started POST “/admin/8/templates” for 127.0.0.1 at 2026-06-30 14:24:22 -0300 Processing by TemplatesController#create as HTML

+ +
Parameters: {"template" => {"nome" => "", "elementos_attributes" => {"0" => {"ordem" => "1", "_destroy" => "false", "enunciado" => "Questão 1:", "campos_attributes" => {"0" => {"tipo_elemento" => "Múltipla Escolha", "ordem" => "1", "_destroy" => "false", "enunciado" => "d"}}}}}, "commit" => "Criar", "admin_id" => "8"}
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Administrador Load (0.5ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 8 LIMIT 1
+Campo Exists? (0.2ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` IS NULL LIMIT 1
+TRANSACTION (0.1ms)  ROLLBACK TO SAVEPOINT active_record_1
+Rendering layout layouts/gerenciamento.html.erb
+Rendering templates/new.html.erb within layouts/gerenciamento
+Rendered templates/_grid.html.erb (Duration: 0.1ms | GC: 0.0ms)
+Rendered templates/_form.html.erb (Duration: 0.4ms | GC: 0.0ms)
+Rendered templates/new.html.erb within layouts/gerenciamento (Duration: 0.6ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 0.7ms | GC: 0.0ms)
+ +

Completed 422 Unprocessable Content in 3ms (Views: 0.9ms | ActiveRecord: 1.0ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.3ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.4ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Departamento' AND `departamentos`.`codigo` = 'TST' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'TST' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('TST', '2026-06-30 17:24:22.370046', 'Departamento', '2026-06-30 17:24:22.370046')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '123456789' LIMIT 1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.2ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:24:22.372374', NULL, NULL, NULL, 9, 'admin@unb.br', NULL, '123456789', 'Admin', NULL, NULL, '123456', 'Administrador', '2026-06-30 17:24:22.372374')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/inicio” for 127.0.0.1 at 2026-06-30 14:24:22 -0300 Processing by HomeController#index as HTML

+ +
Rendering layout layouts/application.html.erb
+Rendering home/index.html.erb within layouts/application
+Rendered home/index.html.erb within layouts/application (Duration: 0.0ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.3ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.5ms | ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 0.0ms)

+ +
Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' ORDER BY `usuarios`.`id` ASC LIMIT 1
+ +

Started GET “/admin/9/templates/new” for 127.0.0.1 at 2026-06-30 14:24:22 -0300 Processing by TemplatesController#new as HTML

+ +
Parameters: {"admin_id" => "9"}
+Rendering layout layouts/gerenciamento.html.erb
+Rendering templates/new.html.erb within layouts/gerenciamento
+Template Load (0.3ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`usuario_id` = 9
+Rendered templates/_grid.html.erb (Duration: 0.4ms | GC: 0.0ms)
+Rendered templates/_form.html.erb (Duration: 0.4ms | GC: 0.0ms)
+Rendered templates/new.html.erb within layouts/gerenciamento (Duration: 0.9ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 1.1ms | GC: 0.0ms)
+ +

Completed 200 OK in 2ms (Views: 1.0ms | ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started POST “/admin/9/templates” for 127.0.0.1 at 2026-06-30 14:24:22 -0300 Processing by TemplatesController#create as HTML

+ +
Parameters: {"template" => {"nome" => "Template Prova Matemática 2º semestre", "elementos_attributes" => {"0" => {"ordem" => "1", "_destroy" => "1", "enunciado" => "", "campos_attributes" => {"0" => {"tipo_elemento" => "Texto", "ordem" => "1", "_destroy" => "false", "enunciado" => ""}}}}}, "commit" => "Criar", "admin_id" => "9"}
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Administrador Load (0.5ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 9 LIMIT 1
+TRANSACTION (0.1ms)  ROLLBACK TO SAVEPOINT active_record_1
+Rendering layout layouts/gerenciamento.html.erb
+Rendering templates/new.html.erb within layouts/gerenciamento
+Rendered templates/_grid.html.erb (Duration: 0.1ms | GC: 0.0ms)
+Rendered templates/_form.html.erb (Duration: 0.2ms | GC: 0.0ms)
+Rendered templates/new.html.erb within layouts/gerenciamento (Duration: 0.3ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 0.4ms | GC: 0.0ms)
+ +

Completed 422 Unprocessable Content in 2ms (Views: 0.6ms | ActiveRecord: 0.9ms (1 query, 0 cached) | GC: 0.1ms)

+ +
TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Departamento de Teste' AND `departamentos`.`codigo` = 'TST' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'TST' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('TST', '2026-06-30 17:24:22.387723', 'Departamento de Teste', '2026-06-30 17:24:22.387723')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Administrador Load (0.1ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`email` = 'professor@teste.com' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'prof001' LIMIT 1
+Usuario Exists? (0.1ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'professor@teste.com' LIMIT 1
+Administrador Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:24:22.578513', NULL, NULL, NULL, 10, 'professor@teste.com', NULL, 'prof001', 'Professor Teste', NULL, NULL, '$2a$12$J18O5qPKUf.6JPakHuYTNOkOcboo1eV8ikFn/PHNZXFMqrybgqQBK', 'Administrador', '2026-06-30 17:24:22.578513')
+TRANSACTION (0.3ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.4ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Departamento de Teste' AND `departamentos`.`codigo` = 'TST' LIMIT 1
+Disciplina Load (0.8ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0001' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.1ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0001' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0001', '2026-06-30 17:24:22.588443', 10, 'Engenharia de Software', '2026-06-30 17:24:22.588443')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.4ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`disciplina_id` = 1 AND `turmas`.`numero_da_turma` = '01' AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.3ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = '01' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 1 LIMIT 1
+Turma Create (0.3ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:24:22.595619', 1, '235M12', '01', '2026.1', '2026-06-30 17:24:22.595619')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Template Load (0.2ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`nome` = 'Avaliação Padrão' AND `templates`.`usuario_id` = 10 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Administrador Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 10 LIMIT 1
+Campo Exists? (0.2ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.1ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 2 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.1ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 3 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.1ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 4 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Template Create (0.2ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:24:22.598944', 'Avaliação Padrão', '2026-06-30 17:24:22.598944', 10)
+Elemento Create (0.2ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:24:22.599346', 'Como você avalia o professor?', 1, 3, '2026-06-30 17:24:22.599346')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:22.599727', 3, 'Ótimo', 1, 'Múltipla Escolha', '2026-06-30 17:24:22.599727')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:22.600100', 3, 'Bom', 2, 'Múltipla Escolha', '2026-06-30 17:24:22.600100')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:22.600452', 3, 'Regular', 3, 'Múltipla Escolha', '2026-06-30 17:24:22.600452')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:22.600802', 3, 'Ruim', 4, 'Múltipla Escolha', '2026-06-30 17:24:22.600802')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/admin/10/enviar_formularios” for 127.0.0.1 at 2026-06-30 14:24:22 -0300 Processing by AdminController#enviar_formularios as HTML

+ +
Parameters: {"admin_id" => "10"}
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/enviar_formularios.html.erb within layouts/gerenciamento
+Template Load (0.2ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`usuario_id` = 10
+Turma Eager Load (0.4ms)  SELECT `turmas`.`id` AS t0_r0, `turmas`.`created_at` AS t0_r1, `turmas`.`disciplina_id` AS t0_r2, `turmas`.`horario` AS t0_r3, `turmas`.`numero_da_turma` AS t0_r4, `turmas`.`semestre` AS t0_r5, `turmas`.`updated_at` AS t0_r6, `disciplinas`.`id` AS t1_r0, `disciplinas`.`codigo` AS t1_r1, `disciplinas`.`created_at` AS t1_r2, `disciplinas`.`departamento_id` AS t1_r3, `disciplinas`.`nome` AS t1_r4, `disciplinas`.`updated_at` AS t1_r5 FROM `turmas` INNER JOIN `disciplinas` ON `disciplinas`.`id` = `turmas`.`disciplina_id` ORDER BY disciplinas.nome, turmas.semestre
+Rendered admin/enviar_formularios.html.erb within layouts/gerenciamento (Duration: 3.4ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 3.6ms | GC: 0.0ms)
+ +

Completed 200 OK in 5ms (Views: 3.2ms | ActiveRecord: 0.6ms (2 queries, 0 cached) | GC: 0.0ms) Started POST “/admin/10/enviar_formularios” for 127.0.0.1 at 2026-06-30 14:24:22 -0300 Processing by AdminController#enviar_formularios as HTML

+ +
Parameters: {"template_id" => "3", "turma_ids" => ["1"], "commit" => "Criar Formulário", "admin_id" => "10"}
+Template Load (0.2ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`id` = 3 LIMIT 1
+Elemento Load (0.2ms)  SELECT `elementos`.* FROM `elementos` WHERE `elementos`.`template_id` = 3
+Campo Load (0.2ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` = 3
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`id` = 1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`id` = 1 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (1.1ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:24:22.616728', NULL, NULL, NULL, 'Engenharia de Software - 2026.1', 1, '2026-06-30 17:24:22.616728')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.5ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:24:22.622342', 'Como você avalia o professor?', 1, 1, 'Múltipla Escolha', '2026-06-30 17:24:22.622342')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+CampoForm Create (1.1ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:22.628057', 1, 'Ótimo', 1, NULL, '2026-06-30 17:24:22.628057')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+CampoForm Create (0.5ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:22.629635', 1, 'Bom', 2, NULL, '2026-06-30 17:24:22.629635')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+CampoForm Create (0.4ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:22.630530', 1, 'Regular', 3, NULL, '2026-06-30 17:24:22.630530')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.4ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:22.631407', 1, 'Ruim', 4, NULL, '2026-06-30 17:24:22.631407')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/admin/10/gerenciamento Completed 302 Found in 23ms (ActiveRecord: 14.2ms (11 queries, 0 cached) | GC: 0.0ms) Started GET “/admin/10/gerenciamento” for 127.0.0.1 at 2026-06-30 14:24:22 -0300 Processing by AdminController#gerenciamento as HTML

+ +
Parameters: {"admin_id" => "10"}
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/gerenciamento.html.erb within layouts/gerenciamento
+Rendered admin/gerenciamento.html.erb within layouts/gerenciamento (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 0.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.5ms | ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 0.0ms)

+ +
Formulario Load (0.3ms)  SELECT `formularios`.* FROM `formularios` WHERE `formularios`.`turma_id` = 1 LIMIT 1
+ElementoForm Count (1.3ms)  SELECT COUNT(*) FROM `elemento_forms` WHERE `elemento_forms`.`formulario_id` = 1
+Elemento Count (0.1ms)  SELECT COUNT(*) FROM `elementos` WHERE `elementos`.`template_id` = 3
+TRANSACTION (0.6ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Departamento de Teste' AND `departamentos`.`codigo` = 'TST' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'TST' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('TST', '2026-06-30 17:24:22.640049', 'Departamento de Teste', '2026-06-30 17:24:22.640049')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`email` = 'professor@teste.com' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'prof001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'professor@teste.com' LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:24:22.830444', NULL, NULL, NULL, 11, 'professor@teste.com', NULL, 'prof001', 'Professor Teste', NULL, NULL, '$2a$12$2MxyLi0FLF6qbJAr6EXCv.M7QNg4OQHDKjxjLKZPA/moYpMz6lpfi', 'Administrador', '2026-06-30 17:24:22.830444')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Departamento de Teste' AND `departamentos`.`codigo` = 'TST' LIMIT 1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0001' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0001' LIMIT 1
+Disciplina Create (0.3ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0001', '2026-06-30 17:24:22.833850', 11, 'Engenharia de Software', '2026-06-30 17:24:22.833850')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`disciplina_id` = 2 AND `turmas`.`numero_da_turma` = '01' AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = '01' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 2 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:24:22.835479', 2, '235M12', '01', '2026.1', '2026-06-30 17:24:22.835479')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Template Load (0.2ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`nome` = 'Avaliação Padrão' AND `templates`.`usuario_id` = 11 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Administrador Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 11 LIMIT 1
+Campo Exists? (0.2ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.2ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 2 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.2ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 3 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.1ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 4 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Template Create (0.2ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:24:22.838804', 'Avaliação Padrão', '2026-06-30 17:24:22.838804', 11)
+Elemento Create (0.2ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:24:22.839204', 'Como você avalia o professor?', 1, 4, '2026-06-30 17:24:22.839204')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:22.839586', 4, 'Ótimo', 1, 'Múltipla Escolha', '2026-06-30 17:24:22.839586')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:22.839961', 4, 'Bom', 2, 'Múltipla Escolha', '2026-06-30 17:24:22.839961')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:22.840345', 4, 'Regular', 3, 'Múltipla Escolha', '2026-06-30 17:24:22.840345')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:22.840708', 4, 'Ruim', 4, 'Múltipla Escolha', '2026-06-30 17:24:22.840708')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/admin/11/enviar_formularios” for 127.0.0.1 at 2026-06-30 14:24:22 -0300 Processing by AdminController#enviar_formularios as HTML

+ +
Parameters: {"admin_id" => "11"}
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/enviar_formularios.html.erb within layouts/gerenciamento
+Template Load (0.2ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`usuario_id` = 11
+Turma Eager Load (0.4ms)  SELECT `turmas`.`id` AS t0_r0, `turmas`.`created_at` AS t0_r1, `turmas`.`disciplina_id` AS t0_r2, `turmas`.`horario` AS t0_r3, `turmas`.`numero_da_turma` AS t0_r4, `turmas`.`semestre` AS t0_r5, `turmas`.`updated_at` AS t0_r6, `disciplinas`.`id` AS t1_r0, `disciplinas`.`codigo` AS t1_r1, `disciplinas`.`created_at` AS t1_r2, `disciplinas`.`departamento_id` AS t1_r3, `disciplinas`.`nome` AS t1_r4, `disciplinas`.`updated_at` AS t1_r5 FROM `turmas` INNER JOIN `disciplinas` ON `disciplinas`.`id` = `turmas`.`disciplina_id` ORDER BY disciplinas.nome, turmas.semestre
+Rendered admin/enviar_formularios.html.erb within layouts/gerenciamento (Duration: 1.1ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 1.3ms | GC: 0.0ms)
+ +

Completed 200 OK in 2ms (Views: 0.9ms | ActiveRecord: 0.6ms (2 queries, 0 cached) | GC: 0.0ms) Started POST “/admin/11/enviar_formularios” for 127.0.0.1 at 2026-06-30 14:24:22 -0300 Processing by AdminController#enviar_formularios as HTML

+ +
Parameters: {"template_id" => "", "turma_ids" => ["2"], "commit" => "Criar Formulário", "admin_id" => "11"}
+ +

Redirected to www.example.com/admin/11/enviar_formularios Completed 302 Found in 0ms (ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 0.0ms) Started GET “/admin/11/enviar_formularios” for 127.0.0.1 at 2026-06-30 14:24:22 -0300 Processing by AdminController#enviar_formularios as HTML

+ +
Parameters: {"admin_id" => "11"}
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/enviar_formularios.html.erb within layouts/gerenciamento
+Template Load (0.2ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`usuario_id` = 11
+Turma Eager Load (0.3ms)  SELECT `turmas`.`id` AS t0_r0, `turmas`.`created_at` AS t0_r1, `turmas`.`disciplina_id` AS t0_r2, `turmas`.`horario` AS t0_r3, `turmas`.`numero_da_turma` AS t0_r4, `turmas`.`semestre` AS t0_r5, `turmas`.`updated_at` AS t0_r6, `disciplinas`.`id` AS t1_r0, `disciplinas`.`codigo` AS t1_r1, `disciplinas`.`created_at` AS t1_r2, `disciplinas`.`departamento_id` AS t1_r3, `disciplinas`.`nome` AS t1_r4, `disciplinas`.`updated_at` AS t1_r5 FROM `turmas` INNER JOIN `disciplinas` ON `disciplinas`.`id` = `turmas`.`disciplina_id` ORDER BY disciplinas.nome, turmas.semestre
+Rendered admin/enviar_formularios.html.erb within layouts/gerenciamento (Duration: 1.0ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 1.2ms | GC: 0.0ms)
+ +

Completed 200 OK in 2ms (Views: 0.8ms | ActiveRecord: 0.5ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.2ms)  BEGIN
+Departamento Load (0.5ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Departamento de Teste' AND `departamentos`.`codigo` = 'TST' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'TST' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('TST', '2026-06-30 17:24:22.858602', 'Departamento de Teste', '2026-06-30 17:24:22.858602')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`email` = 'professor@teste.com' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'prof001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'professor@teste.com' LIMIT 1
+Administrador Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:24:23.050282', NULL, NULL, NULL, 12, 'professor@teste.com', NULL, 'prof001', 'Professor Teste', NULL, NULL, '$2a$12$op.ZuZw1OGh0DDHTArFlWeb2eOqTIm/I1qp8/s6y8k51Yoj.w6ofu', 'Administrador', '2026-06-30 17:24:23.050282')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Departamento de Teste' AND `departamentos`.`codigo` = 'TST' LIMIT 1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0001' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0001' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0001', '2026-06-30 17:24:23.054248', 12, 'Engenharia de Software', '2026-06-30 17:24:23.054248')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`disciplina_id` = 3 AND `turmas`.`numero_da_turma` = '01' AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.3ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = '01' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 3 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:24:23.055641', 3, '235M12', '01', '2026.1', '2026-06-30 17:24:23.055641')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Template Load (0.2ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`nome` = 'Avaliação Padrão' AND `templates`.`usuario_id` = 12 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 12 LIMIT 1
+Campo Exists? (0.1ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.1ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 2 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.1ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 3 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.1ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 4 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Template Create (0.2ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:24:23.058810', 'Avaliação Padrão', '2026-06-30 17:24:23.058810', 12)
+Elemento Create (0.2ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:24:23.059181', 'Como você avalia o professor?', 1, 5, '2026-06-30 17:24:23.059181')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.059528', 5, 'Ótimo', 1, 'Múltipla Escolha', '2026-06-30 17:24:23.059528')
+Campo Create (0.1ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.059856', 5, 'Bom', 2, 'Múltipla Escolha', '2026-06-30 17:24:23.059856')
+Campo Create (0.1ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.060169', 5, 'Regular', 3, 'Múltipla Escolha', '2026-06-30 17:24:23.060169')
+Campo Create (0.1ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.060477', 5, 'Ruim', 4, 'Múltipla Escolha', '2026-06-30 17:24:23.060477')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/admin/12/enviar_formularios” for 127.0.0.1 at 2026-06-30 14:24:23 -0300 Processing by AdminController#enviar_formularios as HTML

+ +
Parameters: {"admin_id" => "12"}
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/enviar_formularios.html.erb within layouts/gerenciamento
+Template Load (0.2ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`usuario_id` = 12
+Turma Eager Load (0.3ms)  SELECT `turmas`.`id` AS t0_r0, `turmas`.`created_at` AS t0_r1, `turmas`.`disciplina_id` AS t0_r2, `turmas`.`horario` AS t0_r3, `turmas`.`numero_da_turma` AS t0_r4, `turmas`.`semestre` AS t0_r5, `turmas`.`updated_at` AS t0_r6, `disciplinas`.`id` AS t1_r0, `disciplinas`.`codigo` AS t1_r1, `disciplinas`.`created_at` AS t1_r2, `disciplinas`.`departamento_id` AS t1_r3, `disciplinas`.`nome` AS t1_r4, `disciplinas`.`updated_at` AS t1_r5 FROM `turmas` INNER JOIN `disciplinas` ON `disciplinas`.`id` = `turmas`.`disciplina_id` ORDER BY disciplinas.nome, turmas.semestre
+Rendered admin/enviar_formularios.html.erb within layouts/gerenciamento (Duration: 1.0ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 1.2ms | GC: 0.0ms)
+ +

Completed 200 OK in 2ms (Views: 0.9ms | ActiveRecord: 0.4ms (2 queries, 0 cached) | GC: 0.2ms) Started POST “/admin/12/enviar_formularios” for 127.0.0.1 at 2026-06-30 14:24:23 -0300 Processing by AdminController#enviar_formularios as HTML

+ +
Parameters: {"template_id" => "5", "commit" => "Criar Formulário", "admin_id" => "12"}
+ +

Redirected to www.example.com/admin/12/enviar_formularios Completed 302 Found in 0ms (ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 0.0ms) Started GET “/admin/12/enviar_formularios” for 127.0.0.1 at 2026-06-30 14:24:23 -0300 Processing by AdminController#enviar_formularios as HTML

+ +
Parameters: {"admin_id" => "12"}
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/enviar_formularios.html.erb within layouts/gerenciamento
+Template Load (0.3ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`usuario_id` = 12
+Turma Eager Load (0.3ms)  SELECT `turmas`.`id` AS t0_r0, `turmas`.`created_at` AS t0_r1, `turmas`.`disciplina_id` AS t0_r2, `turmas`.`horario` AS t0_r3, `turmas`.`numero_da_turma` AS t0_r4, `turmas`.`semestre` AS t0_r5, `turmas`.`updated_at` AS t0_r6, `disciplinas`.`id` AS t1_r0, `disciplinas`.`codigo` AS t1_r1, `disciplinas`.`created_at` AS t1_r2, `disciplinas`.`departamento_id` AS t1_r3, `disciplinas`.`nome` AS t1_r4, `disciplinas`.`updated_at` AS t1_r5 FROM `turmas` INNER JOIN `disciplinas` ON `disciplinas`.`id` = `turmas`.`disciplina_id` ORDER BY disciplinas.nome, turmas.semestre
+Rendered admin/enviar_formularios.html.erb within layouts/gerenciamento (Duration: 1.0ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 1.2ms | GC: 0.0ms)
+ +

Completed 200 OK in 2ms (Views: 0.8ms | ActiveRecord: 0.6ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.4ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Departamento' AND `departamentos`.`codigo` = 'TST' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'TST' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('TST', '2026-06-30 17:24:23.072665', 'Departamento', '2026-06-30 17:24:23.072665')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '123456789' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.2ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:24:23.074419', NULL, NULL, NULL, 13, 'admin@unb.br', NULL, '123456789', 'Admin', NULL, NULL, '123456', 'Administrador', '2026-06-30 17:24:23.074419')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Campo Exists? (0.3ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.2ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 2 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.2ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 3 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.1ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 4 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.2ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.2ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 2 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.2ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 3 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.2ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 4 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.2ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 5 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.2ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Template Create (0.3ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:24:23.080343', 'Avaliação Padrão', '2026-06-30 17:24:23.080343', 13)
+Elemento Create (0.2ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:24:23.080866', 'Como você avalia o professor?', 1, 6, '2026-06-30 17:24:23.080866')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.081339', 6, 'Ótimo', 1, 'Múltipla Escolha', '2026-06-30 17:24:23.081339')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.081721', 6, 'Bom', 2, 'Múltipla Escolha', '2026-06-30 17:24:23.081721')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.082124', 6, 'Regular', 3, 'Múltipla Escolha', '2026-06-30 17:24:23.082124')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.082493', 6, 'Ruim', 4, 'Múltipla Escolha', '2026-06-30 17:24:23.082493')
+Elemento Create (0.2ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:24:23.082850', 'Qual seu nível de satisfação?', 2, 6, '2026-06-30 17:24:23.082850')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.083205', 7, '1', 1, 'Escala', '2026-06-30 17:24:23.083205')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.083559', 7, '2', 2, 'Escala', '2026-06-30 17:24:23.083559')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.083900', 7, '3', 3, 'Escala', '2026-06-30 17:24:23.083900')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.084239', 7, '4', 4, 'Escala', '2026-06-30 17:24:23.084239')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.084578', 7, '5', 5, 'Escala', '2026-06-30 17:24:23.084578')
+Elemento Create (0.2ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:24:23.084924', 'Deixe seu comentário', 3, 6, '2026-06-30 17:24:23.084924')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.085269', 8, NULL, 1, 'Texto', '2026-06-30 17:24:23.085269')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Departamento' AND `departamentos`.`codigo` = 'TST' LIMIT 1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'TEC001' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.2ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'TEC001' LIMIT 1
+Disciplina Create (0.1ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('TEC001', '2026-06-30 17:24:23.087273', 13, 'Matemática', '2026-06-30 17:24:23.087273')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.1ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`disciplina_id` = 4 AND `turmas`.`numero_da_turma` = 'A' AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'A' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 4 LIMIT 1
+Turma Create (0.1ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:24:23.088582', 4, 'Seg 08:00-10:00', 'A', '2026.1', '2026-06-30 17:24:23.088582')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.1ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'TEC002' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'TEC002' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('TEC002', '2026-06-30 17:24:23.089760', 13, 'Português', '2026-06-30 17:24:23.089760')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`disciplina_id` = 5 AND `turmas`.`numero_da_turma` = 'B' AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.3ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'B' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 5 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:24:23.091140', 5, 'Seg 08:00-10:00', 'B', '2026.1', '2026-06-30 17:24:23.091140')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.1ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'TEC003' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.2ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'TEC003' LIMIT 1
+Disciplina Create (0.1ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('TEC003', '2026-06-30 17:24:23.092251', 13, 'História', '2026-06-30 17:24:23.092251')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`disciplina_id` = 6 AND `turmas`.`numero_da_turma` = 'A' AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.3ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'A' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 6 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:24:23.093556', 6, 'Seg 08:00-10:00', 'A', '2026.1', '2026-06-30 17:24:23.093556')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/admin/13/enviar_formularios” for 127.0.0.1 at 2026-06-30 14:24:23 -0300 Processing by AdminController#enviar_formularios as HTML

+ +
Parameters: {"admin_id" => "13"}
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/enviar_formularios.html.erb within layouts/gerenciamento
+Template Load (0.2ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`usuario_id` = 13
+Turma Eager Load (0.4ms)  SELECT `turmas`.`id` AS t0_r0, `turmas`.`created_at` AS t0_r1, `turmas`.`disciplina_id` AS t0_r2, `turmas`.`horario` AS t0_r3, `turmas`.`numero_da_turma` AS t0_r4, `turmas`.`semestre` AS t0_r5, `turmas`.`updated_at` AS t0_r6, `disciplinas`.`id` AS t1_r0, `disciplinas`.`codigo` AS t1_r1, `disciplinas`.`created_at` AS t1_r2, `disciplinas`.`departamento_id` AS t1_r3, `disciplinas`.`nome` AS t1_r4, `disciplinas`.`updated_at` AS t1_r5 FROM `turmas` INNER JOIN `disciplinas` ON `disciplinas`.`id` = `turmas`.`disciplina_id` ORDER BY disciplinas.nome, turmas.semestre
+Rendered admin/enviar_formularios.html.erb within layouts/gerenciamento (Duration: 1.2ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 1.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 2ms (Views: 0.9ms | ActiveRecord: 0.6ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
Disciplina Load (0.3ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'TEC001' AND `disciplinas`.`nome` = 'Matemática' LIMIT 1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`disciplina_id` = 4 AND `turmas`.`numero_da_turma` = 'A' LIMIT 1
+ +

Started POST “/admin/13/enviar_formularios” for 127.0.0.1 at 2026-06-30 14:24:23 -0300 Processing by AdminController#enviar_formularios as HTML

+ +
Parameters: {"template_id" => "6", "turma_ids" => ["4"], "commit" => "Criar Formulário", "admin_id" => "13"}
+Template Load (0.2ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`id` = 6 LIMIT 1
+Elemento Load (0.2ms)  SELECT `elementos`.* FROM `elementos` WHERE `elementos`.`template_id` = 6
+Campo Load (0.3ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` IN (6, 7, 8)
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`id` = 4
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`id` = 4 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.5ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:24:23.102869', NULL, NULL, NULL, 'Matemática - 2026.1', 4, '2026-06-30 17:24:23.102869')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.3ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:24:23.104258', 'Como você avalia o professor?', 2, 1, 'Múltipla Escolha', '2026-06-30 17:24:23.104258')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.3ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.105042', 2, 'Ótimo', 1, NULL, '2026-06-30 17:24:23.105042')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.2ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.105732', 2, 'Bom', 2, NULL, '2026-06-30 17:24:23.105732')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.2ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.106638', 2, 'Regular', 3, NULL, '2026-06-30 17:24:23.106638')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.3ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.107277', 2, 'Ruim', 4, NULL, '2026-06-30 17:24:23.107277')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.3ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:24:23.108085', 'Qual seu nível de satisfação?', 2, 2, 'Escala', '2026-06-30 17:24:23.108085')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.3ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.109038', 3, '1', 1, NULL, '2026-06-30 17:24:23.109038')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.3ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.109792', 3, '2', 2, NULL, '2026-06-30 17:24:23.109792')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.4ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.110537', 3, '3', 3, NULL, '2026-06-30 17:24:23.110537')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.4ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.111392', 3, '4', 4, NULL, '2026-06-30 17:24:23.111392')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.4ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.112178', 3, '5', 5, NULL, '2026-06-30 17:24:23.112178')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:24:23.112985', 'Deixe seu comentário', 2, 3, 'Texto', '2026-06-30 17:24:23.112985')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/admin/13/gerenciamento Completed 302 Found in 14ms (ActiveRecord: 8.2ms (18 queries, 0 cached) | GC: 0.2ms) Started GET “/admin/13/gerenciamento” for 127.0.0.1 at 2026-06-30 14:24:23 -0300 Processing by AdminController#gerenciamento as HTML

+ +
Parameters: {"admin_id" => "13"}
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/gerenciamento.html.erb within layouts/gerenciamento
+Rendered admin/gerenciamento.html.erb within layouts/gerenciamento (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 0.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.5ms | ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 0.1ms)

+ +
Template Load (0.3ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`nome` = 'Avaliação Padrão' LIMIT 1
+Formulario Load (0.3ms)  SELECT `formularios`.* FROM `formularios` ORDER BY `formularios`.`id` DESC LIMIT 1
+ElementoForm Count (0.2ms)  SELECT COUNT(*) FROM `elemento_forms` WHERE `elemento_forms`.`formulario_id` = 2
+Elemento Count (0.2ms)  SELECT COUNT(*) FROM `elementos` WHERE `elementos`.`template_id` = 6
+ElementoForm Load (0.2ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`formulario_id` = 2 ORDER BY `elemento_forms`.`ordem` ASC
+Elemento Load (0.2ms)  SELECT `elementos`.* FROM `elementos` WHERE `elementos`.`template_id` = 6 ORDER BY `elementos`.`ordem` ASC
+Elemento Load (0.2ms)  SELECT `elementos`.* FROM `elementos` WHERE `elementos`.`template_id` = 6 ORDER BY `elementos`.`ordem` ASC
+Elemento Load (0.2ms)  SELECT `elementos`.* FROM `elementos` WHERE `elementos`.`template_id` = 6 ORDER BY `elementos`.`ordem` ASC
+Disciplina Load (0.1ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Matemática' LIMIT 1
+Turma Load (0.1ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`disciplina_id` = 4 AND `turmas`.`numero_da_turma` = 'A' LIMIT 1
+Formulario Load (0.2ms)  SELECT `formularios`.* FROM `formularios` ORDER BY `formularios`.`id` DESC LIMIT 1
+Turma Load (0.1ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`id` = 4 LIMIT 1
+TRANSACTION (0.9ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.4ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Departamento' AND `departamentos`.`codigo` = 'TST' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'TST' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('TST', '2026-06-30 17:24:23.124734', 'Departamento', '2026-06-30 17:24:23.124734')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '123456789' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.3ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:24:23.126515', NULL, NULL, NULL, 14, 'admin@unb.br', NULL, '123456789', 'Admin', NULL, NULL, '123456', 'Administrador', '2026-06-30 17:24:23.126515')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Campo Exists? (0.4ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.2ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 2 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.2ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 3 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.2ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 4 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.2ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.2ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 2 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.1ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 3 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.1ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 4 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.1ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 5 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.2ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Template Create (0.3ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:24:23.132276', 'Avaliação Padrão', '2026-06-30 17:24:23.132276', 14)
+Elemento Create (0.2ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:24:23.132761', 'Como você avalia o professor?', 1, 7, '2026-06-30 17:24:23.132761')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.133176', 9, 'Ótimo', 1, 'Múltipla Escolha', '2026-06-30 17:24:23.133176')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.133548', 9, 'Bom', 2, 'Múltipla Escolha', '2026-06-30 17:24:23.133548')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.133897', 9, 'Regular', 3, 'Múltipla Escolha', '2026-06-30 17:24:23.133897')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.134251', 9, 'Ruim', 4, 'Múltipla Escolha', '2026-06-30 17:24:23.134251')
+Elemento Create (0.2ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:24:23.134608', 'Qual seu nível de satisfação?', 2, 7, '2026-06-30 17:24:23.134608')
+Campo Create (0.3ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.134958', 10, '1', 1, 'Escala', '2026-06-30 17:24:23.134958')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.135393', 10, '2', 2, 'Escala', '2026-06-30 17:24:23.135393')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.135746', 10, '3', 3, 'Escala', '2026-06-30 17:24:23.135746')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.136086', 10, '4', 4, 'Escala', '2026-06-30 17:24:23.136086')
+Campo Create (0.3ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.136431', 10, '5', 5, 'Escala', '2026-06-30 17:24:23.136431')
+Elemento Create (0.1ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:24:23.136931', 'Deixe seu comentário', 3, 7, '2026-06-30 17:24:23.136931')
+Campo Create (0.1ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.137252', 11, NULL, 1, 'Texto', '2026-06-30 17:24:23.137252')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Departamento' AND `departamentos`.`codigo` = 'TST' LIMIT 1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'TEC001' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.4ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'TEC001' LIMIT 1
+Disciplina Create (0.3ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('TEC001', '2026-06-30 17:24:23.139133', 14, 'Matemática', '2026-06-30 17:24:23.139133')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`disciplina_id` = 7 AND `turmas`.`numero_da_turma` = 'A' AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'A' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 7 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:24:23.140744', 7, 'Seg 08:00-10:00', 'A', '2026.1', '2026-06-30 17:24:23.140744')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'TEC002' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'TEC002' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('TEC002', '2026-06-30 17:24:23.142010', 14, 'Português', '2026-06-30 17:24:23.142010')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`disciplina_id` = 8 AND `turmas`.`numero_da_turma` = 'B' AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.3ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'B' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 8 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:24:23.143436', 8, 'Seg 08:00-10:00', 'B', '2026.1', '2026-06-30 17:24:23.143436')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'TEC003' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'TEC003' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('TEC003', '2026-06-30 17:24:23.144754', 14, 'História', '2026-06-30 17:24:23.144754')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`disciplina_id` = 9 AND `turmas`.`numero_da_turma` = 'A' AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.3ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'A' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 9 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:24:23.146192', 9, 'Seg 08:00-10:00', 'A', '2026.1', '2026-06-30 17:24:23.146192')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/admin/14/enviar_formularios” for 127.0.0.1 at 2026-06-30 14:24:23 -0300 Processing by AdminController#enviar_formularios as HTML

+ +
Parameters: {"admin_id" => "14"}
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/enviar_formularios.html.erb within layouts/gerenciamento
+Template Load (0.2ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`usuario_id` = 14
+Turma Eager Load (0.4ms)  SELECT `turmas`.`id` AS t0_r0, `turmas`.`created_at` AS t0_r1, `turmas`.`disciplina_id` AS t0_r2, `turmas`.`horario` AS t0_r3, `turmas`.`numero_da_turma` AS t0_r4, `turmas`.`semestre` AS t0_r5, `turmas`.`updated_at` AS t0_r6, `disciplinas`.`id` AS t1_r0, `disciplinas`.`codigo` AS t1_r1, `disciplinas`.`created_at` AS t1_r2, `disciplinas`.`departamento_id` AS t1_r3, `disciplinas`.`nome` AS t1_r4, `disciplinas`.`updated_at` AS t1_r5 FROM `turmas` INNER JOIN `disciplinas` ON `disciplinas`.`id` = `turmas`.`disciplina_id` ORDER BY disciplinas.nome, turmas.semestre
+Rendered admin/enviar_formularios.html.erb within layouts/gerenciamento (Duration: 1.2ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 1.5ms | GC: 0.1ms)
+ +

Completed 200 OK in 2ms (Views: 1.0ms | ActiveRecord: 0.6ms (2 queries, 0 cached) | GC: 0.1ms)

+ +
Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'TEC001' AND `disciplinas`.`nome` = 'Matemática' LIMIT 1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`disciplina_id` = 7 AND `turmas`.`numero_da_turma` = 'A' LIMIT 1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'TEC002' AND `disciplinas`.`nome` = 'Português' LIMIT 1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`disciplina_id` = 8 AND `turmas`.`numero_da_turma` = 'B' LIMIT 1
+ +

Started POST “/admin/14/enviar_formularios” for 127.0.0.1 at 2026-06-30 14:24:23 -0300 Processing by AdminController#enviar_formularios as HTML

+ +
Parameters: {"template_id" => "7", "turma_ids" => ["7", "8"], "commit" => "Criar Formulário", "admin_id" => "14"}
+Template Load (0.1ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`id` = 7 LIMIT 1
+Elemento Load (0.1ms)  SELECT `elementos`.* FROM `elementos` WHERE `elementos`.`template_id` = 7
+Campo Load (0.1ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` IN (9, 10, 11)
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`id` IN (7, 8)
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`id` = 7 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.2ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:24:23.156087', NULL, NULL, NULL, 'Matemática - 2026.1', 7, '2026-06-30 17:24:23.156087')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:24:23.157018', 'Como você avalia o professor?', 3, 1, 'Múltipla Escolha', '2026-06-30 17:24:23.157018')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.4ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.157892', 5, 'Ótimo', 1, NULL, '2026-06-30 17:24:23.157892')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.3ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.158664', 5, 'Bom', 2, NULL, '2026-06-30 17:24:23.158664')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.3ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.159417', 5, 'Regular', 3, NULL, '2026-06-30 17:24:23.159417')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.3ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.160171', 5, 'Ruim', 4, NULL, '2026-06-30 17:24:23.160171')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:24:23.160929', 'Qual seu nível de satisfação?', 3, 2, 'Escala', '2026-06-30 17:24:23.160929')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.3ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.161731', 6, '1', 1, NULL, '2026-06-30 17:24:23.161731')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.4ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.162739', 6, '2', 2, NULL, '2026-06-30 17:24:23.162739')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.4ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.163521', 6, '3', 3, NULL, '2026-06-30 17:24:23.163521')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.3ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.164351', 6, '4', 4, NULL, '2026-06-30 17:24:23.164351')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.3ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.165088', 6, '5', 5, NULL, '2026-06-30 17:24:23.165088')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.3ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:24:23.165846', 'Deixe seu comentário', 3, 3, 'Texto', '2026-06-30 17:24:23.165846')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`id` = 8 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:24:23.166934', NULL, NULL, NULL, 'Português - 2026.1', 8, '2026-06-30 17:24:23.166934')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.3ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:24:23.167754', 'Como você avalia o professor?', 4, 1, 'Múltipla Escolha', '2026-06-30 17:24:23.167754')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.3ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.168537', 8, 'Ótimo', 1, NULL, '2026-06-30 17:24:23.168537')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.3ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.169270', 8, 'Bom', 2, NULL, '2026-06-30 17:24:23.169270')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.2ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.170142', 8, 'Regular', 3, NULL, '2026-06-30 17:24:23.170142')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.2ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.170853', 8, 'Ruim', 4, NULL, '2026-06-30 17:24:23.170853')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.3ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:24:23.171495', 'Qual seu nível de satisfação?', 4, 2, 'Escala', '2026-06-30 17:24:23.171495')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.4ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.172335', 9, '1', 1, NULL, '2026-06-30 17:24:23.172335')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.3ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.173192', 9, '2', 2, NULL, '2026-06-30 17:24:23.173192')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.3ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.174010', 9, '3', 3, NULL, '2026-06-30 17:24:23.174010')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.3ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.174753', 9, '4', 4, NULL, '2026-06-30 17:24:23.174753')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.3ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.175499', 9, '5', 5, NULL, '2026-06-30 17:24:23.175499')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.3ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:24:23.176265', 'Deixe seu comentário', 4, 3, 'Texto', '2026-06-30 17:24:23.176265')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/admin/14/gerenciamento Completed 302 Found in 24ms (ActiveRecord: 15.2ms (32 queries, 0 cached) | GC: 0.4ms) Started GET “/admin/14/gerenciamento” for 127.0.0.1 at 2026-06-30 14:24:23 -0300 Processing by AdminController#gerenciamento as HTML

+ +
Parameters: {"admin_id" => "14"}
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/gerenciamento.html.erb within layouts/gerenciamento
+Rendered admin/gerenciamento.html.erb within layouts/gerenciamento (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 0.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.5ms | ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 0.0ms)

+ +
Disciplina Load (0.4ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Matemática' LIMIT 1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`disciplina_id` = 7 AND `turmas`.`numero_da_turma` = 'A' LIMIT 1
+Formulario Exists? (0.2ms)  SELECT 1 AS one FROM `formularios` WHERE `formularios`.`turma_id` = 7 LIMIT 1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Português' LIMIT 1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`disciplina_id` = 8 AND `turmas`.`numero_da_turma` = 'B' LIMIT 1
+Formulario Exists? (0.2ms)  SELECT 1 AS one FROM `formularios` WHERE `formularios`.`turma_id` = 8 LIMIT 1
+Template Load (0.2ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`nome` = 'Avaliação Padrão' LIMIT 1
+Formulario Load (0.2ms)  SELECT `formularios`.* FROM `formularios`
+ElementoForm Count (0.2ms)  SELECT COUNT(*) FROM `elemento_forms` WHERE `elemento_forms`.`formulario_id` = 3
+Elemento Count (0.2ms)  SELECT COUNT(*) FROM `elementos` WHERE `elementos`.`template_id` = 7
+ElementoForm Count (0.2ms)  SELECT COUNT(*) FROM `elemento_forms` WHERE `elemento_forms`.`formulario_id` = 4
+Elemento Count (0.2ms)  SELECT COUNT(*) FROM `elementos` WHERE `elementos`.`template_id` = 7
+TRANSACTION (0.6ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Departamento' AND `departamentos`.`codigo` = 'TST' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'TST' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('TST', '2026-06-30 17:24:23.186551', 'Departamento', '2026-06-30 17:24:23.186551')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Administrador Load (0.1ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '123456789' LIMIT 1
+Usuario Exists? (0.1ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.3ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:24:23.188095', NULL, NULL, NULL, 15, 'admin@unb.br', NULL, '123456789', 'Admin', NULL, NULL, '123456', 'Administrador', '2026-06-30 17:24:23.188095')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Campo Exists? (0.3ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.1ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 2 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.1ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 3 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.1ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 4 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.1ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.1ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 2 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.1ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 3 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.1ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 4 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.1ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 5 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.1ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Template Create (0.2ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:24:23.193613', 'Avaliação Padrão', '2026-06-30 17:24:23.193613', 15)
+Elemento Create (0.2ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:24:23.194032', 'Como você avalia o professor?', 1, 8, '2026-06-30 17:24:23.194032')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.194429', 12, 'Ótimo', 1, 'Múltipla Escolha', '2026-06-30 17:24:23.194429')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.194803', 12, 'Bom', 2, 'Múltipla Escolha', '2026-06-30 17:24:23.194803')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.195159', 12, 'Regular', 3, 'Múltipla Escolha', '2026-06-30 17:24:23.195159')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.195514', 12, 'Ruim', 4, 'Múltipla Escolha', '2026-06-30 17:24:23.195514')
+Elemento Create (0.2ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:24:23.195867', 'Qual seu nível de satisfação?', 2, 8, '2026-06-30 17:24:23.195867')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.196231', 13, '1', 1, 'Escala', '2026-06-30 17:24:23.196231')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.196593', 13, '2', 2, 'Escala', '2026-06-30 17:24:23.196593')
+Campo Create (0.3ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.196942', 13, '3', 3, 'Escala', '2026-06-30 17:24:23.196942')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.197365', 13, '4', 4, 'Escala', '2026-06-30 17:24:23.197365')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.197737', 13, '5', 5, 'Escala', '2026-06-30 17:24:23.197737')
+Elemento Create (0.2ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:24:23.198095', 'Deixe seu comentário', 3, 8, '2026-06-30 17:24:23.198095')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.198450', 14, NULL, 1, 'Texto', '2026-06-30 17:24:23.198450')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Departamento' AND `departamentos`.`codigo` = 'TST' LIMIT 1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'TEC001' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'TEC001' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('TEC001', '2026-06-30 17:24:23.200209', 15, 'Matemática', '2026-06-30 17:24:23.200209')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`disciplina_id` = 10 AND `turmas`.`numero_da_turma` = 'A' AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.3ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'A' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 10 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:24:23.201632', 10, 'Seg 08:00-10:00', 'A', '2026.1', '2026-06-30 17:24:23.201632')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'TEC002' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'TEC002' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('TEC002', '2026-06-30 17:24:23.202864', 15, 'Português', '2026-06-30 17:24:23.202864')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.1ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`disciplina_id` = 11 AND `turmas`.`numero_da_turma` = 'B' AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.2ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'B' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 11 LIMIT 1
+Turma Create (0.1ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:24:23.204455', 11, 'Seg 08:00-10:00', 'B', '2026.1', '2026-06-30 17:24:23.204455')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.1ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'TEC003' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'TEC003' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('TEC003', '2026-06-30 17:24:23.205524', 15, 'História', '2026-06-30 17:24:23.205524')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`disciplina_id` = 12 AND `turmas`.`numero_da_turma` = 'A' AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.3ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'A' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 12 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:24:23.206943', 12, 'Seg 08:00-10:00', 'A', '2026.1', '2026-06-30 17:24:23.206943')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/admin/15/enviar_formularios” for 127.0.0.1 at 2026-06-30 14:24:23 -0300 Processing by AdminController#enviar_formularios as HTML

+ +
Parameters: {"admin_id" => "15"}
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/enviar_formularios.html.erb within layouts/gerenciamento
+Template Load (0.2ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`usuario_id` = 15
+Turma Eager Load (0.4ms)  SELECT `turmas`.`id` AS t0_r0, `turmas`.`created_at` AS t0_r1, `turmas`.`disciplina_id` AS t0_r2, `turmas`.`horario` AS t0_r3, `turmas`.`numero_da_turma` AS t0_r4, `turmas`.`semestre` AS t0_r5, `turmas`.`updated_at` AS t0_r6, `disciplinas`.`id` AS t1_r0, `disciplinas`.`codigo` AS t1_r1, `disciplinas`.`created_at` AS t1_r2, `disciplinas`.`departamento_id` AS t1_r3, `disciplinas`.`nome` AS t1_r4, `disciplinas`.`updated_at` AS t1_r5 FROM `turmas` INNER JOIN `disciplinas` ON `disciplinas`.`id` = `turmas`.`disciplina_id` ORDER BY disciplinas.nome, turmas.semestre
+Rendered admin/enviar_formularios.html.erb within layouts/gerenciamento (Duration: 1.2ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 1.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 2ms (Views: 0.9ms | ActiveRecord: 0.6ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'TEC001' AND `disciplinas`.`nome` = 'Matemática' LIMIT 1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`disciplina_id` = 10 AND `turmas`.`numero_da_turma` = 'A' LIMIT 1
+ +

Started POST “/admin/15/enviar_formularios” for 127.0.0.1 at 2026-06-30 14:24:23 -0300 Processing by AdminController#enviar_formularios as HTML

+ +
Parameters: {"template_id" => "", "turma_ids" => ["10"], "commit" => "Criar Formulário", "admin_id" => "15"}
+ +

Redirected to www.example.com/admin/15/enviar_formularios Completed 302 Found in 0ms (ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 0.0ms) Started GET “/admin/15/enviar_formularios” for 127.0.0.1 at 2026-06-30 14:24:23 -0300 Processing by AdminController#enviar_formularios as HTML

+ +
Parameters: {"admin_id" => "15"}
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/enviar_formularios.html.erb within layouts/gerenciamento
+Template Load (0.3ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`usuario_id` = 15
+Turma Eager Load (0.4ms)  SELECT `turmas`.`id` AS t0_r0, `turmas`.`created_at` AS t0_r1, `turmas`.`disciplina_id` AS t0_r2, `turmas`.`horario` AS t0_r3, `turmas`.`numero_da_turma` AS t0_r4, `turmas`.`semestre` AS t0_r5, `turmas`.`updated_at` AS t0_r6, `disciplinas`.`id` AS t1_r0, `disciplinas`.`codigo` AS t1_r1, `disciplinas`.`created_at` AS t1_r2, `disciplinas`.`departamento_id` AS t1_r3, `disciplinas`.`nome` AS t1_r4, `disciplinas`.`updated_at` AS t1_r5 FROM `turmas` INNER JOIN `disciplinas` ON `disciplinas`.`id` = `turmas`.`disciplina_id` ORDER BY disciplinas.nome, turmas.semestre
+Rendered admin/enviar_formularios.html.erb within layouts/gerenciamento (Duration: 1.1ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 1.3ms | GC: 0.0ms)
+ +

Completed 200 OK in 2ms (Views: 0.8ms | ActiveRecord: 0.6ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.4ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Departamento' AND `departamentos`.`codigo` = 'TST' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'TST' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('TST', '2026-06-30 17:24:23.218947', 'Departamento', '2026-06-30 17:24:23.218947')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '123456789' LIMIT 1
+Usuario Exists? (0.1ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.1ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:24:23.220749', NULL, NULL, NULL, 16, 'admin@unb.br', NULL, '123456789', 'Admin', NULL, NULL, '123456', 'Administrador', '2026-06-30 17:24:23.220749')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Campo Exists? (0.3ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.1ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 2 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.1ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 3 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.1ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 4 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.1ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.1ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 2 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.1ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 3 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.2ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 4 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.1ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 5 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.1ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Template Create (0.2ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:24:23.226379', 'Avaliação Padrão', '2026-06-30 17:24:23.226379', 16)
+Elemento Create (0.2ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:24:23.226806', 'Como você avalia o professor?', 1, 9, '2026-06-30 17:24:23.226806')
+Campo Create (0.3ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.227195', 15, 'Ótimo', 1, 'Múltipla Escolha', '2026-06-30 17:24:23.227195')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.227619', 15, 'Bom', 2, 'Múltipla Escolha', '2026-06-30 17:24:23.227619')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.228009', 15, 'Regular', 3, 'Múltipla Escolha', '2026-06-30 17:24:23.228009')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.228384', 15, 'Ruim', 4, 'Múltipla Escolha', '2026-06-30 17:24:23.228384')
+Elemento Create (0.2ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:24:23.228768', 'Qual seu nível de satisfação?', 2, 9, '2026-06-30 17:24:23.228768')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.229152', 16, '1', 1, 'Escala', '2026-06-30 17:24:23.229152')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.229513', 16, '2', 2, 'Escala', '2026-06-30 17:24:23.229513')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.229922', 16, '3', 3, 'Escala', '2026-06-30 17:24:23.229922')
+Campo Create (0.3ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.230290', 16, '4', 4, 'Escala', '2026-06-30 17:24:23.230290')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.230714', 16, '5', 5, 'Escala', '2026-06-30 17:24:23.230714')
+Elemento Create (0.2ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:24:23.231097', 'Deixe seu comentário', 3, 9, '2026-06-30 17:24:23.231097')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.231481', 17, NULL, 1, 'Texto', '2026-06-30 17:24:23.231481')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Departamento' AND `departamentos`.`codigo` = 'TST' LIMIT 1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'TEC001' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'TEC001' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('TEC001', '2026-06-30 17:24:23.233304', 16, 'Matemática', '2026-06-30 17:24:23.233304')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`disciplina_id` = 13 AND `turmas`.`numero_da_turma` = 'A' AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'A' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 13 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:24:23.234823', 13, 'Seg 08:00-10:00', 'A', '2026.1', '2026-06-30 17:24:23.234823')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'TEC002' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'TEC002' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('TEC002', '2026-06-30 17:24:23.236084', 16, 'Português', '2026-06-30 17:24:23.236084')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`disciplina_id` = 14 AND `turmas`.`numero_da_turma` = 'B' AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.2ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'B' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 14 LIMIT 1
+Turma Create (0.1ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:24:23.237581', 14, 'Seg 08:00-10:00', 'B', '2026.1', '2026-06-30 17:24:23.237581')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.1ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'TEC003' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'TEC003' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('TEC003', '2026-06-30 17:24:23.238647', 16, 'História', '2026-06-30 17:24:23.238647')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`disciplina_id` = 15 AND `turmas`.`numero_da_turma` = 'A' AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.3ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'A' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 15 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:24:23.240027', 15, 'Seg 08:00-10:00', 'A', '2026.1', '2026-06-30 17:24:23.240027')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/admin/16/enviar_formularios” for 127.0.0.1 at 2026-06-30 14:24:23 -0300 Processing by AdminController#enviar_formularios as HTML

+ +
Parameters: {"admin_id" => "16"}
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/enviar_formularios.html.erb within layouts/gerenciamento
+Template Load (0.3ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`usuario_id` = 16
+Turma Eager Load (0.4ms)  SELECT `turmas`.`id` AS t0_r0, `turmas`.`created_at` AS t0_r1, `turmas`.`disciplina_id` AS t0_r2, `turmas`.`horario` AS t0_r3, `turmas`.`numero_da_turma` AS t0_r4, `turmas`.`semestre` AS t0_r5, `turmas`.`updated_at` AS t0_r6, `disciplinas`.`id` AS t1_r0, `disciplinas`.`codigo` AS t1_r1, `disciplinas`.`created_at` AS t1_r2, `disciplinas`.`departamento_id` AS t1_r3, `disciplinas`.`nome` AS t1_r4, `disciplinas`.`updated_at` AS t1_r5 FROM `turmas` INNER JOIN `disciplinas` ON `disciplinas`.`id` = `turmas`.`disciplina_id` ORDER BY disciplinas.nome, turmas.semestre
+Rendered admin/enviar_formularios.html.erb within layouts/gerenciamento (Duration: 1.4ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 1.6ms | GC: 0.0ms)
+ +

Completed 200 OK in 2ms (Views: 1.1ms | ActiveRecord: 0.7ms (2 queries, 0 cached) | GC: 0.0ms) Started POST “/admin/16/enviar_formularios” for 127.0.0.1 at 2026-06-30 14:24:23 -0300 Processing by AdminController#enviar_formularios as HTML

+ +
Parameters: {"template_id" => "9", "commit" => "Criar Formulário", "admin_id" => "16"}
+ +

Redirected to www.example.com/admin/16/enviar_formularios Completed 302 Found in 0ms (ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 0.0ms) Started GET “/admin/16/enviar_formularios” for 127.0.0.1 at 2026-06-30 14:24:23 -0300 Processing by AdminController#enviar_formularios as HTML

+ +
Parameters: {"admin_id" => "16"}
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/enviar_formularios.html.erb within layouts/gerenciamento
+Template Load (0.2ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`usuario_id` = 16
+Turma Eager Load (0.2ms)  SELECT `turmas`.`id` AS t0_r0, `turmas`.`created_at` AS t0_r1, `turmas`.`disciplina_id` AS t0_r2, `turmas`.`horario` AS t0_r3, `turmas`.`numero_da_turma` AS t0_r4, `turmas`.`semestre` AS t0_r5, `turmas`.`updated_at` AS t0_r6, `disciplinas`.`id` AS t1_r0, `disciplinas`.`codigo` AS t1_r1, `disciplinas`.`created_at` AS t1_r2, `disciplinas`.`departamento_id` AS t1_r3, `disciplinas`.`nome` AS t1_r4, `disciplinas`.`updated_at` AS t1_r5 FROM `turmas` INNER JOIN `disciplinas` ON `disciplinas`.`id` = `turmas`.`disciplina_id` ORDER BY disciplinas.nome, turmas.semestre
+Rendered admin/enviar_formularios.html.erb within layouts/gerenciamento (Duration: 1.3ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 1.6ms | GC: 0.0ms)
+ +

Completed 200 OK in 2ms (Views: 1.5ms | ActiveRecord: 0.4ms (2 queries, 0 cached) | GC: 0.2ms)

+ +
TRANSACTION (0.9ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.4ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Departamento' AND `departamentos`.`codigo` = 'TST' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'TST' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('TST', '2026-06-30 17:24:23.258854', 'Departamento', '2026-06-30 17:24:23.258854')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '123456789' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.1ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:24:23.260622', NULL, NULL, NULL, 17, 'admin@unb.br', NULL, '123456789', 'Admin', NULL, NULL, '123456', 'Administrador', '2026-06-30 17:24:23.260622')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Campo Exists? (0.4ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.2ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 2 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.1ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 3 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.1ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 4 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.1ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.1ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 2 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.1ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 3 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.1ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 4 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.1ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 5 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.1ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Template Create (0.2ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:24:23.266266', 'Avaliação Padrão', '2026-06-30 17:24:23.266266', 17)
+Elemento Create (0.2ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:24:23.266720', 'Como você avalia o professor?', 1, 10, '2026-06-30 17:24:23.266720')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.267119', 18, 'Ótimo', 1, 'Múltipla Escolha', '2026-06-30 17:24:23.267119')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.267490', 18, 'Bom', 2, 'Múltipla Escolha', '2026-06-30 17:24:23.267490')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.267846', 18, 'Regular', 3, 'Múltipla Escolha', '2026-06-30 17:24:23.267846')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.268264', 18, 'Ruim', 4, 'Múltipla Escolha', '2026-06-30 17:24:23.268264')
+Elemento Create (0.2ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:24:23.268623', 'Qual seu nível de satisfação?', 2, 10, '2026-06-30 17:24:23.268623')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.268983', 19, '1', 1, 'Escala', '2026-06-30 17:24:23.268983')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.269334', 19, '2', 2, 'Escala', '2026-06-30 17:24:23.269334')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.269682', 19, '3', 3, 'Escala', '2026-06-30 17:24:23.269682')
+Campo Create (0.1ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.270137', 19, '4', 4, 'Escala', '2026-06-30 17:24:23.270137')
+Campo Create (0.1ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.270441', 19, '5', 5, 'Escala', '2026-06-30 17:24:23.270441')
+Elemento Create (0.1ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:24:23.270717', 'Deixe seu comentário', 3, 10, '2026-06-30 17:24:23.270717')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.270979', 20, NULL, 1, 'Texto', '2026-06-30 17:24:23.270979')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Departamento' AND `departamentos`.`codigo` = 'TST' LIMIT 1
+Disciplina Load (0.1ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'TEC001' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.2ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'TEC001' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('TEC001', '2026-06-30 17:24:23.272779', 17, 'Matemática', '2026-06-30 17:24:23.272779')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`disciplina_id` = 16 AND `turmas`.`numero_da_turma` = 'A' AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.3ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'A' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 16 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:24:23.274312', 16, 'Seg 08:00-10:00', 'A', '2026.1', '2026-06-30 17:24:23.274312')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'TEC002' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'TEC002' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('TEC002', '2026-06-30 17:24:23.275574', 17, 'Português', '2026-06-30 17:24:23.275574')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`disciplina_id` = 17 AND `turmas`.`numero_da_turma` = 'B' AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'B' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 17 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:24:23.277071', 17, 'Seg 08:00-10:00', 'B', '2026.1', '2026-06-30 17:24:23.277071')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'TEC003' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'TEC003' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('TEC003', '2026-06-30 17:24:23.278358', 17, 'História', '2026-06-30 17:24:23.278358')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`disciplina_id` = 18 AND `turmas`.`numero_da_turma` = 'A' AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Turma Exists? (0.6ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'A' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 18 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:24:23.280012', 18, 'Seg 08:00-10:00', 'A', '2026.1', '2026-06-30 17:24:23.280012')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/admin/17/enviar_formularios” for 127.0.0.1 at 2026-06-30 14:24:23 -0300 Processing by AdminController#enviar_formularios as HTML

+ +
Parameters: {"admin_id" => "17"}
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/enviar_formularios.html.erb within layouts/gerenciamento
+Template Load (0.2ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`usuario_id` = 17
+Turma Eager Load (0.4ms)  SELECT `turmas`.`id` AS t0_r0, `turmas`.`created_at` AS t0_r1, `turmas`.`disciplina_id` AS t0_r2, `turmas`.`horario` AS t0_r3, `turmas`.`numero_da_turma` AS t0_r4, `turmas`.`semestre` AS t0_r5, `turmas`.`updated_at` AS t0_r6, `disciplinas`.`id` AS t1_r0, `disciplinas`.`codigo` AS t1_r1, `disciplinas`.`created_at` AS t1_r2, `disciplinas`.`departamento_id` AS t1_r3, `disciplinas`.`nome` AS t1_r4, `disciplinas`.`updated_at` AS t1_r5 FROM `turmas` INNER JOIN `disciplinas` ON `disciplinas`.`id` = `turmas`.`disciplina_id` ORDER BY disciplinas.nome, turmas.semestre
+Rendered admin/enviar_formularios.html.erb within layouts/gerenciamento (Duration: 1.1ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 1.3ms | GC: 0.0ms)
+ +

Completed 200 OK in 2ms (Views: 0.9ms | ActiveRecord: 0.6ms (2 queries, 0 cached) | GC: 0.1ms)

+ +
Template Load (0.2ms)  SELECT `templates`.* FROM `templates`
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`semestre` = '2026.1'
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`id` = 16 LIMIT 1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`id` = 17 LIMIT 1
+Disciplina Load (0.1ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`id` = 18 LIMIT 1
+TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '161014' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' LIMIT 1
+Usuario Create (0.3ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:24:23.290205', NULL, NULL, NULL, NULL, 'usuario@teste.com', NULL, '161014', 'Usuário Teste', NULL, NULL, NULL, NULL, '2026-06-30 17:24:23.290205')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' AND `usuarios`.`id` != 18 LIMIT 1
+Usuario Update (0.3ms)  UPDATE `usuarios` SET `usuarios`.`definicao_senha_sent_at` = '2026-06-30 17:24:23.291299', `usuarios`.`definicao_senha_token` = 'O1C42kgTkRtRGIx7xrvC9Hbrpyc4VcktcmhDRhNgsHU', `usuarios`.`updated_at` = '2026-06-30 17:24:23.291904' WHERE `usuarios`.`id` = 18
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Rendering layout layouts/mailer.html.erb
+Rendering usuario_mailer/definicao_senha.html.erb within layouts/mailer
+Rendered usuario_mailer/definicao_senha.html.erb within layouts/mailer (Duration: 0.0ms | GC: 0.0ms)
+Rendered layout layouts/mailer.html.erb (Duration: 0.1ms | GC: 0.0ms)
+Rendering layout layouts/mailer.text.erb
+Rendering usuario_mailer/definicao_senha.text.erb within layouts/mailer
+Rendered usuario_mailer/definicao_senha.text.erb within layouts/mailer (Duration: 0.0ms | GC: 0.0ms)
+Rendered layout layouts/mailer.text.erb (Duration: 0.0ms | GC: 0.0ms)
+ +

UsuarioMailer#definicao_senha: processed outbound mail in 1.0ms Delivered mail 6a43fbc747c2b_181feea0-16@MacBook-Air-de-Elvis.local.mail (1.2ms) Date: Tue, 30 Jun 2026 14:24:23 -0300 From: camaar@gmail.com To: usuario@teste.com Message-ID: <6a43fbc747c2b_181feea0-16@MacBook-Air-de-Elvis.local.mail> Subject: =?UTF-8?Q?Defini=C3=A7=C3=A3o_de_senha?= MIME-Version: 1.0 Content-Type: multipart/alternative;

+ +
boundary="--==_mimepart_6a43fbc747a31_181feea0-28f";
+charset=UTF-8
+
+ +

Content-Transfer-Encoding: 7bit

+ +

—-==_mimepart_6a43fbc747a31_181feea0-28f Content-Type: text/plain;

+ +
charset=UTF-8
+
+ +

Content-Transfer-Encoding: quoted-printable

+ +

Ol=C3=A1, Usu=C3=A1rio Teste.

+ +

Para definir sua senha e acessar o sistema, acesse o link abaixo:

+ +

example.com/definir_senha/O1C42kgTkRtRGIx7xrvC9Hbrpyc4VcktcmhDRhNg= sHU

+ +

—-==_mimepart_6a43fbc747a31_181feea0-28f Content-Type: text/html;

+ +
charset=UTF-8
+
+ +

Content-Transfer-Encoding: quoted-printable

+ +

<!DOCTYPE html> <html>

+ +
<head>
+  <meta http-equiv=3D"Content-Type" content=3D"text/html; charset=3Dutf=
+ +

-8“>

+ +
  <style>
+    /* Email styles need to be inline */
+  </style>
+</head>
+
+<body>
+  <p>Ol=C3=A1, Usu=C3=A1rio Teste.</p>
+ +

<p>Para definir sua senha e acessar o sistema, acesse o link abaixo:</p>

+ +

<p><a href=3D“example.com/definir_senha/O1C42kgTkRtRGIx7xrvC9Hbrpy= c4VcktcmhDRhNgsHU”>example.com/definir_senha/O1C42kgTkRtRGIx7xrvC9= Hbrpyc4VcktcmhDRhNgsHU</a></p>

+ +
</body>
+ +

</html>

+ +

—-==_mimepart_6a43fbc747a31_181feea0-28f–

+ +

Started GET “/definir_senha/O1C42kgTkRtRGIx7xrvC9Hbrpyc4VcktcmhDRhNgsHU” for 127.0.0.1 at 2026-06-30 14:24:23 -0300 Processing by DefinicaoSenhasController#edit as HTML

+ +
Parameters: {"token" => "[FILTERED]"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`definicao_senha_token` = 'O1C42kgTkRtRGIx7xrvC9Hbrpyc4VcktcmhDRhNgsHU' LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering definicao_senhas/edit.html.erb within layouts/application
+Rendered definicao_senhas/edit.html.erb within layouts/application (Duration: 0.3ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.7ms | GC: 0.1ms)
+ +

Completed 200 OK in 2ms (Views: 1.0ms | ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.1ms) Started PATCH “/definir_senha/O1C42kgTkRtRGIx7xrvC9Hbrpyc4VcktcmhDRhNgsHU” for 127.0.0.1 at 2026-06-30 14:24:23 -0300 Processing by DefinicaoSenhasController#update as HTML

+ +
Parameters: {"senha" => "Senha123", "senha_confirmation" => "Senha123", "commit" => "Definir senha", "token" => "[FILTERED]"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`definicao_senha_token` = 'O1C42kgTkRtRGIx7xrvC9Hbrpyc4VcktcmhDRhNgsHU' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' AND `usuarios`.`id` != 18 LIMIT 1
+Usuario Update (0.7ms)  UPDATE `usuarios` SET `usuarios`.`definicao_senha_sent_at` = NULL, `usuarios`.`definicao_senha_token` = NULL, `usuarios`.`senha_hash` = '$2a$12$7xuVnjaegt00tuIr7cTcOub8LBv.gnErMCxfjqFBhzVquj5scDYm6', `usuarios`.`updated_at` = '2026-06-30 17:24:23.490600' WHERE `usuarios`.`id` = 18
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to example.com/ Completed 302 Found in 192ms (ActiveRecord: 1.6ms (3 queries, 0 cached) | GC: 0.0ms) Started GET “/” for 127.0.0.1 at 2026-06-30 14:24:23 -0300 Processing by SessionsController#new as HTML

+ +
Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering sessions/new.html.erb within layouts/application
+Rendered sessions/new.html.erb within layouts/application (Duration: 0.3ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.6ms | GC: 0.0ms)
+ +

Completed 200 OK in 3ms (Views: 1.0ms | ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/” for 127.0.0.1 at 2026-06-30 14:24:23 -0300 Processing by SessionsController#new as HTML

+ +
Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering sessions/new.html.erb within layouts/application
+Rendered sessions/new.html.erb within layouts/application (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.3ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.4ms | ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started POST “/login” for 127.0.0.1 at 2026-06-30 14:24:23 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "usuario@teste.com", "senha" => "Senha123", "commit" => "Entrar"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' LIMIT 1
+ +

Redirected to www.example.com/usuarios/18/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/usuarios/18/avaliacoes” for 127.0.0.1 at 2026-06-30 14:24:23 -0300 Processing by UsuariosController#avaliacoes as HTML

+ +
Parameters: {"usuario_id" => "18"}
+Usuario Load (0.5ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 18 LIMIT 1
+CACHE Usuario Load (0.0ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 18 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering usuarios/avaliacoes.html.erb within layouts/application
+Formulario Load (0.4ms)  SELECT `formularios`.* FROM `formularios` INNER JOIN `turmas` ON `turmas`.`id` = `formularios`.`turma_id` WHERE `formularios`.`turma_id` IN (SELECT `turmas`.`id` FROM `turmas` WHERE (1=0))
+Rendered usuarios/avaliacoes.html.erb within layouts/application (Duration: 1.1ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.3ms | GC: 0.0ms)
+ +

Completed 200 OK in 5ms (Views: 1.3ms | ActiveRecord: 0.9ms (3 queries, 1 cached) | GC: 0.1ms)

+ +
TRANSACTION (0.6ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '524545' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' LIMIT 1
+Usuario Create (0.3ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:24:23.699359', NULL, NULL, NULL, NULL, 'usuario@teste.com', NULL, '524545', 'Usuário Teste', NULL, NULL, NULL, NULL, '2026-06-30 17:24:23.699359')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' AND `usuarios`.`id` != 19 LIMIT 1
+Usuario Update (0.4ms)  UPDATE `usuarios` SET `usuarios`.`definicao_senha_sent_at` = '2026-06-30 17:24:23.700424', `usuarios`.`definicao_senha_token` = 'N8Td_35T41JGmu14wF8jAUBF0aotcnMQwwQww0BRnpE', `usuarios`.`updated_at` = '2026-06-30 17:24:23.701042' WHERE `usuarios`.`id` = 19
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Rendering layout layouts/mailer.html.erb
+Rendering usuario_mailer/definicao_senha.html.erb within layouts/mailer
+Rendered usuario_mailer/definicao_senha.html.erb within layouts/mailer (Duration: 0.0ms | GC: 0.0ms)
+Rendered layout layouts/mailer.html.erb (Duration: 0.1ms | GC: 0.0ms)
+Rendering layout layouts/mailer.text.erb
+Rendering usuario_mailer/definicao_senha.text.erb within layouts/mailer
+Rendered usuario_mailer/definicao_senha.text.erb within layouts/mailer (Duration: 0.0ms | GC: 0.0ms)
+Rendered layout layouts/mailer.text.erb (Duration: 0.1ms | GC: 0.0ms)
+ +

UsuarioMailer#definicao_senha: processed outbound mail in 1.1ms Delivered mail 6a43fbc7abb44_181feea0130@MacBook-Air-de-Elvis.local.mail (1.4ms) Date: Tue, 30 Jun 2026 14:24:23 -0300 From: camaar@gmail.com To: usuario@teste.com Message-ID: <6a43fbc7abb44_181feea0130@MacBook-Air-de-Elvis.local.mail> Subject: =?UTF-8?Q?Defini=C3=A7=C3=A3o_de_senha?= MIME-Version: 1.0 Content-Type: multipart/alternative;

+ +
boundary="--==_mimepart_6a43fbc7ab93b_181feea007d";
+charset=UTF-8
+
+ +

Content-Transfer-Encoding: 7bit

+ +

—-==_mimepart_6a43fbc7ab93b_181feea007d Content-Type: text/plain;

+ +
charset=UTF-8
+
+ +

Content-Transfer-Encoding: quoted-printable

+ +

Ol=C3=A1, Usu=C3=A1rio Teste.

+ +

Para definir sua senha e acessar o sistema, acesse o link abaixo:

+ +

example.com/definir_senha/N8Td_35T41JGmu14wF8jAUBF0aotcnMQwwQww0BR= npE

+ +

—-==_mimepart_6a43fbc7ab93b_181feea007d Content-Type: text/html;

+ +
charset=UTF-8
+
+ +

Content-Transfer-Encoding: quoted-printable

+ +

<!DOCTYPE html> <html>

+ +
<head>
+  <meta http-equiv=3D"Content-Type" content=3D"text/html; charset=3Dutf=
+ +

-8“>

+ +
  <style>
+    /* Email styles need to be inline */
+  </style>
+</head>
+
+<body>
+  <p>Ol=C3=A1, Usu=C3=A1rio Teste.</p>
+ +

<p>Para definir sua senha e acessar o sistema, acesse o link abaixo:</p>

+ +

<p><a href=3D“example.com/definir_senha/N8Td_35T41JGmu14wF8jAUBF0a= otcnMQwwQww0BRnpE”>example.com/definir_senha/N8Td_35T41JGmu14wF8jA= UBF0aotcnMQwwQww0BRnpE</a></p>

+ +
</body>
+ +

</html>

+ +

—-==_mimepart_6a43fbc7ab93b_181feea007d–

+ +

Started GET “/definir_senha/N8Td_35T41JGmu14wF8jAUBF0aotcnMQwwQww0BRnpE” for 127.0.0.1 at 2026-06-30 14:24:23 -0300 Processing by DefinicaoSenhasController#edit as HTML

+ +
Parameters: {"token" => "[FILTERED]"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`definicao_senha_token` = 'N8Td_35T41JGmu14wF8jAUBF0aotcnMQwwQww0BRnpE' LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering definicao_senhas/edit.html.erb within layouts/application
+Rendered definicao_senhas/edit.html.erb within layouts/application (Duration: 0.2ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.6ms | ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started PATCH “/definir_senha/N8Td_35T41JGmu14wF8jAUBF0aotcnMQwwQww0BRnpE” for 127.0.0.1 at 2026-06-30 14:24:23 -0300 Processing by DefinicaoSenhasController#update as HTML

+ +
Parameters: {"senha" => "Senha123", "senha_confirmation" => "Senha321", "commit" => "Definir senha", "token" => "[FILTERED]"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`definicao_senha_token` = 'N8Td_35T41JGmu14wF8jAUBF0aotcnMQwwQww0BRnpE' LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering definicao_senhas/edit.html.erb within layouts/application
+Rendered definicao_senhas/edit.html.erb within layouts/application (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.3ms | GC: 0.0ms)
+ +

Completed 422 Unprocessable Content in 1ms (Views: 0.4ms | ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '348295' LIMIT 1
+Usuario Exists? (0.1ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' LIMIT 1
+Usuario Create (0.2ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:24:23.712277', NULL, NULL, NULL, NULL, 'usuario@teste.com', NULL, '348295', 'Usuário Teste', NULL, NULL, NULL, NULL, '2026-06-30 17:24:23.712277')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.5ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' AND `usuarios`.`id` != 20 LIMIT 1
+Usuario Update (0.4ms)  UPDATE `usuarios` SET `usuarios`.`definicao_senha_sent_at` = '2026-06-30 17:24:23.713285', `usuarios`.`definicao_senha_token` = 'Jr4f95C0Pqx9m-4ieuzev9F1wj1hwjJPVz8uUMU---I', `usuarios`.`updated_at` = '2026-06-30 17:24:23.714016' WHERE `usuarios`.`id` = 20
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Rendering layout layouts/mailer.html.erb
+Rendering usuario_mailer/definicao_senha.html.erb within layouts/mailer
+Rendered usuario_mailer/definicao_senha.html.erb within layouts/mailer (Duration: 0.0ms | GC: 0.0ms)
+Rendered layout layouts/mailer.html.erb (Duration: 0.1ms | GC: 0.0ms)
+Rendering layout layouts/mailer.text.erb
+Rendering usuario_mailer/definicao_senha.text.erb within layouts/mailer
+Rendered usuario_mailer/definicao_senha.text.erb within layouts/mailer (Duration: 0.0ms | GC: 0.0ms)
+Rendered layout layouts/mailer.text.erb (Duration: 0.0ms | GC: 0.0ms)
+ +

UsuarioMailer#definicao_senha: processed outbound mail in 0.8ms Delivered mail 6a43fbc7aec04_181feea0399@MacBook-Air-de-Elvis.local.mail (0.9ms) Date: Tue, 30 Jun 2026 14:24:23 -0300 From: camaar@gmail.com To: usuario@teste.com Message-ID: <6a43fbc7aec04_181feea0399@MacBook-Air-de-Elvis.local.mail> Subject: =?UTF-8?Q?Defini=C3=A7=C3=A3o_de_senha?= MIME-Version: 1.0 Content-Type: multipart/alternative;

+ +
boundary="--==_mimepart_6a43fbc7aea2d_181feea026f";
+charset=UTF-8
+
+ +

Content-Transfer-Encoding: 7bit

+ +

—-==_mimepart_6a43fbc7aea2d_181feea026f Content-Type: text/plain;

+ +
charset=UTF-8
+
+ +

Content-Transfer-Encoding: quoted-printable

+ +

Ol=C3=A1, Usu=C3=A1rio Teste.

+ +

Para definir sua senha e acessar o sistema, acesse o link abaixo:

+ +

example.com/definir_senha/Jr4f95C0Pqx9m-4ieuzev9F1wj1hwjJPVz8uUMU-= –I

+ +

—-==_mimepart_6a43fbc7aea2d_181feea026f Content-Type: text/html;

+ +
charset=UTF-8
+
+ +

Content-Transfer-Encoding: quoted-printable

+ +

<!DOCTYPE html> <html>

+ +
<head>
+  <meta http-equiv=3D"Content-Type" content=3D"text/html; charset=3Dutf=
+ +

-8“>

+ +
  <style>
+    /* Email styles need to be inline */
+  </style>
+</head>
+
+<body>
+  <p>Ol=C3=A1, Usu=C3=A1rio Teste.</p>
+ +

<p>Para definir sua senha e acessar o sistema, acesse o link abaixo:</p>

+ +

<p><a href=3D“example.com/definir_senha/Jr4f95C0Pqx9m-4ieuzev9F1wj= 1hwjJPVz8uUMU—I”>example.com/definir_senha/Jr4f95C0Pqx9m-4ieuzev= 9F1wj1hwjJPVz8uUMU—I</a></p>

+ +
</body>
+ +

</html>

+ +

—-==_mimepart_6a43fbc7aea2d_181feea026f–

+ +

Started GET “/definir_senha/Jr4f95C0Pqx9m-4ieuzev9F1wj1hwjJPVz8uUMU—I” for 127.0.0.1 at 2026-06-30 14:24:23 -0300 Processing by DefinicaoSenhasController#edit as HTML

+ +
Parameters: {"token" => "[FILTERED]"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`definicao_senha_token` = 'Jr4f95C0Pqx9m-4ieuzev9F1wj1hwjJPVz8uUMU---I' LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering definicao_senhas/edit.html.erb within layouts/application
+Rendered definicao_senhas/edit.html.erb within layouts/application (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.4ms | ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started PATCH “/definir_senha/Jr4f95C0Pqx9m-4ieuzev9F1wj1hwjJPVz8uUMU—I” for 127.0.0.1 at 2026-06-30 14:24:23 -0300 Processing by DefinicaoSenhasController#update as HTML

+ +
Parameters: {"senha" => "123", "senha_confirmation" => "123", "commit" => "Definir senha", "token" => "[FILTERED]"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`definicao_senha_token` = 'Jr4f95C0Pqx9m-4ieuzev9F1wj1hwjJPVz8uUMU---I' LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering definicao_senhas/edit.html.erb within layouts/application
+Rendered definicao_senhas/edit.html.erb within layouts/application (Duration: 0.2ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.5ms | GC: 0.0ms)
+ +

Completed 422 Unprocessable Content in 1ms (Views: 0.6ms | ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.4ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Departamento' AND `departamentos`.`codigo` = 'TST' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'TST' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('TST', '2026-06-30 17:24:23.723561', 'Departamento', '2026-06-30 17:24:23.723561')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '123456789' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.3ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:24:23.725303', NULL, NULL, NULL, 18, 'admin@unb.br', NULL, '123456789', 'Admin', NULL, NULL, '123456', 'Administrador', '2026-06-30 17:24:23.725303')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' ORDER BY `usuarios`.`id` ASC LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Campo Exists? (0.4ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Template Create (0.2ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:24:23.728110', 'Template Prova Matemática 2º semestre', '2026-06-30 17:24:23.728110', 21)
+Elemento Create (0.2ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:24:23.728519', 'Questão Fantasma', 1, 11, '2026-06-30 17:24:23.728519')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.728900', 21, NULL, 1, 'Texto', '2026-06-30 17:24:23.728900')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Template Load (0.3ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`nome` = 'Template Prova Matemática 2º semestre' LIMIT 1
+Elemento Load (0.2ms)  SELECT `elementos`.* FROM `elementos` WHERE `elementos`.`template_id` = 11
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Campo Load (0.3ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` = 21
+Campo Destroy (0.3ms)  DELETE FROM `campos` WHERE `campos`.`id` = 65
+Elemento Destroy (0.2ms)  DELETE FROM `elementos` WHERE `elementos`.`id` = 21
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Elemento Create (0.2ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:24:23.732036', 'Questão 1(2 pontos):', 1, 11, '2026-06-30 17:24:23.732036')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Campo Exists? (0.3ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` = 22 LIMIT 1
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.733106', 22, 'a', 1, 'Múltipla Escolha', '2026-06-30 17:24:23.733106')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Campo Exists? (0.3ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 2 AND `campos`.`elemento_id` = 22 LIMIT 1
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.734171', 22, 'b', 2, 'Múltipla Escolha', '2026-06-30 17:24:23.734171')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Campo Exists? (0.3ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 3 AND `campos`.`elemento_id` = 22 LIMIT 1
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.735215', 22, 'c', 3, 'Múltipla Escolha', '2026-06-30 17:24:23.735215')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Campo Exists? (0.3ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 4 AND `campos`.`elemento_id` = 22 LIMIT 1
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.736243', 22, 'd', 4, 'Múltipla Escolha', '2026-06-30 17:24:23.736243')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Elemento Create (0.3ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:24:23.736963', 'Questão 2(2 pontos):', 2, 11, '2026-06-30 17:24:23.736963')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Campo Exists? (0.3ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` = 23 LIMIT 1
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.738458', 23, 'a', 1, 'Múltipla Escolha', '2026-06-30 17:24:23.738458')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Campo Exists? (0.3ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 2 AND `campos`.`elemento_id` = 23 LIMIT 1
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.739517', 23, 'b', 2, 'Múltipla Escolha', '2026-06-30 17:24:23.739517')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Campo Exists? (0.3ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 3 AND `campos`.`elemento_id` = 23 LIMIT 1
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.740538', 23, 'c', 3, 'Múltipla Escolha', '2026-06-30 17:24:23.740538')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Campo Exists? (0.3ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 4 AND `campos`.`elemento_id` = 23 LIMIT 1
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.741572', 23, 'd', 4, 'Múltipla Escolha', '2026-06-30 17:24:23.741572')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Elemento Create (0.3ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:24:23.742176', 'Questão 3(3 pontos):', 3, 11, '2026-06-30 17:24:23.742176')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Campo Exists? (0.3ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` = 24 LIMIT 1
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.743366', 24, 'a', 1, 'Múltipla Escolha', '2026-06-30 17:24:23.743366')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Campo Exists? (0.4ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 2 AND `campos`.`elemento_id` = 24 LIMIT 1
+Campo Create (0.1ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.744438', 24, 'b', 2, 'Múltipla Escolha', '2026-06-30 17:24:23.744438')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Campo Exists? (0.2ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 3 AND `campos`.`elemento_id` = 24 LIMIT 1
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.745211', 24, 'c', 3, 'Múltipla Escolha', '2026-06-30 17:24:23.745211')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Campo Exists? (0.4ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 4 AND `campos`.`elemento_id` = 24 LIMIT 1
+Campo Create (0.3ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.746386', 24, 'd', 4, 'Múltipla Escolha', '2026-06-30 17:24:23.746386')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Elemento Create (0.4ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:24:23.747094', 'Questão 4(3 pontos):', 4, 11, '2026-06-30 17:24:23.747094')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Campo Exists? (0.4ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` = 25 LIMIT 1
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.748360', 25, 'a', 1, 'Múltipla Escolha', '2026-06-30 17:24:23.748360')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Campo Exists? (0.4ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 2 AND `campos`.`elemento_id` = 25 LIMIT 1
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.749471', 25, 'b', 2, 'Múltipla Escolha', '2026-06-30 17:24:23.749471')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Campo Exists? (0.3ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 3 AND `campos`.`elemento_id` = 25 LIMIT 1
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.750540', 25, 'c', 3, 'Múltipla Escolha', '2026-06-30 17:24:23.750540')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Campo Exists? (0.3ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 4 AND `campos`.`elemento_id` = 25 LIMIT 1
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.751581', 25, 'd', 4, 'Múltipla Escolha', '2026-06-30 17:24:23.751581')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Elemento Create (0.3ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:24:23.752175', 'Questão desafio(1 ponto):', 5, 11, '2026-06-30 17:24:23.752175')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Campo Exists? (0.3ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` = 26 LIMIT 1
+Campo Create (0.1ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.753450', 26, 'a', 1, 'Múltipla Escolha', '2026-06-30 17:24:23.753450')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Campo Exists? (0.2ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 2 AND `campos`.`elemento_id` = 26 LIMIT 1
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.754328', 26, 'b', 2, 'Múltipla Escolha', '2026-06-30 17:24:23.754328')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Campo Exists? (0.3ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 3 AND `campos`.`elemento_id` = 26 LIMIT 1
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.755386', 26, 'c', 3, 'Múltipla Escolha', '2026-06-30 17:24:23.755386')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Campo Exists? (0.3ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 4 AND `campos`.`elemento_id` = 26 LIMIT 1
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.756445', 26, 'd', 4, 'Múltipla Escolha', '2026-06-30 17:24:23.756445')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' ORDER BY `usuarios`.`id` ASC LIMIT 1
+ +

Started GET “/admin/21/templates” for 127.0.0.1 at 2026-06-30 14:24:23 -0300 Processing by TemplatesController#index as HTML

+ +
Parameters: {"admin_id" => "21"}
+Rendering layout layouts/gerenciamento.html.erb
+Rendering templates/index.html.erb within layouts/gerenciamento
+Template Exists? (0.2ms)  SELECT 1 AS one FROM `templates` WHERE `templates`.`usuario_id` = 21 LIMIT 1
+Template Load (0.2ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`usuario_id` = 21
+Elemento Load (0.2ms)  SELECT `elementos`.* FROM `elementos` WHERE `elementos`.`template_id` = 11
+Campo Load (0.3ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` IN (22, 23, 24, 25, 26)
+Rendered templates/_grid.html.erb (Duration: 2.1ms | GC: 0.0ms)
+Rendered templates/index.html.erb within layouts/gerenciamento (Duration: 2.1ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 2.3ms | GC: 0.0ms)
+ +

Completed 200 OK in 3ms (Views: 1.6ms | ActiveRecord: 0.9ms (4 queries, 0 cached) | GC: 0.0ms) Started GET “/admin/21/templates/11/edit” for 127.0.0.1 at 2026-06-30 14:24:23 -0300 Processing by TemplatesController#edit as HTML

+ +
Parameters: {"admin_id" => "21", "id" => "11"}
+Template Load (0.3ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`usuario_id` = 21 AND `templates`.`id` = 11 LIMIT 1
+Elemento Exists? (0.2ms)  SELECT 1 AS one FROM `elementos` WHERE `elementos`.`template_id` = 11 LIMIT 1
+Rendering layout layouts/gerenciamento.html.erb
+Rendering templates/edit.html.erb within layouts/gerenciamento
+Template Exists? (0.2ms)  SELECT 1 AS one FROM `templates` WHERE `templates`.`usuario_id` = 21 LIMIT 1
+Template Load (0.2ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`usuario_id` = 21
+Rendered templates/_grid.html.erb (Duration: 0.9ms | GC: 0.0ms)
+Elemento Load (0.2ms)  SELECT `elementos`.* FROM `elementos` WHERE `elementos`.`template_id` = 11
+Campo Load (0.2ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` = 22
+Campo Load (0.2ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` = 23
+Campo Load (0.2ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` = 24
+Campo Load (0.2ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` = 25
+Campo Load (0.1ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` = 26
+Rendered templates/_form.html.erb (Duration: 5.9ms | GC: 0.0ms)
+Rendered templates/edit.html.erb within layouts/gerenciamento (Duration: 7.0ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 7.2ms | GC: 0.0ms)
+ +

Completed 200 OK in 9ms (Views: 5.8ms | ActiveRecord: 2.1ms (10 queries, 0 cached) | GC: 0.0ms) Started PATCH “/admin/21/templates/11” for 127.0.0.1 at 2026-06-30 14:24:23 -0300 Processing by TemplatesController#update as HTML

+ +
Parameters: {"template" => {"nome" => "Template Matemática Atualizado", "elementos_attributes" => {"0" => {"ordem" => "1", "_destroy" => "false", "enunciado" => "Questão 1(2 pontos):", "campos_attributes" => {"0" => {"tipo_elemento" => "Múltipla Escolha", "ordem" => "1", "_destroy" => "false", "enunciado" => "a", "id" => "66"}, "1" => {"tipo_elemento" => "Múltipla Escolha", "ordem" => "2", "_destroy" => "false", "enunciado" => "b", "id" => "67"}, "2" => {"tipo_elemento" => "Múltipla Escolha", "ordem" => "3", "_destroy" => "false", "enunciado" => "c", "id" => "68"}, "3" => {"tipo_elemento" => "Múltipla Escolha", "ordem" => "4", "_destroy" => "false", "enunciado" => "d", "id" => "69"}}, "id" => "22"}, "1" => {"ordem" => "2", "_destroy" => "false", "enunciado" => "Questão 2(2 pontos):", "campos_attributes" => {"0" => {"tipo_elemento" => "Múltipla Escolha", "ordem" => "1", "_destroy" => "false", "enunciado" => "a", "id" => "70"}, "1" => {"tipo_elemento" => "Múltipla Escolha", "ordem" => "2", "_destroy" => "false", "enunciado" => "b", "id" => "71"}, "2" => {"tipo_elemento" => "Múltipla Escolha", "ordem" => "3", "_destroy" => "false", "enunciado" => "c", "id" => "72"}, "3" => {"tipo_elemento" => "Múltipla Escolha", "ordem" => "4", "_destroy" => "false", "enunciado" => "d", "id" => "73"}}, "id" => "23"}, "2" => {"ordem" => "3", "_destroy" => "false", "enunciado" => "Questão 3(3 pontos):", "campos_attributes" => {"0" => {"tipo_elemento" => "Múltipla Escolha", "ordem" => "1", "_destroy" => "false", "enunciado" => "a", "id" => "74"}, "1" => {"tipo_elemento" => "Múltipla Escolha", "ordem" => "2", "_destroy" => "false", "enunciado" => "b", "id" => "75"}, "2" => {"tipo_elemento" => "Múltipla Escolha", "ordem" => "3", "_destroy" => "false", "enunciado" => "c", "id" => "76"}, "3" => {"tipo_elemento" => "Múltipla Escolha", "ordem" => "4", "_destroy" => "false", "enunciado" => "d", "id" => "77"}}, "id" => "24"}, "3" => {"ordem" => "4", "_destroy" => "false", "enunciado" => "Questão 4(3 pontos):", "campos_attributes" => {"0" => {"tipo_elemento" => "Múltipla Escolha", "ordem" => "1", "_destroy" => "false", "enunciado" => "a", "id" => "78"}, "1" => {"tipo_elemento" => "Múltipla Escolha", "ordem" => "2", "_destroy" => "false", "enunciado" => "b", "id" => "79"}, "2" => {"tipo_elemento" => "Múltipla Escolha", "ordem" => "3", "_destroy" => "false", "enunciado" => "c", "id" => "80"}, "3" => {"tipo_elemento" => "Múltipla Escolha", "ordem" => "4", "_destroy" => "false", "enunciado" => "d", "id" => "81"}}, "id" => "25"}, "4" => {"ordem" => "5", "_destroy" => "1", "enunciado" => "Questão desafio(1 ponto):", "campos_attributes" => {"0" => {"tipo_elemento" => "Múltipla Escolha", "ordem" => "1", "_destroy" => "false", "enunciado" => "a", "id" => "82"}, "1" => {"tipo_elemento" => "Múltipla Escolha", "ordem" => "2", "_destroy" => "false", "enunciado" => "b", "id" => "83"}, "2" => {"tipo_elemento" => "Múltipla Escolha", "ordem" => "3", "_destroy" => "false", "enunciado" => "c", "id" => "84"}, "3" => {"tipo_elemento" => "Múltipla Escolha", "ordem" => "4", "_destroy" => "false", "enunciado" => "d", "id" => "85"}}, "id" => "26"}}}, "commit" => "Salvar", "admin_id" => "21", "id" => "11"}
+Template Load (0.3ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`usuario_id` = 21 AND `templates`.`id` = 11 LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Elemento Load (0.5ms)  SELECT `elementos`.* FROM `elementos` WHERE `elementos`.`template_id` = 11 AND `elementos`.`id` IN (22, 23, 24, 25, 26)
+Campo Load (0.3ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` = 22 AND `campos`.`id` IN (66, 67, 68, 69)
+Campo Load (0.2ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` = 23 AND `campos`.`id` IN (70, 71, 72, 73)
+Campo Load (0.2ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` = 24 AND `campos`.`id` IN (74, 75, 76, 77)
+Campo Load (0.2ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` = 25 AND `campos`.`id` IN (78, 79, 80, 81)
+Campo Load (0.2ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` = 26 AND `campos`.`id` IN (82, 83, 84, 85)
+Elemento Load (0.3ms)  SELECT `elementos`.* FROM `elementos` WHERE `elementos`.`template_id` = 11
+Campo Load (0.2ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` = 22
+Campo Load (0.2ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` = 23
+Campo Load (0.2ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` = 24
+Campo Load (0.2ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` = 25
+Template Update (0.3ms)  UPDATE `templates` SET `templates`.`nome` = 'Template Matemática Atualizado', `templates`.`updated_at` = '2026-06-30 17:24:23.796808' WHERE `templates`.`id` = 11
+Campo Load (0.2ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` = 26
+Campo Destroy (0.2ms)  DELETE FROM `campos` WHERE `campos`.`id` = 82
+Campo Destroy (0.2ms)  DELETE FROM `campos` WHERE `campos`.`id` = 83
+Campo Destroy (0.2ms)  DELETE FROM `campos` WHERE `campos`.`id` = 84
+Campo Destroy (0.2ms)  DELETE FROM `campos` WHERE `campos`.`id` = 85
+Elemento Destroy (0.2ms)  DELETE FROM `elementos` WHERE `elementos`.`id` = 26
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/admin/21/templates Completed 302 Found in 13ms (ActiveRecord: 5.0ms (19 queries, 0 cached) | GC: 0.3ms) Started GET “/admin/21/templates” for 127.0.0.1 at 2026-06-30 14:24:23 -0300 Processing by TemplatesController#index as HTML

+ +
Parameters: {"admin_id" => "21"}
+Rendering layout layouts/gerenciamento.html.erb
+Rendering templates/index.html.erb within layouts/gerenciamento
+Template Exists? (0.2ms)  SELECT 1 AS one FROM `templates` WHERE `templates`.`usuario_id` = 21 LIMIT 1
+Template Load (0.2ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`usuario_id` = 21
+Elemento Load (0.2ms)  SELECT `elementos`.* FROM `elementos` WHERE `elementos`.`template_id` = 11
+Campo Load (0.3ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` IN (22, 23, 24, 25)
+Rendered templates/_grid.html.erb (Duration: 2.2ms | GC: 0.0ms)
+Rendered templates/index.html.erb within layouts/gerenciamento (Duration: 2.3ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 2.6ms | GC: 0.1ms)
+ +

Completed 200 OK in 3ms (Views: 1.8ms | ActiveRecord: 0.9ms (4 queries, 0 cached) | GC: 0.1ms)

+ +
Template Load (0.2ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`nome` = 'Template Matemática Atualizado' LIMIT 1
+Elemento Count (0.2ms)  SELECT COUNT(*) FROM `elementos` WHERE `elementos`.`template_id` = 11
+TRANSACTION (1.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.4ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Departamento' AND `departamentos`.`codigo` = 'TST' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'TST' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('TST', '2026-06-30 17:24:23.810040', 'Departamento', '2026-06-30 17:24:23.810040')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '123456789' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.3ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:24:23.811913', NULL, NULL, NULL, 19, 'admin@unb.br', NULL, '123456789', 'Admin', NULL, NULL, '123456', 'Administrador', '2026-06-30 17:24:23.811913')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Administrador Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' ORDER BY `usuarios`.`id` ASC LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Campo Exists? (0.3ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Template Create (0.2ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:24:23.814804', 'Template Prova Matemática 2º semestre', '2026-06-30 17:24:23.814804', 22)
+Elemento Create (0.2ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:24:23.815234', 'Questão Fantasma', 1, 12, '2026-06-30 17:24:23.815234')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.815615', 27, NULL, 1, 'Texto', '2026-06-30 17:24:23.815615')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' ORDER BY `usuarios`.`id` ASC LIMIT 1
+ +

Started GET “/admin/22/templates” for 127.0.0.1 at 2026-06-30 14:24:23 -0300 Processing by TemplatesController#index as HTML

+ +
Parameters: {"admin_id" => "22"}
+Rendering layout layouts/gerenciamento.html.erb
+Rendering templates/index.html.erb within layouts/gerenciamento
+Template Exists? (0.2ms)  SELECT 1 AS one FROM `templates` WHERE `templates`.`usuario_id` = 22 LIMIT 1
+Template Load (0.2ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`usuario_id` = 22
+Elemento Load (0.2ms)  SELECT `elementos`.* FROM `elementos` WHERE `elementos`.`template_id` = 12
+Campo Load (0.2ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` = 27
+Rendered templates/_grid.html.erb (Duration: 1.5ms | GC: 0.0ms)
+Rendered templates/index.html.erb within layouts/gerenciamento (Duration: 1.6ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 1.8ms | GC: 0.0ms)
+ +

Completed 200 OK in 2ms (Views: 1.1ms | ActiveRecord: 0.8ms (4 queries, 0 cached) | GC: 0.1ms) Started GET “/admin/22/templates/12/edit” for 127.0.0.1 at 2026-06-30 14:24:23 -0300 Processing by TemplatesController#edit as HTML

+ +
Parameters: {"admin_id" => "22", "id" => "12"}
+Template Load (0.2ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`usuario_id` = 22 AND `templates`.`id` = 12 LIMIT 1
+Elemento Exists? (0.2ms)  SELECT 1 AS one FROM `elementos` WHERE `elementos`.`template_id` = 12 LIMIT 1
+Rendering layout layouts/gerenciamento.html.erb
+Rendering templates/edit.html.erb within layouts/gerenciamento
+Template Exists? (0.2ms)  SELECT 1 AS one FROM `templates` WHERE `templates`.`usuario_id` = 22 LIMIT 1
+Template Load (0.2ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`usuario_id` = 22
+Rendered templates/_grid.html.erb (Duration: 0.9ms | GC: 0.0ms)
+Elemento Load (0.2ms)  SELECT `elementos`.* FROM `elementos` WHERE `elementos`.`template_id` = 12
+Campo Load (0.2ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` = 27
+Rendered templates/_form.html.erb (Duration: 1.2ms | GC: 0.0ms)
+Rendered templates/edit.html.erb within layouts/gerenciamento (Duration: 2.1ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 2.3ms | GC: 0.0ms)
+ +

Completed 200 OK in 4ms (Views: 1.7ms | ActiveRecord: 1.1ms (6 queries, 0 cached) | GC: 0.0ms) Started PATCH “/admin/22/templates/12” for 127.0.0.1 at 2026-06-30 14:24:23 -0300 Processing by TemplatesController#update as HTML

+ +
Parameters: {"template" => {"nome" => "", "elementos_attributes" => {"0" => {"ordem" => "1", "_destroy" => "false", "enunciado" => "Questão Fantasma", "campos_attributes" => {"0" => {"tipo_elemento" => "Texto", "ordem" => "1", "_destroy" => "false", "enunciado" => "", "id" => "86"}}, "id" => "27"}}}, "commit" => "Salvar", "admin_id" => "22", "id" => "12"}
+Template Load (0.2ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`usuario_id` = 22 AND `templates`.`id` = 12 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Elemento Load (0.3ms)  SELECT `elementos`.* FROM `elementos` WHERE `elementos`.`template_id` = 12 AND `elementos`.`id` = 27
+Campo Load (0.2ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` = 27 AND `campos`.`id` = 86
+Campo Exists? (0.3ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`id` != 86 AND `campos`.`elemento_id` = 27 LIMIT 1
+Elemento Load (0.2ms)  SELECT `elementos`.* FROM `elementos` WHERE `elementos`.`template_id` = 12
+TRANSACTION (0.1ms)  ROLLBACK TO SAVEPOINT active_record_1
+Rendering layout layouts/gerenciamento.html.erb
+Rendering templates/edit.html.erb within layouts/gerenciamento
+Rendered templates/_grid.html.erb (Duration: 0.2ms | GC: 0.0ms)
+Campo Load (0.2ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` = 27
+Rendered templates/_form.html.erb (Duration: 0.8ms | GC: 0.0ms)
+Rendered templates/edit.html.erb within layouts/gerenciamento (Duration: 1.1ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 1.3ms | GC: 0.0ms)
+ +

Completed 422 Unprocessable Content in 6ms (Views: 1.2ms | ActiveRecord: 3.3ms (6 queries, 0 cached) | GC: 0.1ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Departamento' AND `departamentos`.`codigo` = 'TST' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.2ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'TST' LIMIT 1
+Departamento Create (0.1ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('TST', '2026-06-30 17:24:23.837461', 'Departamento', '2026-06-30 17:24:23.837461')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Administrador Load (0.1ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '123456789' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.3ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:24:23.838977', NULL, NULL, NULL, 20, 'admin@unb.br', NULL, '123456789', 'Admin', NULL, NULL, '123456', 'Administrador', '2026-06-30 17:24:23.838977')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' ORDER BY `usuarios`.`id` ASC LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Campo Exists? (0.3ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Template Create (0.2ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:24:23.841663', 'Template Prova Matemática 2º semestre', '2026-06-30 17:24:23.841663', 23)
+Elemento Create (0.2ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:24:23.842059', 'Questão Fantasma', 1, 13, '2026-06-30 17:24:23.842059')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:23.842452', 28, NULL, 1, 'Texto', '2026-06-30 17:24:23.842452')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' ORDER BY `usuarios`.`id` ASC LIMIT 1
+ +

Started GET “/admin/23/templates” for 127.0.0.1 at 2026-06-30 14:24:23 -0300 Processing by TemplatesController#index as HTML

+ +
Parameters: {"admin_id" => "23"}
+Rendering layout layouts/gerenciamento.html.erb
+Rendering templates/index.html.erb within layouts/gerenciamento
+Template Exists? (0.2ms)  SELECT 1 AS one FROM `templates` WHERE `templates`.`usuario_id` = 23 LIMIT 1
+Template Load (0.2ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`usuario_id` = 23
+Elemento Load (0.2ms)  SELECT `elementos`.* FROM `elementos` WHERE `elementos`.`template_id` = 13
+Campo Load (0.2ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` = 28
+Rendered templates/_grid.html.erb (Duration: 1.6ms | GC: 0.0ms)
+Rendered templates/index.html.erb within layouts/gerenciamento (Duration: 1.7ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 1.9ms | GC: 0.0ms)
+ +

Completed 200 OK in 2ms (Views: 1.2ms | ActiveRecord: 0.8ms (4 queries, 0 cached) | GC: 0.0ms) Started DELETE “/admin/23/templates/13” for 127.0.0.1 at 2026-06-30 14:24:23 -0300 Processing by TemplatesController#destroy as HTML

+ +
Parameters: {"admin_id" => "23", "id" => "13"}
+Template Load (0.2ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`usuario_id` = 23 AND `templates`.`id` = 13 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Elemento Load (0.4ms)  SELECT `elementos`.* FROM `elementos` WHERE `elementos`.`template_id` = 13
+Campo Load (0.2ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` = 28
+Campo Destroy (0.3ms)  DELETE FROM `campos` WHERE `campos`.`id` = 87
+Elemento Destroy (0.2ms)  DELETE FROM `elementos` WHERE `elementos`.`id` = 28
+Template Destroy (0.2ms)  DELETE FROM `templates` WHERE `templates`.`id` = 13
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/admin/23/templates Completed 303 See Other in 3ms (ActiveRecord: 1.7ms (6 queries, 0 cached) | GC: 0.0ms) Started GET “/admin/23/templates” for 127.0.0.1 at 2026-06-30 14:24:23 -0300 Processing by TemplatesController#index as HTML

+ +
Parameters: {"admin_id" => "23"}
+Rendering layout layouts/gerenciamento.html.erb
+Rendering templates/index.html.erb within layouts/gerenciamento
+Template Exists? (0.2ms)  SELECT 1 AS one FROM `templates` WHERE `templates`.`usuario_id` = 23 LIMIT 1
+Rendered templates/_grid.html.erb (Duration: 0.4ms | GC: 0.0ms)
+Rendered templates/index.html.erb within layouts/gerenciamento (Duration: 0.4ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 0.6ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.6ms | ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.1ms)

+ +
TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.5ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'DEP01' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('DEP01', '2026-06-30 17:24:23.855550', 'Departamento de Computação', '2026-06-30 17:24:23.855550')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'ADM001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@teste.com' LIMIT 1
+Administrador Create (0.3ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:24:23.856905', NULL, NULL, NULL, 21, 'admin@teste.com', NULL, 'ADM001', 'Admin Teste', NULL, NULL, NULL, 'Administrador', '2026-06-30 17:24:23.856905')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin@teste.com' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@teste.com' AND `usuarios`.`id` != 24 LIMIT 1
+Administrador Update (0.7ms)  UPDATE `usuarios` SET `usuarios`.`senha_hash` = '$2a$12$xtfDSGlro9QXVklCddunted0eZ9lRYzQQCzoNHGMFLncnd3VseHNe', `usuarios`.`updated_at` = '2026-06-30 17:24:24.046695' WHERE `usuarios`.`id` = 24
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/” for 127.0.0.1 at 2026-06-30 14:24:24 -0300 Processing by SessionsController#new as HTML

+ +
Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering sessions/new.html.erb within layouts/application
+Rendered sessions/new.html.erb within layouts/application (Duration: 0.2ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.6ms | ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started POST “/login” for 127.0.0.1 at 2026-06-30 14:24:24 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin@teste.com", "senha" => "senha123", "commit" => "Entrar"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin@teste.com' LIMIT 1
+ +

Redirected to www.example.com/admin/24/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/admin/24/avaliacoes” for 127.0.0.1 at 2026-06-30 14:24:24 -0300 Processing by AdminController#avaliacoes as HTML

+ +
Parameters: {"admin_id" => "24"}
+Usuario Load (0.5ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 24 LIMIT 1
+Administrador Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 24 LIMIT 1
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/avaliacoes.html.erb within layouts/gerenciamento
+Formulario Load (0.3ms)  SELECT `formularios`.* FROM `formularios` INNER JOIN `turmas` ON `turmas`.`id` = `formularios`.`turma_id`
+Rendered admin/avaliacoes.html.erb within layouts/gerenciamento (Duration: 0.8ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 1.0ms | GC: 0.0ms)
+ +

Completed 200 OK in 3ms (Views: 0.8ms | ActiveRecord: 1.2ms (3 queries, 0 cached) | GC: 0.0ms) Started GET “/admin/24/resultados” for 127.0.0.1 at 2026-06-30 14:24:24 -0300 Processing by AdminController#resultados as HTML

+ +
Parameters: {"admin_id" => "24"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 24 LIMIT 1
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 24 LIMIT 1
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/resultados.html.erb within layouts/gerenciamento
+Formulario Eager Load (0.5ms)  SELECT `formularios`.`id` AS t0_r0, `formularios`.`created_at` AS t0_r1, `formularios`.`data_fim` AS t0_r2, `formularios`.`data_inicio` AS t0_r3, `formularios`.`nome` AS t0_r4, `formularios`.`titulo` AS t0_r5, `formularios`.`turma_id` AS t0_r6, `formularios`.`updated_at` AS t0_r7, `turmas`.`id` AS t1_r0, `turmas`.`created_at` AS t1_r1, `turmas`.`disciplina_id` AS t1_r2, `turmas`.`horario` AS t1_r3, `turmas`.`numero_da_turma` AS t1_r4, `turmas`.`semestre` AS t1_r5, `turmas`.`updated_at` AS t1_r6, `disciplinas`.`id` AS t2_r0, `disciplinas`.`codigo` AS t2_r1, `disciplinas`.`created_at` AS t2_r2, `disciplinas`.`departamento_id` AS t2_r3, `disciplinas`.`nome` AS t2_r4, `disciplinas`.`updated_at` AS t2_r5 FROM `formularios` INNER JOIN `turmas` ON `turmas`.`id` = `formularios`.`turma_id` INNER JOIN `disciplinas` ON `disciplinas`.`id` = `turmas`.`disciplina_id` WHERE `disciplinas`.`departamento_id` = 21
+Rendered admin/resultados.html.erb within layouts/gerenciamento (Duration: 1.0ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 1.1ms | GC: 0.0ms)
+ +

Completed 200 OK in 2ms (Views: 0.7ms | ActiveRecord: 1.0ms (3 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.5ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'ED001' LIMIT 1
+Disciplina Create (0.3ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('ED001', '2026-06-30 17:24:24.255674', 21, 'Estruturas de Dados', '2026-06-30 17:24:24.255674')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'Turma A' AND `turmas`.`semestre` = '2024.1' AND `turmas`.`disciplina_id` = 19 LIMIT 1
+Turma Create (0.3ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:24:24.257079', 19, 'SEG 08:00-10:00', 'Turma A', '2024.1', '2026-06-30 17:24:24.257079')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:24:24.257737', NULL, NULL, NULL, NULL, 19, '2026-06-30 17:24:24.257737')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.3ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:24:24.258530', 'Como você avalia o professor?', 5, 1, NULL, '2026-06-30 17:24:24.258530')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.3ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:24:24.259234', 'Como você avalia a disciplina?', 5, 2, NULL, '2026-06-30 17:24:24.259234')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Curso Exists? (0.2ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`codigo` = 'CC01' LIMIT 1
+Curso Create (0.1ms)  INSERT INTO `cursos` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CC01', '2026-06-30 17:24:24.260364', 21, 'Ciência da Computação', '2026-06-30 17:24:24.260364')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'ALU001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'aluno@teste.com' LIMIT 1
+Discente Create (0.3ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:24:24.261575', 2, NULL, NULL, 21, 'aluno@teste.com', NULL, 'ALU001', 'Aluno Teste', NULL, NULL, NULL, 'Discente', '2026-06-30 17:24:24.261575')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaForm Exists? (0.5ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 25 AND `resposta_forms`.`formulario_id` = 5 LIMIT 1
+RespostaForm Create (0.3ms)  INSERT INTO `resposta_forms` (`created_at`, `data_submissao`, `formulario_id`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:24:24.268026', '2026-06-30', 5, '2026-06-30 17:24:24.268026', 25)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Campo Exists? (0.3ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.2ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 2 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Template Create (0.2ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:24:24.269886', 'Template Padrão', '2026-06-30 17:24:24.269886', 24)
+Elemento Create (0.1ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:24:24.270336', 'Avaliação', 1, 14, '2026-06-30 17:24:24.270336')
+Campo Create (0.1ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:24.270781', 29, 'Muito bom', 1, 'Múltipla Escolha', '2026-06-30 17:24:24.270781')
+Campo Create (0.3ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:24.271096', 29, 'Excelente', 2, 'Múltipla Escolha', '2026-06-30 17:24:24.271096')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+CampoForm Load (0.3ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`enunciado` = 'Muito bom' AND `campo_forms`.`elemento_form_id` = 11 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.4ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:24.272308', 11, 'Muito bom', 1, NULL, '2026-06-30 17:24:24.272308')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`enunciado` = 'Excelente' AND `campo_forms`.`elemento_form_id` = 11 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.3ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:24.273444', 11, 'Excelente', 2, NULL, '2026-06-30 17:24:24.273444')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`enunciado` = 'Muito bom' AND `campo_forms`.`elemento_form_id` = 12 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.3ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:24.274509', 12, 'Muito bom', 1, NULL, '2026-06-30 17:24:24.274509')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`enunciado` = 'Excelente' AND `campo_forms`.`elemento_form_id` = 12 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.3ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:24.275568', 12, 'Excelente', 2, NULL, '2026-06-30 17:24:24.275568')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` = 11 AND `campo_forms`.`enunciado` = 'Muito bom' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaElem Create (1.2ms)  INSERT INTO `resposta_elems` (`campo_form_id`, `created_at`, `elemento_form_id`, `resposta_form_id`, `texto_resposta`, `updated_at`) VALUES (32, '2026-06-30 17:24:24.282414', 11, 1, 'Muito bom', '2026-06-30 17:24:24.282414')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+CampoForm Load (0.3ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` = 12 AND `campo_forms`.`enunciado` = 'Excelente' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaElem Create (0.4ms)  INSERT INTO `resposta_elems` (`campo_form_id`, `created_at`, `elemento_form_id`, `resposta_form_id`, `texto_resposta`, `updated_at`) VALUES (35, '2026-06-30 17:24:24.284552', 12, 1, 'Excelente', '2026-06-30 17:24:24.284552')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/admin/24/resultados” for 127.0.0.1 at 2026-06-30 14:24:24 -0300 Processing by AdminController#resultados as HTML

+ +
Parameters: {"admin_id" => "24"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 24 LIMIT 1
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 24 LIMIT 1
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/resultados.html.erb within layouts/gerenciamento
+Formulario Eager Load (0.2ms)  SELECT `formularios`.`id` AS t0_r0, `formularios`.`created_at` AS t0_r1, `formularios`.`data_fim` AS t0_r2, `formularios`.`data_inicio` AS t0_r3, `formularios`.`nome` AS t0_r4, `formularios`.`titulo` AS t0_r5, `formularios`.`turma_id` AS t0_r6, `formularios`.`updated_at` AS t0_r7, `turmas`.`id` AS t1_r0, `turmas`.`created_at` AS t1_r1, `turmas`.`disciplina_id` AS t1_r2, `turmas`.`horario` AS t1_r3, `turmas`.`numero_da_turma` AS t1_r4, `turmas`.`semestre` AS t1_r5, `turmas`.`updated_at` AS t1_r6, `disciplinas`.`id` AS t2_r0, `disciplinas`.`codigo` AS t2_r1, `disciplinas`.`created_at` AS t2_r2, `disciplinas`.`departamento_id` AS t2_r3, `disciplinas`.`nome` AS t2_r4, `disciplinas`.`updated_at` AS t2_r5 FROM `formularios` INNER JOIN `turmas` ON `turmas`.`id` = `formularios`.`turma_id` INNER JOIN `disciplinas` ON `disciplinas`.`id` = `turmas`.`disciplina_id` WHERE `disciplinas`.`departamento_id` = 21
+Docente Load (0.6ms)  SELECT `usuarios`.* FROM `usuarios` INNER JOIN `docentes_turmas` ON `usuarios`.`id` = `docentes_turmas`.`docente_id` WHERE `usuarios`.`type` = 'Docente' AND `docentes_turmas`.`turma_id` = 19 ORDER BY `usuarios`.`id` ASC LIMIT 1
+Rendered admin/resultados.html.erb within layouts/gerenciamento (Duration: 4.8ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 5.0ms | GC: 0.0ms)
+ +

Completed 200 OK in 6ms (Views: 2.7ms | ActiveRecord: 2.9ms (4 queries, 0 cached) | GC: 0.0ms) Started GET “/admin/24/resultados/5/download.csv.csv” for 127.0.0.1 at 2026-06-30 14:24:24 -0300 Processing by AdminController#exportar_csv as CSV

+ +
Parameters: {"admin_id" => "24", "id" => "5"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 24 LIMIT 1
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 24 LIMIT 1
+Formulario Load (0.2ms)  SELECT `formularios`.* FROM `formularios` WHERE `formularios`.`id` = 5 LIMIT 1
+RespostaForm Exists? (0.2ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`formulario_id` = 5 LIMIT 1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`id` = 19 LIMIT 1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`id` = 19 LIMIT 1
+Rendering admin/exportar_csv.csv.erb
+ElementoForm Pluck (0.3ms)  SELECT `elemento_forms`.`enunciado` FROM `elemento_forms` WHERE `elemento_forms`.`formulario_id` = 5 ORDER BY `elemento_forms`.`ordem` ASC
+RespostaForm Load (0.2ms)  SELECT `resposta_forms`.* FROM `resposta_forms` WHERE `resposta_forms`.`formulario_id` = 5
+Usuario Load (0.1ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 25
+RespostaElem Load (0.1ms)  SELECT `resposta_elems`.* FROM `resposta_elems` WHERE `resposta_elems`.`resposta_form_id` = 1
+ElementoForm Load (0.2ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`id` IN (11, 12)
+Rendered admin/exportar_csv.csv.erb (Duration: 2.3ms | GC: 0.0ms)
+ +

Completed 200 OK in 6ms (Views: 2.3ms | ActiveRecord: 2.3ms (11 queries, 0 cached) | GC: 0.0ms)

+ +
ElementoForm Load (0.2ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`formulario_id` = 5 ORDER BY `elemento_forms`.`ordem` ASC
+RespostaElem Load (0.2ms)  SELECT `resposta_elems`.* FROM `resposta_elems` WHERE `resposta_elems`.`resposta_form_id` = 1
+TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.5ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'DEP01' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('DEP01', '2026-06-30 17:24:24.304235', 'Departamento de Computação', '2026-06-30 17:24:24.304235')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'ADM001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@teste.com' LIMIT 1
+Administrador Create (0.2ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:24:24.305384', NULL, NULL, NULL, 22, 'admin@teste.com', NULL, 'ADM001', 'Admin Teste', NULL, NULL, NULL, 'Administrador', '2026-06-30 17:24:24.305384')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Usuario Load (0.1ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin@teste.com' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@teste.com' AND `usuarios`.`id` != 26 LIMIT 1
+Administrador Update (0.7ms)  UPDATE `usuarios` SET `usuarios`.`senha_hash` = '$2a$12$iNJicugQWMAihNbT53vWeuoe3njDCLCgz4.oJwDCs1PlUm.3DS/gO', `usuarios`.`updated_at` = '2026-06-30 17:24:24.495160' WHERE `usuarios`.`id` = 26
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/” for 127.0.0.1 at 2026-06-30 14:24:24 -0300 Processing by SessionsController#new as HTML

+ +
Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering sessions/new.html.erb within layouts/application
+Rendered sessions/new.html.erb within layouts/application (Duration: 0.2ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.6ms | ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started POST “/login” for 127.0.0.1 at 2026-06-30 14:24:24 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin@teste.com", "senha" => "senha123", "commit" => "Entrar"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin@teste.com' LIMIT 1
+ +

Redirected to www.example.com/admin/26/avaliacoes Completed 302 Found in 190ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/admin/26/avaliacoes” for 127.0.0.1 at 2026-06-30 14:24:24 -0300 Processing by AdminController#avaliacoes as HTML

+ +
Parameters: {"admin_id" => "26"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 26 LIMIT 1
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 26 LIMIT 1
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/avaliacoes.html.erb within layouts/gerenciamento
+Formulario Load (0.3ms)  SELECT `formularios`.* FROM `formularios` INNER JOIN `turmas` ON `turmas`.`id` = `formularios`.`turma_id`
+Rendered admin/avaliacoes.html.erb within layouts/gerenciamento (Duration: 0.6ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 0.8ms | GC: 0.0ms)
+ +

Completed 200 OK in 2ms (Views: 0.7ms | ActiveRecord: 1.0ms (3 queries, 0 cached) | GC: 0.0ms) Started GET “/admin/26/resultados” for 127.0.0.1 at 2026-06-30 14:24:24 -0300 Processing by AdminController#resultados as HTML

+ +
Parameters: {"admin_id" => "26"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 26 LIMIT 1
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 26 LIMIT 1
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/resultados.html.erb within layouts/gerenciamento
+Formulario Eager Load (0.4ms)  SELECT `formularios`.`id` AS t0_r0, `formularios`.`created_at` AS t0_r1, `formularios`.`data_fim` AS t0_r2, `formularios`.`data_inicio` AS t0_r3, `formularios`.`nome` AS t0_r4, `formularios`.`titulo` AS t0_r5, `formularios`.`turma_id` AS t0_r6, `formularios`.`updated_at` AS t0_r7, `turmas`.`id` AS t1_r0, `turmas`.`created_at` AS t1_r1, `turmas`.`disciplina_id` AS t1_r2, `turmas`.`horario` AS t1_r3, `turmas`.`numero_da_turma` AS t1_r4, `turmas`.`semestre` AS t1_r5, `turmas`.`updated_at` AS t1_r6, `disciplinas`.`id` AS t2_r0, `disciplinas`.`codigo` AS t2_r1, `disciplinas`.`created_at` AS t2_r2, `disciplinas`.`departamento_id` AS t2_r3, `disciplinas`.`nome` AS t2_r4, `disciplinas`.`updated_at` AS t2_r5 FROM `formularios` INNER JOIN `turmas` ON `turmas`.`id` = `formularios`.`turma_id` INNER JOIN `disciplinas` ON `disciplinas`.`id` = `turmas`.`disciplina_id` WHERE `disciplinas`.`departamento_id` = 22
+Rendered admin/resultados.html.erb within layouts/gerenciamento (Duration: 1.0ms | GC: 0.3ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 1.2ms | GC: 0.3ms)
+ +

Completed 200 OK in 2ms (Views: 0.8ms | ActiveRecord: 0.9ms (3 queries, 0 cached) | GC: 0.3ms)

+ +
TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.4ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'ED001' LIMIT 1
+Disciplina Create (0.3ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('ED001', '2026-06-30 17:24:24.701171', 22, 'Estruturas de Dados', '2026-06-30 17:24:24.701171')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'Turma A' AND `turmas`.`semestre` = '2024.1' AND `turmas`.`disciplina_id` = 20 LIMIT 1
+Turma Create (0.3ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:24:24.702511', 20, 'SEG 08:00-10:00', 'Turma A', '2024.1', '2026-06-30 17:24:24.702511')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:24:24.703222', NULL, NULL, NULL, NULL, 20, '2026-06-30 17:24:24.703222')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:24:24.704072', 'Como você avalia o professor?', 6, 1, NULL, '2026-06-30 17:24:24.704072')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:24:24.704851', 'Como você avalia a disciplina?', 6, 2, NULL, '2026-06-30 17:24:24.704851')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Curso Exists? (0.3ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`codigo` = 'CC01' LIMIT 1
+Curso Create (0.2ms)  INSERT INTO `cursos` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CC01', '2026-06-30 17:24:24.706304', 22, 'Ciência da Computação', '2026-06-30 17:24:24.706304')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'ALU001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'aluno@teste.com' LIMIT 1
+Discente Create (0.3ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:24:24.707658', 3, NULL, NULL, 22, 'aluno@teste.com', NULL, 'ALU001', 'Aluno Teste', NULL, NULL, NULL, 'Discente', '2026-06-30 17:24:24.707658')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaForm Exists? (0.4ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 27 AND `resposta_forms`.`formulario_id` = 6 LIMIT 1
+RespostaForm Create (0.2ms)  INSERT INTO `resposta_forms` (`created_at`, `data_submissao`, `formulario_id`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:24:24.708957', '2026-06-30', 6, '2026-06-30 17:24:24.708957', 27)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Campo Exists? (0.3ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.2ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 2 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Template Create (0.2ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:24:24.710777', 'Template Padrão', '2026-06-30 17:24:24.710777', 26)
+Elemento Create (0.2ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:24:24.711164', 'Avaliação', 1, 15, '2026-06-30 17:24:24.711164')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:24.711547', 30, 'Muito bom', 1, 'Múltipla Escolha', '2026-06-30 17:24:24.711547')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:24.711930', 30, 'Excelente', 2, 'Múltipla Escolha', '2026-06-30 17:24:24.711930')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`enunciado` = 'Muito bom' AND `campo_forms`.`elemento_form_id` = 13 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.4ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:24.712924', 13, 'Muito bom', 1, NULL, '2026-06-30 17:24:24.712924')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`enunciado` = 'Excelente' AND `campo_forms`.`elemento_form_id` = 13 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.3ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:24.714245', 13, 'Excelente', 2, NULL, '2026-06-30 17:24:24.714245')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`enunciado` = 'Muito bom' AND `campo_forms`.`elemento_form_id` = 14 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.3ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:24.715306', 14, 'Muito bom', 1, NULL, '2026-06-30 17:24:24.715306')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`enunciado` = 'Excelente' AND `campo_forms`.`elemento_form_id` = 14 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.3ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:24.716366', 14, 'Excelente', 2, NULL, '2026-06-30 17:24:24.716366')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` = 13 AND `campo_forms`.`enunciado` = 'Muito bom' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaElem Create (0.4ms)  INSERT INTO `resposta_elems` (`campo_form_id`, `created_at`, `elemento_form_id`, `resposta_form_id`, `texto_resposta`, `updated_at`) VALUES (36, '2026-06-30 17:24:24.717556', 13, 2, 'Muito bom', '2026-06-30 17:24:24.717556')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` = 14 AND `campo_forms`.`enunciado` = 'Excelente' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaElem Create (0.4ms)  INSERT INTO `resposta_elems` (`campo_form_id`, `created_at`, `elemento_form_id`, `resposta_form_id`, `texto_resposta`, `updated_at`) VALUES (39, '2026-06-30 17:24:24.718743', 14, 2, 'Excelente', '2026-06-30 17:24:24.718743')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/admin/26/resultados” for 127.0.0.1 at 2026-06-30 14:24:24 -0300 Processing by AdminController#resultados as HTML

+ +
Parameters: {"admin_id" => "26"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 26 LIMIT 1
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 26 LIMIT 1
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/resultados.html.erb within layouts/gerenciamento
+Formulario Eager Load (0.4ms)  SELECT `formularios`.`id` AS t0_r0, `formularios`.`created_at` AS t0_r1, `formularios`.`data_fim` AS t0_r2, `formularios`.`data_inicio` AS t0_r3, `formularios`.`nome` AS t0_r4, `formularios`.`titulo` AS t0_r5, `formularios`.`turma_id` AS t0_r6, `formularios`.`updated_at` AS t0_r7, `turmas`.`id` AS t1_r0, `turmas`.`created_at` AS t1_r1, `turmas`.`disciplina_id` AS t1_r2, `turmas`.`horario` AS t1_r3, `turmas`.`numero_da_turma` AS t1_r4, `turmas`.`semestre` AS t1_r5, `turmas`.`updated_at` AS t1_r6, `disciplinas`.`id` AS t2_r0, `disciplinas`.`codigo` AS t2_r1, `disciplinas`.`created_at` AS t2_r2, `disciplinas`.`departamento_id` AS t2_r3, `disciplinas`.`nome` AS t2_r4, `disciplinas`.`updated_at` AS t2_r5 FROM `formularios` INNER JOIN `turmas` ON `turmas`.`id` = `formularios`.`turma_id` INNER JOIN `disciplinas` ON `disciplinas`.`id` = `turmas`.`disciplina_id` WHERE `disciplinas`.`departamento_id` = 22
+Docente Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` INNER JOIN `docentes_turmas` ON `usuarios`.`id` = `docentes_turmas`.`docente_id` WHERE `usuarios`.`type` = 'Docente' AND `docentes_turmas`.`turma_id` = 20 ORDER BY `usuarios`.`id` ASC LIMIT 1
+Rendered admin/resultados.html.erb within layouts/gerenciamento (Duration: 1.8ms | GC: 0.2ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 1.9ms | GC: 0.2ms)
+ +

Completed 200 OK in 3ms (Views: 1.3ms | ActiveRecord: 1.2ms (4 queries, 0 cached) | GC: 0.2ms)

+ +
Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'Turma A' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:24:24.723460', NULL, NULL, NULL, NULL, 20, '2026-06-30 17:24:24.723460')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:24:24.724253', 'Pergunta sem respostas', 7, 1, NULL, '2026-06-30 17:24:24.724253')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+RespostaForm Count (0.2ms)  SELECT COUNT(*) FROM `resposta_forms` WHERE `resposta_forms`.`formulario_id` = 7
+ +

Started GET “/admin/26/resultados” for 127.0.0.1 at 2026-06-30 14:24:24 -0300 Processing by AdminController#resultados as HTML

+ +
Parameters: {"admin_id" => "26"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 26 LIMIT 1
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 26 LIMIT 1
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/resultados.html.erb within layouts/gerenciamento
+Formulario Eager Load (0.4ms)  SELECT `formularios`.`id` AS t0_r0, `formularios`.`created_at` AS t0_r1, `formularios`.`data_fim` AS t0_r2, `formularios`.`data_inicio` AS t0_r3, `formularios`.`nome` AS t0_r4, `formularios`.`titulo` AS t0_r5, `formularios`.`turma_id` AS t0_r6, `formularios`.`updated_at` AS t0_r7, `turmas`.`id` AS t1_r0, `turmas`.`created_at` AS t1_r1, `turmas`.`disciplina_id` AS t1_r2, `turmas`.`horario` AS t1_r3, `turmas`.`numero_da_turma` AS t1_r4, `turmas`.`semestre` AS t1_r5, `turmas`.`updated_at` AS t1_r6, `disciplinas`.`id` AS t2_r0, `disciplinas`.`codigo` AS t2_r1, `disciplinas`.`created_at` AS t2_r2, `disciplinas`.`departamento_id` AS t2_r3, `disciplinas`.`nome` AS t2_r4, `disciplinas`.`updated_at` AS t2_r5 FROM `formularios` INNER JOIN `turmas` ON `turmas`.`id` = `formularios`.`turma_id` INNER JOIN `disciplinas` ON `disciplinas`.`id` = `turmas`.`disciplina_id` WHERE `disciplinas`.`departamento_id` = 22
+Docente Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` INNER JOIN `docentes_turmas` ON `usuarios`.`id` = `docentes_turmas`.`docente_id` WHERE `usuarios`.`type` = 'Docente' AND `docentes_turmas`.`turma_id` = 20 ORDER BY `usuarios`.`id` ASC LIMIT 1
+CACHE Docente Load (0.0ms)  SELECT `usuarios`.* FROM `usuarios` INNER JOIN `docentes_turmas` ON `usuarios`.`id` = `docentes_turmas`.`docente_id` WHERE `usuarios`.`type` = 'Docente' AND `docentes_turmas`.`turma_id` = 20 ORDER BY `usuarios`.`id` ASC LIMIT 1
+Rendered admin/resultados.html.erb within layouts/gerenciamento (Duration: 1.5ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 1.8ms | GC: 0.1ms)
+ +

Completed 200 OK in 3ms (Views: 1.2ms | ActiveRecord: 1.1ms (5 queries, 1 cached) | GC: 0.1ms) Started GET “/admin/26/resultados/7/download.csv.csv” for 127.0.0.1 at 2026-06-30 14:24:24 -0300 Processing by AdminController#exportar_csv as CSV

+ +
Parameters: {"admin_id" => "26", "id" => "7"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 26 LIMIT 1
+Administrador Load (0.1ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 26 LIMIT 1
+Formulario Load (0.1ms)  SELECT `formularios`.* FROM `formularios` WHERE `formularios`.`id` = 7 LIMIT 1
+RespostaForm Exists? (0.1ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`formulario_id` = 7 LIMIT 1
+ +

Redirected to www.example.com/admin/26/resultados Completed 302 Found in 1ms (ActiveRecord: 0.5ms (4 queries, 0 cached) | GC: 0.0ms) Started GET “/admin/26/resultados” for 127.0.0.1 at 2026-06-30 14:24:24 -0300 Processing by AdminController#resultados as HTML

+ +
Parameters: {"admin_id" => "26"}
+Usuario Load (0.1ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 26 LIMIT 1
+Administrador Load (0.1ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 26 LIMIT 1
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/resultados.html.erb within layouts/gerenciamento
+Formulario Eager Load (0.3ms)  SELECT `formularios`.`id` AS t0_r0, `formularios`.`created_at` AS t0_r1, `formularios`.`data_fim` AS t0_r2, `formularios`.`data_inicio` AS t0_r3, `formularios`.`nome` AS t0_r4, `formularios`.`titulo` AS t0_r5, `formularios`.`turma_id` AS t0_r6, `formularios`.`updated_at` AS t0_r7, `turmas`.`id` AS t1_r0, `turmas`.`created_at` AS t1_r1, `turmas`.`disciplina_id` AS t1_r2, `turmas`.`horario` AS t1_r3, `turmas`.`numero_da_turma` AS t1_r4, `turmas`.`semestre` AS t1_r5, `turmas`.`updated_at` AS t1_r6, `disciplinas`.`id` AS t2_r0, `disciplinas`.`codigo` AS t2_r1, `disciplinas`.`created_at` AS t2_r2, `disciplinas`.`departamento_id` AS t2_r3, `disciplinas`.`nome` AS t2_r4, `disciplinas`.`updated_at` AS t2_r5 FROM `formularios` INNER JOIN `turmas` ON `turmas`.`id` = `formularios`.`turma_id` INNER JOIN `disciplinas` ON `disciplinas`.`id` = `turmas`.`disciplina_id` WHERE `disciplinas`.`departamento_id` = 22
+Docente Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` INNER JOIN `docentes_turmas` ON `usuarios`.`id` = `docentes_turmas`.`docente_id` WHERE `usuarios`.`type` = 'Docente' AND `docentes_turmas`.`turma_id` = 20 ORDER BY `usuarios`.`id` ASC LIMIT 1
+CACHE Docente Load (0.0ms)  SELECT `usuarios`.* FROM `usuarios` INNER JOIN `docentes_turmas` ON `usuarios`.`id` = `docentes_turmas`.`docente_id` WHERE `usuarios`.`type` = 'Docente' AND `docentes_turmas`.`turma_id` = 20 ORDER BY `usuarios`.`id` ASC LIMIT 1
+Rendered admin/resultados.html.erb within layouts/gerenciamento (Duration: 1.7ms | GC: 0.1ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 1.9ms | GC: 0.1ms)
+ +

Completed 200 OK in 3ms (Views: 1.3ms | ActiveRecord: 0.8ms (5 queries, 1 cached) | GC: 0.1ms)

+ +
TRANSACTION (1.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.4ms)  SELECT `departamentos`.* FROM `departamentos` ORDER BY `departamentos`.`id` ASC LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.1ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:24:24.740581', 'Ciência da Computação', '2026-06-30 17:24:24.740581')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Administrador Load (0.1ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' ORDER BY `usuarios`.`id` ASC LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'admin' LIMIT 1
+Usuario Exists? (0.1ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@teste.com' LIMIT 1
+Administrador Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:24:24.931242', NULL, NULL, NULL, 23, 'admin@teste.com', NULL, 'admin', 'Admin Teste', NULL, NULL, '$2a$12$Lf44OYkCTTm8nHckj9JNpeMGXfJb1s3JgGJGuud27jCkuI4x351kW', 'Administrador', '2026-06-30 17:24:24.931242')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/admin/28/gerenciamento” for 127.0.0.1 at 2026-06-30 14:24:24 -0300 Processing by AdminController#gerenciamento as HTML

+ +
Parameters: {"admin_id" => "28"}
+Administrador Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 28 LIMIT 1
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/gerenciamento.html.erb within layouts/gerenciamento
+Rendered admin/gerenciamento.html.erb within layouts/gerenciamento (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 0.3ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.5ms | ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms) Started POST “/admin/28/sincronizar_sigaa” for 127.0.0.1 at 2026-06-30 14:24:24 -0300 Processing by AdminController#sincronizar_sigaa as HTML

+ +
Parameters: {"acao" => "importar", "arquivo_classes" => #<ActionDispatch::Http::UploadedFile:0x000000013033c300 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-98814-nroh15.json>, @content_type="application/json", @original_filename="classes.json", @headers="content-disposition: form-data; name=\"arquivo_classes\"; filename=\"classes.json\"\r\ncontent-type: application/json\r\ncontent-length: 611\r\n">, "arquivo_membros" => #<ActionDispatch::Http::UploadedFile:0x000000013033c2b0 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-98814-okrcq0.json>, @content_type="application/json", @original_filename="classes.json", @headers="content-disposition: form-data; name=\"arquivo_membros\"; filename=\"classes.json\"\r\ncontent-type: application/json\r\ncontent-length: 611\r\n">, "admin_id" => "28"}
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 28 LIMIT 1
+ +

Redirected to www.example.com/admin/28/gerenciamento Completed 302 Found in 1ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/admin/28/gerenciamento” for 127.0.0.1 at 2026-06-30 14:24:24 -0300 Processing by AdminController#gerenciamento as HTML

+ +
Parameters: {"admin_id" => "28"}
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 28 LIMIT 1
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/gerenciamento.html.erb within layouts/gerenciamento
+Rendered admin/gerenciamento.html.erb within layouts/gerenciamento (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 0.3ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.5ms | ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.1ms)

+ +
TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` ORDER BY `departamentos`.`id` ASC LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.1ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:24:24.944108', 'Ciência da Computação', '2026-06-30 17:24:24.944108')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' ORDER BY `usuarios`.`id` ASC LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'admin' LIMIT 1
+Usuario Exists? (0.1ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@teste.com' LIMIT 1
+Administrador Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:24:25.135057', NULL, NULL, NULL, 24, 'admin@teste.com', NULL, 'admin', 'Admin Teste', NULL, NULL, '$2a$12$Trx6p7.e10GSMGPDloM2zOj6Id7/k1151IvsK4f1UuPjf0xwdFXRS', 'Administrador', '2026-06-30 17:24:25.135057')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/admin/29/gerenciamento” for 127.0.0.1 at 2026-06-30 14:24:25 -0300 Processing by AdminController#gerenciamento as HTML

+ +
Parameters: {"admin_id" => "29"}
+Administrador Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 29 LIMIT 1
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/gerenciamento.html.erb within layouts/gerenciamento
+Rendered admin/gerenciamento.html.erb within layouts/gerenciamento (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 0.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.5ms | ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms) Started POST “/admin/29/sincronizar_sigaa” for 127.0.0.1 at 2026-06-30 14:24:25 -0300 Processing by AdminController#sincronizar_sigaa as HTML

+ +
Parameters: {"acao" => "importar", "arquivo_classes" => #<ActionDispatch::Http::UploadedFile:0x0000000130073d08 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-98814-ddj0y6.json>, @content_type="application/json", @original_filename="classes.json", @headers="content-disposition: form-data; name=\"arquivo_classes\"; filename=\"classes.json\"\r\ncontent-type: application/json\r\ncontent-length: 611\r\n">, "arquivo_membros" => #<ActionDispatch::Http::UploadedFile:0x0000000130073cb8 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-98814-qpc10n.json>, @content_type="application/json", @original_filename="classes.json", @headers="content-disposition: form-data; name=\"arquivo_membros\"; filename=\"classes.json\"\r\ncontent-type: application/json\r\ncontent-length: 611\r\n">, "admin_id" => "29"}
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 29 LIMIT 1
+ +

Redirected to www.example.com/admin/29/gerenciamento Completed 302 Found in 1ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.1ms) Started GET “/admin/29/gerenciamento” for 127.0.0.1 at 2026-06-30 14:24:25 -0300 Processing by AdminController#gerenciamento as HTML

+ +
Parameters: {"admin_id" => "29"}
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 29 LIMIT 1
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/gerenciamento.html.erb within layouts/gerenciamento
+Rendered admin/gerenciamento.html.erb within layouts/gerenciamento (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 0.3ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.4ms | ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.4ms)  SELECT `departamentos`.* FROM `departamentos` ORDER BY `departamentos`.`id` ASC LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:24:25.147157', 'Ciência da Computação', '2026-06-30 17:24:25.147157')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' ORDER BY `usuarios`.`id` ASC LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'admin' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@teste.com' LIMIT 1
+Administrador Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:24:25.338082', NULL, NULL, NULL, 25, 'admin@teste.com', NULL, 'admin', 'Admin Teste', NULL, NULL, '$2a$12$QpR3cGEgEfi.8Gl6GruEGOHe5Zj/m/FGQLTtjdiAChPGfu8l.UkVS', 'Administrador', '2026-06-30 17:24:25.338082')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/admin/30/gerenciamento” for 127.0.0.1 at 2026-06-30 14:24:25 -0300 Processing by AdminController#gerenciamento as HTML

+ +
Parameters: {"admin_id" => "30"}
+Administrador Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 30 LIMIT 1
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/gerenciamento.html.erb within layouts/gerenciamento
+Rendered admin/gerenciamento.html.erb within layouts/gerenciamento (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 0.3ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.5ms | ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.1ms) Started POST “/admin/30/sincronizar_sigaa” for 127.0.0.1 at 2026-06-30 14:24:25 -0300 Processing by AdminController#sincronizar_sigaa as HTML

+ +
Parameters: {"acao" => "importar", "arquivo_classes" => #<ActionDispatch::Http::UploadedFile:0x000000012f9ebd78 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-98814-q0p7wl.json>, @content_type="application/json", @original_filename="classes.json", @headers="content-disposition: form-data; name=\"arquivo_classes\"; filename=\"classes.json\"\r\ncontent-type: application/json\r\ncontent-length: 611\r\n">, "arquivo_membros" => #<ActionDispatch::Http::UploadedFile:0x000000012f9ebd28 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-98814-qc1099.json>, @content_type="application/json", @original_filename="classes.json", @headers="content-disposition: form-data; name=\"arquivo_membros\"; filename=\"classes.json\"\r\ncontent-type: application/json\r\ncontent-length: 611\r\n">, "admin_id" => "30"}
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 30 LIMIT 1
+ +

Redirected to www.example.com/admin/30/gerenciamento Completed 302 Found in 1ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.1ms) Started GET “/admin/30/gerenciamento” for 127.0.0.1 at 2026-06-30 14:24:25 -0300 Processing by AdminController#gerenciamento as HTML

+ +
Parameters: {"admin_id" => "30"}
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 30 LIMIT 1
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/gerenciamento.html.erb within layouts/gerenciamento
+Rendered admin/gerenciamento.html.erb within layouts/gerenciamento (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 0.3ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.4ms | ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.4ms)  SELECT `departamentos`.* FROM `departamentos` ORDER BY `departamentos`.`id` ASC LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:24:25.349741', 'Ciência da Computação', '2026-06-30 17:24:25.349741')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' ORDER BY `usuarios`.`id` ASC LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'admin' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@teste.com' LIMIT 1
+Administrador Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:24:25.539622', NULL, NULL, NULL, 26, 'admin@teste.com', NULL, 'admin', 'Admin Teste', NULL, NULL, '$2a$12$wDKUhxmsmeFemSSQPrPevObSUqrQBXYLhyBBFlYmg0Htu9vf7gGYy', 'Administrador', '2026-06-30 17:24:25.539622')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/admin/31/gerenciamento” for 127.0.0.1 at 2026-06-30 14:24:25 -0300 Processing by AdminController#gerenciamento as HTML

+ +
Parameters: {"admin_id" => "31"}
+Administrador Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 31 LIMIT 1
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/gerenciamento.html.erb within layouts/gerenciamento
+Rendered admin/gerenciamento.html.erb within layouts/gerenciamento (Duration: 0.2ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 0.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.5ms | ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms) Started POST “/admin/31/sincronizar_sigaa” for 127.0.0.1 at 2026-06-30 14:24:25 -0300 Processing by AdminController#sincronizar_sigaa as HTML

+ +
Parameters: {"acao" => "importar", "arquivo_classes" => #<ActionDispatch::Http::UploadedFile:0x0000000125a29ab0 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-98814-7lf683.json>, @content_type="application/json", @original_filename="classes.json", @headers="content-disposition: form-data; name=\"arquivo_classes\"; filename=\"classes.json\"\r\ncontent-type: application/json\r\ncontent-length: 611\r\n">, "arquivo_membros" => #<ActionDispatch::Http::UploadedFile:0x0000000125a29a60 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-98814-sye3by.json>, @content_type="application/json", @original_filename="classes.json", @headers="content-disposition: form-data; name=\"arquivo_membros\"; filename=\"classes.json\"\r\ncontent-type: application/json\r\ncontent-length: 611\r\n">, "admin_id" => "31"}
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 31 LIMIT 1
+ +

Redirected to www.example.com/admin/31/gerenciamento Completed 302 Found in 1ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/admin/31/gerenciamento” for 127.0.0.1 at 2026-06-30 14:24:25 -0300 Processing by AdminController#gerenciamento as HTML

+ +
Parameters: {"admin_id" => "31"}
+Administrador Load (0.1ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 31 LIMIT 1
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/gerenciamento.html.erb within layouts/gerenciamento
+Rendered admin/gerenciamento.html.erb within layouts/gerenciamento (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 0.3ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.4ms | ActiveRecord: 0.1ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.3ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '334712' LIMIT 1
+Usuario Exists? (0.1ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' LIMIT 1
+Usuario Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:24:25.740111', NULL, NULL, NULL, NULL, 'usuario@teste.com', NULL, '334712', 'Usuário Teste', NULL, NULL, '$2a$12$XfuxiRLDVjvCUDU5npU3Qe71owx7m47syMx4xyX5a0ko6vihf5M1S', NULL, '2026-06-30 17:24:25.740111')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/” for 127.0.0.1 at 2026-06-30 14:24:25 -0300 Processing by SessionsController#new as HTML

+ +
Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering sessions/new.html.erb within layouts/application
+Rendered sessions/new.html.erb within layouts/application (Duration: 0.2ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.6ms | ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started POST “/login” for 127.0.0.1 at 2026-06-30 14:24:25 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "usuario@teste.com", "senha" => "Senha123", "commit" => "Entrar"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' LIMIT 1
+ +

Redirected to www.example.com/usuarios/32/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/usuarios/32/avaliacoes” for 127.0.0.1 at 2026-06-30 14:24:25 -0300 Processing by UsuariosController#avaliacoes as HTML

+ +
Parameters: {"usuario_id" => "32"}
+Usuario Load (0.5ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 32 LIMIT 1
+CACHE Usuario Load (0.0ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 32 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering usuarios/avaliacoes.html.erb within layouts/application
+Formulario Load (0.3ms)  SELECT `formularios`.* FROM `formularios` INNER JOIN `turmas` ON `turmas`.`id` = `formularios`.`turma_id` WHERE `formularios`.`turma_id` IN (SELECT `turmas`.`id` FROM `turmas` WHERE (1=0))
+Rendered usuarios/avaliacoes.html.erb within layouts/application (Duration: 0.7ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.0ms | GC: 0.0ms)
+ +

Completed 200 OK in 2ms (Views: 0.8ms | ActiveRecord: 0.8ms (3 queries, 1 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`matricula` = '261067676' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '261067676' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = '261067676@teste.com' LIMIT 1
+Usuario Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:24:26.129205', NULL, NULL, NULL, NULL, '261067676@teste.com', NULL, '261067676', 'Usuário Teste', NULL, NULL, '$2a$12$1A.8afuCj.bEzuZbqT2/nuWFt1nzMbJmtIbdDSHYTOgmhi6duvz2a', NULL, '2026-06-30 17:24:26.129205')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/” for 127.0.0.1 at 2026-06-30 14:24:26 -0300 Processing by SessionsController#new as HTML

+ +
Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering sessions/new.html.erb within layouts/application
+Rendered sessions/new.html.erb within layouts/application (Duration: 0.2ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.6ms | ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started POST “/login” for 127.0.0.1 at 2026-06-30 14:24:26 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "261067676", "senha" => "Senha123", "commit" => "Entrar"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = '261067676' LIMIT 1
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`matricula` = '261067676' LIMIT 1
+ +

Redirected to www.example.com/usuarios/33/avaliacoes Completed 302 Found in 190ms (ActiveRecord: 0.5ms (2 queries, 0 cached) | GC: 0.0ms) Started GET “/usuarios/33/avaliacoes” for 127.0.0.1 at 2026-06-30 14:24:26 -0300 Processing by UsuariosController#avaliacoes as HTML

+ +
Parameters: {"usuario_id" => "33"}
+Usuario Load (0.5ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 33 LIMIT 1
+CACHE Usuario Load (0.0ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 33 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering usuarios/avaliacoes.html.erb within layouts/application
+Formulario Load (0.3ms)  SELECT `formularios`.* FROM `formularios` INNER JOIN `turmas` ON `turmas`.`id` = `formularios`.`turma_id` WHERE `formularios`.`turma_id` IN (SELECT `turmas`.`id` FROM `turmas` WHERE (1=0))
+Rendered usuarios/avaliacoes.html.erb within layouts/application (Duration: 0.7ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.0ms | GC: 0.0ms)
+ +

Completed 200 OK in 2ms (Views: 0.8ms | ActiveRecord: 0.8ms (3 queries, 1 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '341084' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' LIMIT 1
+Usuario Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:24:26.518380', NULL, NULL, NULL, NULL, 'usuario@teste.com', NULL, '341084', 'Usuário Teste', NULL, NULL, '$2a$12$Jyxh5DZdjFwk50dgPoK76uSySG2EiulPP6FogP6lOHQB/yjwXmCXC', NULL, '2026-06-30 17:24:26.518380')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/” for 127.0.0.1 at 2026-06-30 14:24:26 -0300 Processing by SessionsController#new as HTML

+ +
Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering sessions/new.html.erb within layouts/application
+Rendered sessions/new.html.erb within layouts/application (Duration: 0.2ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.6ms | ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started POST “/login” for 127.0.0.1 at 2026-06-30 14:24:26 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "usuario@teste.com", "senha" => "Senha123.", "commit" => "Entrar"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' LIMIT 1
+ +

Redirected to www.example.com/ Completed 302 Found in 189ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/” for 127.0.0.1 at 2026-06-30 14:24:26 -0300 Processing by SessionsController#new as HTML

+ +
Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering sessions/new.html.erb within layouts/application
+Rendered sessions/new.html.erb within layouts/application (Duration: 0.2ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.6ms | ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.8ms)  ROLLBACK
+ +

Started GET “/” for 127.0.0.1 at 2026-06-30 14:24:26 -0300 Processing by SessionsController#new as HTML

+ +
TRANSACTION (0.2ms)  BEGIN
+Usuario Load (0.5ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering sessions/new.html.erb within layouts/application
+Rendered sessions/new.html.erb within layouts/application (Duration: 0.2ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.9ms | GC: 0.3ms)
+ +

Completed 200 OK in 2ms (Views: 1.1ms | ActiveRecord: 0.6ms (1 query, 0 cached) | GC: 0.3ms) Started POST “/login” for 127.0.0.1 at 2026-06-30 14:24:26 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "", "senha" => "Senha123", "commit" => "Entrar"}
+ +

Redirected to www.example.com/ Completed 302 Found in 0ms (ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 0.0ms) Started GET “/” for 127.0.0.1 at 2026-06-30 14:24:26 -0300 Processing by SessionsController#new as HTML

+ +
Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering sessions/new.html.erb within layouts/application
+Rendered sessions/new.html.erb within layouts/application (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.3ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.4ms | ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.1ms)  ROLLBACK
+ +

Started GET “/” for 127.0.0.1 at 2026-06-30 14:24:26 -0300 Processing by SessionsController#new as HTML

+ +
TRANSACTION (0.2ms)  BEGIN
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering sessions/new.html.erb within layouts/application
+Rendered sessions/new.html.erb within layouts/application (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.3ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.4ms | ActiveRecord: 0.6ms (1 query, 0 cached) | GC: 0.0ms) Started POST “/login” for 127.0.0.1 at 2026-06-30 14:24:26 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "usuario@teste.com", "senha" => "", "commit" => "Entrar"}
+ +

Redirected to www.example.com/ Completed 302 Found in 0ms (ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 0.0ms) Started GET “/” for 127.0.0.1 at 2026-06-30 14:24:26 -0300 Processing by SessionsController#new as HTML

+ +
Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering sessions/new.html.erb within layouts/application
+Rendered sessions/new.html.erb within layouts/application (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.3ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.6ms | ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.1ms)

+ +
TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '754960' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' LIMIT 1
+Usuario Create (0.3ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:24:26.735497', NULL, NULL, NULL, NULL, 'usuario@teste.com', NULL, '754960', 'Usuário Teste', NULL, NULL, NULL, NULL, '2026-06-30 17:24:26.735497')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' AND `usuarios`.`id` != 35 LIMIT 1
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/” for 127.0.0.1 at 2026-06-30 14:24:26 -0300 Processing by SessionsController#new as HTML

+ +
Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering sessions/new.html.erb within layouts/application
+Rendered sessions/new.html.erb within layouts/application (Duration: 0.2ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.5ms | ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.1ms) Started POST “/login” for 127.0.0.1 at 2026-06-30 14:24:26 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "usuario@teste.com", "senha" => "Senha123", "commit" => "Entrar"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' LIMIT 1
+ +

Redirected to www.example.com/ Completed 302 Found in 0ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/” for 127.0.0.1 at 2026-06-30 14:24:26 -0300 Processing by SessionsController#new as HTML

+ +
Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering sessions/new.html.erb within layouts/application
+Rendered sessions/new.html.erb within layouts/application (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.3ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.4ms | ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (2.2ms)  BEGIN
+Usuario Delete All (2.8ms)  DELETE FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com'
+ +

Started GET “/” for 127.0.0.1 at 2026-06-30 14:24:26 -0300 Processing by SessionsController#new as HTML

+ +
Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering sessions/new.html.erb within layouts/application
+Rendered sessions/new.html.erb within layouts/application (Duration: 0.2ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.6ms | ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started POST “/login” for 127.0.0.1 at 2026-06-30 14:24:26 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "usuario@teste.com", "senha" => "Senha123", "commit" => "Entrar"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' LIMIT 1
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`matricula` = 'usuario@teste.com' LIMIT 1
+ +

Redirected to www.example.com/ Completed 302 Found in 1ms (ActiveRecord: 0.6ms (2 queries, 0 cached) | GC: 0.0ms) Started GET “/” for 127.0.0.1 at 2026-06-30 14:24:26 -0300 Processing by SessionsController#new as HTML

+ +
Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering sessions/new.html.erb within layouts/application
+Rendered sessions/new.html.erb within layouts/application (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.5ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.6ms | ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '134466' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' LIMIT 1
+Usuario Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:24:26.945884', NULL, NULL, NULL, NULL, 'usuario@teste.com', NULL, '134466', 'Usuário Teste', NULL, NULL, '$2a$12$tEJUq79uUxMvzjTTv0Loie2ElPPMyTh9kAAxND79Z1ansXxlGhvsO', NULL, '2026-06-30 17:24:26.945884')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/” for 127.0.0.1 at 2026-06-30 14:24:26 -0300 Processing by SessionsController#new as HTML

+ +
Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering sessions/new.html.erb within layouts/application
+Rendered sessions/new.html.erb within layouts/application (Duration: 0.2ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.5ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.6ms | ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/redefinir_senha” for 127.0.0.1 at 2026-06-30 14:24:26 -0300 Processing by RedefinicaoSenhasController#new as HTML

+ +
Rendering layout layouts/application.html.erb
+Rendering redefinicao_senhas/new.html.erb within layouts/application
+Rendered redefinicao_senhas/new.html.erb within layouts/application (Duration: 0.2ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.5ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.8ms | ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 0.1ms) Started POST “/redefinir_senha” for 127.0.0.1 at 2026-06-30 14:24:26 -0300 Processing by RedefinicaoSenhasController#create as HTML

+ +
Parameters: {"email" => "[FILTERED]", "commit" => "Solicitar redefinição"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' AND `usuarios`.`id` != 36 LIMIT 1
+Usuario Update (0.4ms)  UPDATE `usuarios` SET `usuarios`.`redefinicao_senha_sent_at` = '2026-06-30 17:24:26.955257', `usuarios`.`redefinicao_senha_token` = 'MAZjBLGvQl7-9jcQt3GdjLwjJfiLd8p22tj33zl4FyI', `usuarios`.`updated_at` = '2026-06-30 17:24:26.955954' WHERE `usuarios`.`id` = 36
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Rendering layout layouts/mailer.html.erb
+Rendering usuario_mailer/redefinicao_senha.html.erb within layouts/mailer
+Rendered usuario_mailer/redefinicao_senha.html.erb within layouts/mailer (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/mailer.html.erb (Duration: 0.2ms | GC: 0.0ms)
+Rendering layout layouts/mailer.text.erb
+Rendering usuario_mailer/redefinicao_senha.text.erb within layouts/mailer
+Rendered usuario_mailer/redefinicao_senha.text.erb within layouts/mailer (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/mailer.text.erb (Duration: 0.1ms | GC: 0.0ms)
+ +

UsuarioMailer#redefinicao_senha: processed outbound mail in 1.5ms Delivered mail 6a43fbcaea03a_181feea0524@MacBook-Air-de-Elvis.local.mail (1.2ms) Date: Tue, 30 Jun 2026 14:24:26 -0300 From: camaar@gmail.com To: usuario@teste.com Message-ID: <6a43fbcaea03a_181feea0524@MacBook-Air-de-Elvis.local.mail> Subject: =?UTF-8?Q?Redefini=C3=A7=C3=A3o_de_senha?= MIME-Version: 1.0 Content-Type: multipart/alternative;

+ +
boundary="--==_mimepart_6a43fbcae9de8_181feea0487";
+charset=UTF-8
+
+ +

Content-Transfer-Encoding: 7bit

+ +

—-==_mimepart_6a43fbcae9de8_181feea0487 Content-Type: text/plain;

+ +
charset=UTF-8
+
+ +

Content-Transfer-Encoding: quoted-printable

+ +

Ol=C3=A1, Usu=C3=A1rio Teste.

+ +

Voc=C3=AA solicitou a redefini=C3=A7=C3=A3o da sua senha. Acesse o link a= baixo:

+ +

example.com/redefinir_senha/MAZjBLGvQl7-9jcQt3GdjLwjJfiLd8p22tj33z= l4FyI

+ +

—-==_mimepart_6a43fbcae9de8_181feea0487 Content-Type: text/html;

+ +
charset=UTF-8
+
+ +

Content-Transfer-Encoding: quoted-printable

+ +

<!DOCTYPE html> <html>

+ +
<head>
+  <meta http-equiv=3D"Content-Type" content=3D"text/html; charset=3Dutf=
+ +

-8“>

+ +
  <style>
+    /* Email styles need to be inline */
+  </style>
+</head>
+
+<body>
+  <p>Ol=C3=A1, Usu=C3=A1rio Teste.</p>
+ +

<p>Voc=C3=AA solicitou a redefini=C3=A7=C3=A3o da sua senha. Acesse o lin= k abaixo:</p>

+ +

<p><a href=3D“example.com/redefinir_senha/MAZjBLGvQl7-9jcQt3GdjLwj= JfiLd8p22tj33zl4FyI”>example.com/redefinir_senha/MAZjBLGvQl7-9jcQt= 3GdjLwjJfiLd8p22tj33zl4FyI</a></p>

+ +
</body>
+ +

</html>

+ +

—-==_mimepart_6a43fbcae9de8_181feea0487–

+ +

Redirected to www.example.com/ Completed 302 Found in 5ms (ActiveRecord: 1.2ms (3 queries, 0 cached) | GC: 0.2ms) Started GET “/” for 127.0.0.1 at 2026-06-30 14:24:26 -0300 Processing by SessionsController#new as HTML

+ +
Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering sessions/new.html.erb within layouts/application
+Rendered sessions/new.html.erb within layouts/application (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.5ms | ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.5ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' AND `usuarios`.`id` != 36 LIMIT 1
+Usuario Update (0.5ms)  UPDATE `usuarios` SET `usuarios`.`redefinicao_senha_sent_at` = '2026-06-30 17:24:26.962393', `usuarios`.`redefinicao_senha_token` = 'vwiq4nNrDUcZODLvYcUOi05aQos8ROLLog73tMNDroo', `usuarios`.`updated_at` = '2026-06-30 17:24:26.963226' WHERE `usuarios`.`id` = 36
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Rendering layout layouts/mailer.html.erb
+Rendering usuario_mailer/redefinicao_senha.html.erb within layouts/mailer
+Rendered usuario_mailer/redefinicao_senha.html.erb within layouts/mailer (Duration: 0.0ms | GC: 0.0ms)
+Rendered layout layouts/mailer.html.erb (Duration: 0.1ms | GC: 0.0ms)
+Rendering layout layouts/mailer.text.erb
+Rendering usuario_mailer/redefinicao_senha.text.erb within layouts/mailer
+Rendered usuario_mailer/redefinicao_senha.text.erb within layouts/mailer (Duration: 0.0ms | GC: 0.0ms)
+Rendered layout layouts/mailer.text.erb (Duration: 0.0ms | GC: 0.0ms)
+ +

UsuarioMailer#redefinicao_senha: processed outbound mail in 0.8ms Delivered mail 6a43fbcaebab4_181feea07e6@MacBook-Air-de-Elvis.local.mail (1.0ms) Date: Tue, 30 Jun 2026 14:24:26 -0300 From: camaar@gmail.com To: usuario@teste.com Message-ID: <6a43fbcaebab4_181feea07e6@MacBook-Air-de-Elvis.local.mail> Subject: =?UTF-8?Q?Redefini=C3=A7=C3=A3o_de_senha?= MIME-Version: 1.0 Content-Type: multipart/alternative;

+ +
boundary="--==_mimepart_6a43fbcaeb87a_181feea066d";
+charset=UTF-8
+
+ +

Content-Transfer-Encoding: 7bit

+ +

—-==_mimepart_6a43fbcaeb87a_181feea066d Content-Type: text/plain;

+ +
charset=UTF-8
+
+ +

Content-Transfer-Encoding: quoted-printable

+ +

Ol=C3=A1, Usu=C3=A1rio Teste.

+ +

Voc=C3=AA solicitou a redefini=C3=A7=C3=A3o da sua senha. Acesse o link a= baixo:

+ +

example.com/redefinir_senha/vwiq4nNrDUcZODLvYcUOi05aQos8ROLLog73tM= NDroo

+ +

—-==_mimepart_6a43fbcaeb87a_181feea066d Content-Type: text/html;

+ +
charset=UTF-8
+
+ +

Content-Transfer-Encoding: quoted-printable

+ +

<!DOCTYPE html> <html>

+ +
<head>
+  <meta http-equiv=3D"Content-Type" content=3D"text/html; charset=3Dutf=
+ +

-8“>

+ +
  <style>
+    /* Email styles need to be inline */
+  </style>
+</head>
+
+<body>
+  <p>Ol=C3=A1, Usu=C3=A1rio Teste.</p>
+ +

<p>Voc=C3=AA solicitou a redefini=C3=A7=C3=A3o da sua senha. Acesse o lin= k abaixo:</p>

+ +

<p><a href=3D“example.com/redefinir_senha/vwiq4nNrDUcZODLvYcUOi05a= Qos8ROLLog73tMNDroo”>example.com/redefinir_senha/vwiq4nNrDUcZODLvY= cUOi05aQos8ROLLog73tMNDroo</a></p>

+ +
</body>
+ +

</html>

+ +

—-==_mimepart_6a43fbcaeb87a_181feea066d–

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' LIMIT 1
+TRANSACTION (2.3ms)  SAVEPOINT active_record_1
+Usuario Exists? (3.1ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '363928' LIMIT 1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' LIMIT 1
+Usuario Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:24:27.175181', NULL, NULL, NULL, NULL, 'usuario@teste.com', NULL, '363928', 'Usuário Teste', NULL, NULL, '$2a$12$pJi1dZf2Q74fduInfRIoq.9slc5y2mh1inWqmLrGQb2TVVn.lo2/e', NULL, '2026-06-30 17:24:27.175181')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/” for 127.0.0.1 at 2026-06-30 14:24:27 -0300 Processing by SessionsController#new as HTML

+ +
Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering sessions/new.html.erb within layouts/application
+Rendered sessions/new.html.erb within layouts/application (Duration: 0.2ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.6ms | ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' AND `usuarios`.`id` != 37 LIMIT 1
+Usuario Update (0.4ms)  UPDATE `usuarios` SET `usuarios`.`redefinicao_senha_sent_at` = '2026-06-30 17:24:27.179192', `usuarios`.`redefinicao_senha_token` = 'hHEfsf_DsFFtj51gBeIA3rcJcz6rd9nIhqWPZtVWZL4', `usuarios`.`updated_at` = '2026-06-30 17:24:27.179959' WHERE `usuarios`.`id` = 37
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Rendering layout layouts/mailer.html.erb
+Rendering usuario_mailer/redefinicao_senha.html.erb within layouts/mailer
+Rendered usuario_mailer/redefinicao_senha.html.erb within layouts/mailer (Duration: 0.0ms | GC: 0.0ms)
+Rendered layout layouts/mailer.html.erb (Duration: 0.1ms | GC: 0.0ms)
+Rendering layout layouts/mailer.text.erb
+Rendering usuario_mailer/redefinicao_senha.text.erb within layouts/mailer
+Rendered usuario_mailer/redefinicao_senha.text.erb within layouts/mailer (Duration: 0.0ms | GC: 0.0ms)
+Rendered layout layouts/mailer.text.erb (Duration: 0.0ms | GC: 0.0ms)
+ +

UsuarioMailer#redefinicao_senha: processed outbound mail in 0.8ms Delivered mail 6a43fbcb2c629_181feea0949@MacBook-Air-de-Elvis.local.mail (0.9ms) Date: Tue, 30 Jun 2026 14:24:27 -0300 From: camaar@gmail.com To: usuario@teste.com Message-ID: <6a43fbcb2c629_181feea0949@MacBook-Air-de-Elvis.local.mail> Subject: =?UTF-8?Q?Redefini=C3=A7=C3=A3o_de_senha?= MIME-Version: 1.0 Content-Type: multipart/alternative;

+ +
boundary="--==_mimepart_6a43fbcb2c450_181feea08b4";
+charset=UTF-8
+
+ +

Content-Transfer-Encoding: 7bit

+ +

—-==_mimepart_6a43fbcb2c450_181feea08b4 Content-Type: text/plain;

+ +
charset=UTF-8
+
+ +

Content-Transfer-Encoding: quoted-printable

+ +

Ol=C3=A1, Usu=C3=A1rio Teste.

+ +

Voc=C3=AA solicitou a redefini=C3=A7=C3=A3o da sua senha. Acesse o link a= baixo:

+ +

example.com/redefinir_senha/hHEfsf_DsFFtj51gBeIA3rcJcz6rd9nIhqWPZt= VWZL4

+ +

—-==_mimepart_6a43fbcb2c450_181feea08b4 Content-Type: text/html;

+ +
charset=UTF-8
+
+ +

Content-Transfer-Encoding: quoted-printable

+ +

<!DOCTYPE html> <html>

+ +
<head>
+  <meta http-equiv=3D"Content-Type" content=3D"text/html; charset=3Dutf=
+ +

-8“>

+ +
  <style>
+    /* Email styles need to be inline */
+  </style>
+</head>
+
+<body>
+  <p>Ol=C3=A1, Usu=C3=A1rio Teste.</p>
+ +

<p>Voc=C3=AA solicitou a redefini=C3=A7=C3=A3o da sua senha. Acesse o lin= k abaixo:</p>

+ +

<p><a href=3D“example.com/redefinir_senha/hHEfsf_DsFFtj51gBeIA3rcJ= cz6rd9nIhqWPZtVWZL4”>example.com/redefinir_senha/hHEfsf_DsFFtj51gB= eIA3rcJcz6rd9nIhqWPZtVWZL4</a></p>

+ +
</body>
+ +

</html>

+ +

—-==_mimepart_6a43fbcb2c450_181feea08b4–

+ +

Started GET “/redefinir_senha/hHEfsf_DsFFtj51gBeIA3rcJcz6rd9nIhqWPZtVWZL4” for 127.0.0.1 at 2026-06-30 14:24:27 -0300 Processing by RedefinicaoSenhasController#edit as HTML

+ +
Parameters: {"token" => "[FILTERED]"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`redefinicao_senha_token` = 'hHEfsf_DsFFtj51gBeIA3rcJcz6rd9nIhqWPZtVWZL4' LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering redefinicao_senhas/edit.html.erb within layouts/application
+Rendered redefinicao_senhas/edit.html.erb within layouts/application (Duration: 0.3ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.5ms | GC: 0.0ms)
+ +

Completed 200 OK in 2ms (Views: 0.6ms | ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started PATCH “/redefinir_senha/hHEfsf_DsFFtj51gBeIA3rcJcz6rd9nIhqWPZtVWZL4” for 127.0.0.1 at 2026-06-30 14:24:27 -0300 Processing by RedefinicaoSenhasController#update as HTML

+ +
Parameters: {"senha" => "NovaSenha123", "senha_confirmation" => "NovaSenha123", "commit" => "Redefinir senha", "token" => "[FILTERED]"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`redefinicao_senha_token` = 'hHEfsf_DsFFtj51gBeIA3rcJcz6rd9nIhqWPZtVWZL4' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' AND `usuarios`.`id` != 37 LIMIT 1
+Usuario Update (0.7ms)  UPDATE `usuarios` SET `usuarios`.`redefinicao_senha_sent_at` = NULL, `usuarios`.`redefinicao_senha_token` = NULL, `usuarios`.`senha_hash` = '$2a$12$DKCEv3XgcjJYcbEpEd6Ec.XhNQbkJ9G2/Sviwqx8ZtzDwcoEKm9lG', `usuarios`.`updated_at` = '2026-06-30 17:24:27.375382' WHERE `usuarios`.`id` = 37
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to example.com/ Completed 302 Found in 191ms (ActiveRecord: 1.5ms (3 queries, 0 cached) | GC: 0.0ms) Started GET “/” for 127.0.0.1 at 2026-06-30 14:24:27 -0300 Processing by SessionsController#new as HTML

+ +
Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering sessions/new.html.erb within layouts/application
+Rendered sessions/new.html.erb within layouts/application (Duration: 0.2ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.5ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.6ms | ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/” for 127.0.0.1 at 2026-06-30 14:24:27 -0300 Processing by SessionsController#new as HTML

+ +
Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering sessions/new.html.erb within layouts/application
+Rendered sessions/new.html.erb within layouts/application (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.3ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.4ms | ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started POST “/login” for 127.0.0.1 at 2026-06-30 14:24:27 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "usuario@teste.com", "senha" => "NovaSenha123", "commit" => "Entrar"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' LIMIT 1
+ +

Redirected to www.example.com/usuarios/37/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/usuarios/37/avaliacoes” for 127.0.0.1 at 2026-06-30 14:24:27 -0300 Processing by UsuariosController#avaliacoes as HTML

+ +
Parameters: {"usuario_id" => "37"}
+Usuario Load (0.5ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 37 LIMIT 1
+CACHE Usuario Load (0.0ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 37 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering usuarios/avaliacoes.html.erb within layouts/application
+Formulario Load (0.3ms)  SELECT `formularios`.* FROM `formularios` INNER JOIN `turmas` ON `turmas`.`id` = `formularios`.`turma_id` WHERE `formularios`.`turma_id` IN (SELECT `turmas`.`id` FROM `turmas` WHERE (1=0))
+Rendered usuarios/avaliacoes.html.erb within layouts/application (Duration: 0.7ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.9ms | GC: 0.0ms)
+ +

Completed 200 OK in 2ms (Views: 0.8ms | ActiveRecord: 0.8ms (3 queries, 1 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.9ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '914960' LIMIT 1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' LIMIT 1
+Usuario Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:24:27.766845', NULL, NULL, NULL, NULL, 'usuario@teste.com', NULL, '914960', 'Usuário Teste', NULL, NULL, '$2a$12$BpdmgAnbOYlQoxEdKMjdwemsBT.lLX7OarDIF76fFKm44U1TtCz8i', NULL, '2026-06-30 17:24:27.766845')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/” for 127.0.0.1 at 2026-06-30 14:24:27 -0300 Processing by SessionsController#new as HTML

+ +
Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering sessions/new.html.erb within layouts/application
+Rendered sessions/new.html.erb within layouts/application (Duration: 0.2ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.6ms | ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.5ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' AND `usuarios`.`id` != 38 LIMIT 1
+Usuario Update (0.5ms)  UPDATE `usuarios` SET `usuarios`.`redefinicao_senha_sent_at` = '2026-06-30 17:24:27.770999', `usuarios`.`redefinicao_senha_token` = 'IpJ3olbavF54FY8TQ0VziVAj_kpvI4XM9fhAglb1TlI', `usuarios`.`updated_at` = '2026-06-30 17:24:27.771860' WHERE `usuarios`.`id` = 38
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Rendering layout layouts/mailer.html.erb
+Rendering usuario_mailer/redefinicao_senha.html.erb within layouts/mailer
+Rendered usuario_mailer/redefinicao_senha.html.erb within layouts/mailer (Duration: 0.0ms | GC: 0.0ms)
+Rendered layout layouts/mailer.html.erb (Duration: 0.1ms | GC: 0.0ms)
+Rendering layout layouts/mailer.text.erb
+Rendering usuario_mailer/redefinicao_senha.text.erb within layouts/mailer
+Rendered usuario_mailer/redefinicao_senha.text.erb within layouts/mailer (Duration: 0.0ms | GC: 0.0ms)
+Rendered layout layouts/mailer.text.erb (Duration: 0.0ms | GC: 0.0ms)
+ +

UsuarioMailer#redefinicao_senha: processed outbound mail in 0.9ms Delivered mail 6a43fbcbbcf45_181feea011a7@MacBook-Air-de-Elvis.local.mail (0.9ms) Date: Tue, 30 Jun 2026 14:24:27 -0300 From: camaar@gmail.com To: usuario@teste.com Message-ID: <6a43fbcbbcf45_181feea011a7@MacBook-Air-de-Elvis.local.mail> Subject: =?UTF-8?Q?Redefini=C3=A7=C3=A3o_de_senha?= MIME-Version: 1.0 Content-Type: multipart/alternative;

+ +
boundary="--==_mimepart_6a43fbcbbcd53_181feea010c3";
+charset=UTF-8
+
+ +

Content-Transfer-Encoding: 7bit

+ +

—-==_mimepart_6a43fbcbbcd53_181feea010c3 Content-Type: text/plain;

+ +
charset=UTF-8
+
+ +

Content-Transfer-Encoding: quoted-printable

+ +

Ol=C3=A1, Usu=C3=A1rio Teste.

+ +

Voc=C3=AA solicitou a redefini=C3=A7=C3=A3o da sua senha. Acesse o link a= baixo:

+ +

example.com/redefinir_senha/IpJ3olbavF54FY8TQ0VziVAj_kpvI4XM9fhAgl= b1TlI

+ +

—-==_mimepart_6a43fbcbbcd53_181feea010c3 Content-Type: text/html;

+ +
charset=UTF-8
+
+ +

Content-Transfer-Encoding: quoted-printable

+ +

<!DOCTYPE html> <html>

+ +
<head>
+  <meta http-equiv=3D"Content-Type" content=3D"text/html; charset=3Dutf=
+ +

-8“>

+ +
  <style>
+    /* Email styles need to be inline */
+  </style>
+</head>
+
+<body>
+  <p>Ol=C3=A1, Usu=C3=A1rio Teste.</p>
+ +

<p>Voc=C3=AA solicitou a redefini=C3=A7=C3=A3o da sua senha. Acesse o lin= k abaixo:</p>

+ +

<p><a href=3D“example.com/redefinir_senha/IpJ3olbavF54FY8TQ0VziVAj= _kpvI4XM9fhAglb1TlI”>example.com/redefinir_senha/IpJ3olbavF54FY8TQ= 0VziVAj_kpvI4XM9fhAglb1TlI</a></p>

+ +
</body>
+ +

</html>

+ +

—-==_mimepart_6a43fbcbbcd53_181feea010c3–

+ +

Started GET “/redefinir_senha/IpJ3olbavF54FY8TQ0VziVAj_kpvI4XM9fhAglb1TlI” for 127.0.0.1 at 2026-06-30 14:24:27 -0300 Processing by RedefinicaoSenhasController#edit as HTML

+ +
Parameters: {"token" => "[FILTERED]"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`redefinicao_senha_token` = 'IpJ3olbavF54FY8TQ0VziVAj_kpvI4XM9fhAglb1TlI' LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering redefinicao_senhas/edit.html.erb within layouts/application
+Rendered redefinicao_senhas/edit.html.erb within layouts/application (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.5ms | ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started PATCH “/redefinir_senha/IpJ3olbavF54FY8TQ0VziVAj_kpvI4XM9fhAglb1TlI” for 127.0.0.1 at 2026-06-30 14:24:27 -0300 Processing by RedefinicaoSenhasController#update as HTML

+ +
Parameters: {"senha" => "NovaSenha123", "senha_confirmation" => "NovaSenha123", "commit" => "Redefinir senha", "token" => "[FILTERED]"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`redefinicao_senha_token` = 'IpJ3olbavF54FY8TQ0VziVAj_kpvI4XM9fhAglb1TlI' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.5ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' AND `usuarios`.`id` != 38 LIMIT 1
+Usuario Update (0.7ms)  UPDATE `usuarios` SET `usuarios`.`redefinicao_senha_sent_at` = NULL, `usuarios`.`redefinicao_senha_token` = NULL, `usuarios`.`senha_hash` = '$2a$12$7TVhxrrYh/DgA60QEGqJ0Oiu/r4DzcR93fywQzMbnOMQJicihQ8ae', `usuarios`.`updated_at` = '2026-06-30 17:24:27.967031' WHERE `usuarios`.`id` = 38
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to example.com/ Completed 302 Found in 191ms (ActiveRecord: 1.7ms (3 queries, 0 cached) | GC: 0.0ms) Started GET “/” for 127.0.0.1 at 2026-06-30 14:24:27 -0300 Processing by SessionsController#new as HTML

+ +
Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering sessions/new.html.erb within layouts/application
+Rendered sessions/new.html.erb within layouts/application (Duration: 0.2ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 4ms (Views: 0.6ms | ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 2.5ms) Started GET “/” for 127.0.0.1 at 2026-06-30 14:24:27 -0300 Processing by SessionsController#new as HTML

+ +
Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering sessions/new.html.erb within layouts/application
+Rendered sessions/new.html.erb within layouts/application (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.3ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.4ms | ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started POST “/login” for 127.0.0.1 at 2026-06-30 14:24:27 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "usuario@teste.com", "senha" => "Senha123", "commit" => "Entrar"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' LIMIT 1
+ +

Redirected to www.example.com/ Completed 302 Found in 189ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/” for 127.0.0.1 at 2026-06-30 14:24:28 -0300 Processing by SessionsController#new as HTML

+ +
Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering sessions/new.html.erb within layouts/application
+Rendered sessions/new.html.erb within layouts/application (Duration: 0.2ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.5ms | ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (1.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Usuario Load (0.5ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '263199' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' LIMIT 1
+Usuario Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:24:28.361577', NULL, NULL, NULL, NULL, 'usuario@teste.com', NULL, '263199', 'Usuário Teste', NULL, NULL, '$2a$12$ipsDudHxyYUfO3neGD9XRO0oKdnyTYlh/YLAim7NF/awEv3ExSe4a', NULL, '2026-06-30 17:24:28.361577')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/” for 127.0.0.1 at 2026-06-30 14:24:28 -0300 Processing by SessionsController#new as HTML

+ +
Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering sessions/new.html.erb within layouts/application
+Rendered sessions/new.html.erb within layouts/application (Duration: 0.2ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.6ms | ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Usuario Delete All (0.3ms)  DELETE FROM `usuarios` WHERE `usuarios`.`email` = 'naoexiste@teste.com'
+ +

Started GET “/redefinir_senha” for 127.0.0.1 at 2026-06-30 14:24:28 -0300 Processing by RedefinicaoSenhasController#new as HTML

+ +
Rendering layout layouts/application.html.erb
+Rendering redefinicao_senhas/new.html.erb within layouts/application
+Rendered redefinicao_senhas/new.html.erb within layouts/application (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.3ms | GC: 0.0ms)
+ +

Completed 200 OK in 0ms (Views: 0.4ms | ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 0.0ms) Started POST “/redefinir_senha” for 127.0.0.1 at 2026-06-30 14:24:28 -0300 Processing by RedefinicaoSenhasController#create as HTML

+ +
Parameters: {"email" => "[FILTERED]", "commit" => "Solicitar redefinição"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'naoexiste@teste.com' LIMIT 1
+ +

Redirected to www.example.com/redefinir_senha Completed 302 Found in 1ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/redefinir_senha” for 127.0.0.1 at 2026-06-30 14:24:28 -0300 Processing by RedefinicaoSenhasController#new as HTML

+ +
Rendering layout layouts/application.html.erb
+Rendering redefinicao_senhas/new.html.erb within layouts/application
+Rendered redefinicao_senhas/new.html.erb within layouts/application (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.5ms | GC: 0.1ms)
+ +

Completed 200 OK in 1ms (Views: 0.6ms | ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 0.1ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '479902' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' LIMIT 1
+Usuario Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:24:28.562328', NULL, NULL, NULL, NULL, 'usuario@teste.com', NULL, '479902', 'Usuário Teste', NULL, NULL, '$2a$12$BiLhmXePOYUVsw3WPl3EaOrUJfkGVeLDC0VZXQqQnjFIGUlAStjea', NULL, '2026-06-30 17:24:28.562328')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/” for 127.0.0.1 at 2026-06-30 14:24:28 -0300 Processing by SessionsController#new as HTML

+ +
Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering sessions/new.html.erb within layouts/application
+Rendered sessions/new.html.erb within layouts/application (Duration: 0.2ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.5ms | ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/redefinir_senha” for 127.0.0.1 at 2026-06-30 14:24:28 -0300 Processing by RedefinicaoSenhasController#new as HTML

+ +
Rendering layout layouts/application.html.erb
+Rendering redefinicao_senhas/new.html.erb within layouts/application
+Rendered redefinicao_senhas/new.html.erb within layouts/application (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.3ms | GC: 0.0ms)
+ +

Completed 200 OK in 0ms (Views: 0.4ms | ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 0.0ms) Started POST “/redefinir_senha” for 127.0.0.1 at 2026-06-30 14:24:28 -0300 Processing by RedefinicaoSenhasController#create as HTML

+ +
Parameters: {"email" => "[FILTERED]", "commit" => "Solicitar redefinição"}
+ +

Redirected to www.example.com/redefinir_senha Completed 302 Found in 0ms (ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 0.0ms) Started GET “/redefinir_senha” for 127.0.0.1 at 2026-06-30 14:24:28 -0300 Processing by RedefinicaoSenhasController#new as HTML

+ +
Rendering layout layouts/application.html.erb
+Rendering redefinicao_senhas/new.html.erb within layouts/application
+Rendered redefinicao_senhas/new.html.erb within layouts/application (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.3ms | GC: 0.0ms)
+ +

Completed 200 OK in 0ms (Views: 0.4ms | ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.6ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Usuario Load (0.5ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '214538' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' LIMIT 1
+Usuario Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:24:28.761384', NULL, NULL, NULL, NULL, 'usuario@teste.com', NULL, '214538', 'Usuário Teste', NULL, NULL, '$2a$12$mS6j5BnMATAMVA5ISxRF8OcSguuBnCgQJtTUbA/yazBpJMxCTKSGe', NULL, '2026-06-30 17:24:28.761384')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/” for 127.0.0.1 at 2026-06-30 14:24:28 -0300 Processing by SessionsController#new as HTML

+ +
Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering sessions/new.html.erb within layouts/application
+Rendered sessions/new.html.erb within layouts/application (Duration: 0.2ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.6ms | GC: 0.1ms)
+ +

Completed 200 OK in 1ms (Views: 0.7ms | ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.1ms)

+ +
Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.5ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' AND `usuarios`.`id` != 41 LIMIT 1
+Usuario Update (0.4ms)  UPDATE `usuarios` SET `usuarios`.`redefinicao_senha_sent_at` = '2026-06-30 17:24:28.765437', `usuarios`.`redefinicao_senha_token` = '51D4lzyXRevcdF0Y6N9WOmI2dQcVI__NJbeo8gevR9k', `usuarios`.`updated_at` = '2026-06-30 17:24:28.766270' WHERE `usuarios`.`id` = 41
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Rendering layout layouts/mailer.html.erb
+Rendering usuario_mailer/redefinicao_senha.html.erb within layouts/mailer
+Rendered usuario_mailer/redefinicao_senha.html.erb within layouts/mailer (Duration: 0.0ms | GC: 0.0ms)
+Rendered layout layouts/mailer.html.erb (Duration: 0.1ms | GC: 0.0ms)
+Rendering layout layouts/mailer.text.erb
+Rendering usuario_mailer/redefinicao_senha.text.erb within layouts/mailer
+Rendered usuario_mailer/redefinicao_senha.text.erb within layouts/mailer (Duration: 0.0ms | GC: 0.0ms)
+Rendered layout layouts/mailer.text.erb (Duration: 0.0ms | GC: 0.0ms)
+ +

UsuarioMailer#redefinicao_senha: processed outbound mail in 0.8ms Delivered mail 6a43fbccbb934_181feea013fe@MacBook-Air-de-Elvis.local.mail (1.0ms) Date: Tue, 30 Jun 2026 14:24:28 -0300 From: camaar@gmail.com To: usuario@teste.com Message-ID: <6a43fbccbb934_181feea013fe@MacBook-Air-de-Elvis.local.mail> Subject: =?UTF-8?Q?Redefini=C3=A7=C3=A3o_de_senha?= MIME-Version: 1.0 Content-Type: multipart/alternative;

+ +
boundary="--==_mimepart_6a43fbccbb6e9_181feea01211";
+charset=UTF-8
+
+ +

Content-Transfer-Encoding: 7bit

+ +

—-==_mimepart_6a43fbccbb6e9_181feea01211 Content-Type: text/plain;

+ +
charset=UTF-8
+
+ +

Content-Transfer-Encoding: quoted-printable

+ +

Ol=C3=A1, Usu=C3=A1rio Teste.

+ +

Voc=C3=AA solicitou a redefini=C3=A7=C3=A3o da sua senha. Acesse o link a= baixo:

+ +

example.com/redefinir_senha/51D4lzyXRevcdF0Y6N9WOmI2dQcVI__NJbeo8g= evR9k

+ +

—-==_mimepart_6a43fbccbb6e9_181feea01211 Content-Type: text/html;

+ +
charset=UTF-8
+
+ +

Content-Transfer-Encoding: quoted-printable

+ +

<!DOCTYPE html> <html>

+ +
<head>
+  <meta http-equiv=3D"Content-Type" content=3D"text/html; charset=3Dutf=
+ +

-8“>

+ +
  <style>
+    /* Email styles need to be inline */
+  </style>
+</head>
+
+<body>
+  <p>Ol=C3=A1, Usu=C3=A1rio Teste.</p>
+ +

<p>Voc=C3=AA solicitou a redefini=C3=A7=C3=A3o da sua senha. Acesse o lin= k abaixo:</p>

+ +

<p><a href=3D“example.com/redefinir_senha/51D4lzyXRevcdF0Y6N9WOmI2= dQcVI__NJbeo8gevR9k”>example.com/redefinir_senha/51D4lzyXRevcdF0Y6= N9WOmI2dQcVI__NJbeo8gevR9k</a></p>

+ +
</body>
+ +

</html>

+ +

—-==_mimepart_6a43fbccbb6e9_181feea01211–

+ +

Started GET “/redefinir_senha/51D4lzyXRevcdF0Y6N9WOmI2dQcVI__NJbeo8gevR9k” for 127.0.0.1 at 2026-06-30 14:24:28 -0300 Processing by RedefinicaoSenhasController#edit as HTML

+ +
Parameters: {"token" => "[FILTERED]"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`redefinicao_senha_token` = '51D4lzyXRevcdF0Y6N9WOmI2dQcVI__NJbeo8gevR9k' LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering redefinicao_senhas/edit.html.erb within layouts/application
+Rendered redefinicao_senhas/edit.html.erb within layouts/application (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.5ms | ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started PATCH “/redefinir_senha/51D4lzyXRevcdF0Y6N9WOmI2dQcVI__NJbeo8gevR9k” for 127.0.0.1 at 2026-06-30 14:24:28 -0300 Processing by RedefinicaoSenhasController#update as HTML

+ +
Parameters: {"senha" => "NovaSenha123", "senha_confirmation" => "NovaSenha321", "commit" => "Redefinir senha", "token" => "[FILTERED]"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`redefinicao_senha_token` = '51D4lzyXRevcdF0Y6N9WOmI2dQcVI__NJbeo8gevR9k' LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering redefinicao_senhas/edit.html.erb within layouts/application
+Rendered redefinicao_senhas/edit.html.erb within layouts/application (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.3ms | GC: 0.0ms)
+ +

Completed 422 Unprocessable Content in 1ms (Views: 0.4ms | ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.6ms)  ROLLBACK
+TRANSACTION (0.2ms)  BEGIN
+Usuario Load (0.5ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '495836' LIMIT 1
+Usuario Exists? (0.1ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' LIMIT 1
+Usuario Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:24:28.965630', NULL, NULL, NULL, NULL, 'usuario@teste.com', NULL, '495836', 'Usuário Teste', NULL, NULL, '$2a$12$CvdkmAiwiOvZ110jdygA4uvvhHQh3zSQuQBtwaERtxHrIlZeQmfT6', NULL, '2026-06-30 17:24:28.965630')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/” for 127.0.0.1 at 2026-06-30 14:24:28 -0300 Processing by SessionsController#new as HTML

+ +
Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering sessions/new.html.erb within layouts/application
+Rendered sessions/new.html.erb within layouts/application (Duration: 0.2ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.6ms | ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.5ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' AND `usuarios`.`id` != 42 LIMIT 1
+Usuario Update (0.4ms)  UPDATE `usuarios` SET `usuarios`.`redefinicao_senha_sent_at` = '2026-06-30 17:24:28.969453', `usuarios`.`redefinicao_senha_token` = 'GiyOL9047MRXiG87pXwPU6Q3UzOB_hFJKCIgqidcsx8', `usuarios`.`updated_at` = '2026-06-30 17:24:28.970223' WHERE `usuarios`.`id` = 42
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Rendering layout layouts/mailer.html.erb
+Rendering usuario_mailer/redefinicao_senha.html.erb within layouts/mailer
+Rendered usuario_mailer/redefinicao_senha.html.erb within layouts/mailer (Duration: 0.0ms | GC: 0.0ms)
+Rendered layout layouts/mailer.html.erb (Duration: 0.1ms | GC: 0.0ms)
+Rendering layout layouts/mailer.text.erb
+Rendering usuario_mailer/redefinicao_senha.text.erb within layouts/mailer
+Rendered usuario_mailer/redefinicao_senha.text.erb within layouts/mailer (Duration: 0.0ms | GC: 0.0ms)
+Rendered layout layouts/mailer.text.erb (Duration: 0.0ms | GC: 0.0ms)
+ +

UsuarioMailer#redefinicao_senha: processed outbound mail in 0.9ms Delivered mail 6a43fbcced5d7_181feea015c1@MacBook-Air-de-Elvis.local.mail (1.0ms) Date: Tue, 30 Jun 2026 14:24:28 -0300 From: camaar@gmail.com To: usuario@teste.com Message-ID: <6a43fbcced5d7_181feea015c1@MacBook-Air-de-Elvis.local.mail> Subject: =?UTF-8?Q?Redefini=C3=A7=C3=A3o_de_senha?= MIME-Version: 1.0 Content-Type: multipart/alternative;

+ +
boundary="--==_mimepart_6a43fbcced3f1_181feea01476";
+charset=UTF-8
+
+ +

Content-Transfer-Encoding: 7bit

+ +

—-==_mimepart_6a43fbcced3f1_181feea01476 Content-Type: text/plain;

+ +
charset=UTF-8
+
+ +

Content-Transfer-Encoding: quoted-printable

+ +

Ol=C3=A1, Usu=C3=A1rio Teste.

+ +

Voc=C3=AA solicitou a redefini=C3=A7=C3=A3o da sua senha. Acesse o link a= baixo:

+ +

example.com/redefinir_senha/GiyOL9047MRXiG87pXwPU6Q3UzOB_hFJKCIgqi= dcsx8

+ +

—-==_mimepart_6a43fbcced3f1_181feea01476 Content-Type: text/html;

+ +
charset=UTF-8
+
+ +

Content-Transfer-Encoding: quoted-printable

+ +

<!DOCTYPE html> <html>

+ +
<head>
+  <meta http-equiv=3D"Content-Type" content=3D"text/html; charset=3Dutf=
+ +

-8“>

+ +
  <style>
+    /* Email styles need to be inline */
+  </style>
+</head>
+
+<body>
+  <p>Ol=C3=A1, Usu=C3=A1rio Teste.</p>
+ +

<p>Voc=C3=AA solicitou a redefini=C3=A7=C3=A3o da sua senha. Acesse o lin= k abaixo:</p>

+ +

<p><a href=3D“example.com/redefinir_senha/GiyOL9047MRXiG87pXwPU6Q3= UzOB_hFJKCIgqidcsx8”>example.com/redefinir_senha/GiyOL9047MRXiG87p= XwPU6Q3UzOB_hFJKCIgqidcsx8</a></p>

+ +
</body>
+ +

</html>

+ +

—-==_mimepart_6a43fbcced3f1_181feea01476–

+ +

Started GET “/redefinir_senha/GiyOL9047MRXiG87pXwPU6Q3UzOB_hFJKCIgqidcsx8” for 127.0.0.1 at 2026-06-30 14:24:28 -0300 Processing by RedefinicaoSenhasController#edit as HTML

+ +
Parameters: {"token" => "[FILTERED]"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`redefinicao_senha_token` = 'GiyOL9047MRXiG87pXwPU6Q3UzOB_hFJKCIgqidcsx8' LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering redefinicao_senhas/edit.html.erb within layouts/application
+Rendered redefinicao_senhas/edit.html.erb within layouts/application (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.5ms | ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started PATCH “/redefinir_senha/GiyOL9047MRXiG87pXwPU6Q3UzOB_hFJKCIgqidcsx8” for 127.0.0.1 at 2026-06-30 14:24:28 -0300 Processing by RedefinicaoSenhasController#update as HTML

+ +
Parameters: {"senha" => "123", "senha_confirmation" => "123", "commit" => "Redefinir senha", "token" => "[FILTERED]"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`redefinicao_senha_token` = 'GiyOL9047MRXiG87pXwPU6Q3UzOB_hFJKCIgqidcsx8' LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering redefinicao_senhas/edit.html.erb within layouts/application
+Rendered redefinicao_senhas/edit.html.erb within layouts/application (Duration: 0.2ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.3ms | GC: 0.0ms)
+ +

Completed 422 Unprocessable Content in 1ms (Views: 0.4ms | ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.4ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Departamento' AND `departamentos`.`codigo` = 'TST' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'TST' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('TST', '2026-06-30 17:24:28.980399', 'Departamento', '2026-06-30 17:24:28.980399')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Curso Load (0.2ms)  SELECT `cursos`.* FROM `cursos` WHERE `cursos`.`codigo` = 'TST' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Curso Exists? (0.3ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`codigo` = 'TST' LIMIT 1
+Curso Create (0.2ms)  INSERT INTO `cursos` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('TST', '2026-06-30 17:24:28.981792', 27, 'Curso Teste', '2026-06-30 17:24:28.981792')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Discente Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Discente' AND `usuarios`.`matricula` = '2024001' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '2024001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'discente@teste.com' LIMIT 1
+Discente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:24:29.171950', 4, NULL, NULL, NULL, 'discente@teste.com', NULL, '2024001', 'Discente Teste', NULL, NULL, '$2a$12$etQszTAuu7Lmzf77QpeYSuSQdDPrZlZm5QhWfCSHUDSt2bl4ssb3K', 'Discente', '2026-06-30 17:24:29.171950')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Departamento' AND `departamentos`.`codigo` = 'TST' LIMIT 1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0001' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.4ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0001' LIMIT 1
+Disciplina Create (0.3ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0001', '2026-06-30 17:24:29.175218', 27, 'Engenharia de Software', '2026-06-30 17:24:29.175218')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`disciplina_id` = 21 AND `turmas`.`numero_da_turma` = '01' AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = '01' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 21 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:24:29.176862', 21, '235M12', '01', '2026.1', '2026-06-30 17:24:29.176862')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Exists? (0.6ms)  SELECT 1 AS one FROM `turmas` INNER JOIN `discentes_turmas` ON `turmas`.`id` = `discentes_turmas`.`turma_id` WHERE `discentes_turmas`.`discente_id` = 43 AND `turmas`.`id` = 21 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Discente::HABTM_Turmas Create (0.2ms)  INSERT INTO `discentes_turmas` (`discente_id`, `turma_id`) VALUES (43, 21)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Formulario Load (0.2ms)  SELECT `formularios`.* FROM `formularios` WHERE `formularios`.`turma_id` = 21 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:24:29.183763', NULL, NULL, NULL, 'Avaliação de Turma 2026.1', 21, '2026-06-30 17:24:29.183763')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ElementoForm Load (0.2ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`formulario_id` = 8 AND `elemento_forms`.`ordem` = 1 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:24:29.185053', 'Como você avalia o professor?', 8, 1, 'Múltipla Escolha', '2026-06-30 17:24:29.185053')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` = 16 AND `campo_forms`.`ordem` = 1 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.4ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:29.186280', 16, 'Ótimo', 1, NULL, '2026-06-30 17:24:29.186280')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+CampoForm Load (0.1ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` = 16 AND `campo_forms`.`ordem` = 2 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.2ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:29.187449', 16, 'Bom', 2, NULL, '2026-06-30 17:24:29.187449')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` = 16 AND `campo_forms`.`ordem` = 3 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.4ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:29.188455', 16, 'Regular', 3, NULL, '2026-06-30 17:24:29.188455')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` = 16 AND `campo_forms`.`ordem` = 4 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.4ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:29.189592', 16, 'Ruim', 4, NULL, '2026-06-30 17:24:29.189592')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ElementoForm Load (0.2ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`formulario_id` = 8 AND `elemento_forms`.`ordem` = 2 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:24:29.190738', 'Comente sobre a didática', 8, 2, 'Texto', '2026-06-30 17:24:29.190738')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` = 17 AND `campo_forms`.`ordem` = 1 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.4ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:29.191893', 17, NULL, 1, NULL, '2026-06-30 17:24:29.191893')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/usuarios/43/avaliacoes” for 127.0.0.1 at 2026-06-30 14:24:29 -0300 Processing by UsuariosController#avaliacoes as HTML

+ +
Parameters: {"usuario_id" => "43"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 43 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering usuarios/avaliacoes.html.erb within layouts/application
+Formulario Load (0.4ms)  SELECT `formularios`.* FROM `formularios` INNER JOIN `turmas` ON `turmas`.`id` = `formularios`.`turma_id` WHERE `formularios`.`turma_id` IN (SELECT `turmas`.`id` FROM `turmas` INNER JOIN `discentes_turmas` ON `turmas`.`id` = `discentes_turmas`.`turma_id` WHERE `discentes_turmas`.`discente_id` = 43)
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`id` = 21
+Disciplina Load (0.3ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`id` = 21
+HABTM_Docentes Eager Load (0.3ms)  SELECT `docentes_turmas`.`docente_id` AS t0_r0, `docentes_turmas`.`turma_id` AS t0_r1, `usuarios`.`id` AS t1_r0, `usuarios`.`created_at` AS t1_r1, `usuarios`.`curso_id` AS t1_r2, `usuarios`.`definicao_senha_sent_at` AS t1_r3, `usuarios`.`definicao_senha_token` AS t1_r4, `usuarios`.`departamento_id` AS t1_r5, `usuarios`.`email` AS t1_r6, `usuarios`.`formacao` AS t1_r7, `usuarios`.`matricula` AS t1_r8, `usuarios`.`nome` AS t1_r9, `usuarios`.`redefinicao_senha_sent_at` AS t1_r10, `usuarios`.`redefinicao_senha_token` AS t1_r11, `usuarios`.`senha_hash` AS t1_r12, `usuarios`.`type` AS t1_r13, `usuarios`.`updated_at` AS t1_r14 FROM `docentes_turmas` LEFT OUTER JOIN `usuarios` ON `usuarios`.`id` = `docentes_turmas`.`docente_id` AND `usuarios`.`type` = 'Docente' WHERE `usuarios`.`type` = 'Docente' AND `docentes_turmas`.`turma_id` = 21
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`id` = 27
+Rendered usuarios/avaliacoes.html.erb within layouts/application (Duration: 4.4ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 4.7ms | GC: 0.0ms)
+ +

Completed 200 OK in 6ms (Views: 2.2ms | ActiveRecord: 2.9ms (6 queries, 0 cached) | GC: 0.0ms) Started GET “/usuarios/43/formularios/8/responder” for 127.0.0.1 at 2026-06-30 14:24:29 -0300 Processing by UsuariosController#responder_formulario as HTML

+ +
Parameters: {"usuario_id" => "43", "formulario_id" => "8"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 43 LIMIT 1
+Formulario Load (0.2ms)  SELECT `formularios`.* FROM `formularios` WHERE `formularios`.`id` = 8 LIMIT 1
+ElementoForm Load (0.2ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`formulario_id` = 8
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` IN (16, 17)
+RespostaForm Exists? (0.2ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`formulario_id` = 8 AND `resposta_forms`.`usuario_id` = 43 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering usuarios/responder_formulario.html.erb within layouts/application
+ElementoForm Load (0.2ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`formulario_id` = 8 ORDER BY `elemento_forms`.`ordem` ASC
+CampoForm Load (0.3ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` = 16 ORDER BY `campo_forms`.`ordem` ASC
+Rendered usuarios/responder_formulario.html.erb within layouts/application (Duration: 2.0ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 2.2ms | GC: 0.0ms)
+ +

Completed 200 OK in 5ms (Views: 1.9ms | ActiveRecord: 1.5ms (7 queries, 0 cached) | GC: 0.0ms)

+ +
ElementoForm Load (0.2ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`formulario_id` = 8
+ElementoForm Load (0.2ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`formulario_id` = 8 ORDER BY `elemento_forms`.`ordem` ASC
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` = 16 ORDER BY `campo_forms`.`ordem` ASC LIMIT 1
+ +

Started POST “/usuarios/43/formularios/8/responder” for 127.0.0.1 at 2026-06-30 14:24:29 -0300 Processing by UsuariosController#submeter_resposta as HTML

+ +
Parameters: {"respostas" => {"16" => "40", "17" => "Uma resposta qualquer"}, "usuario_id" => "43", "formulario_id" => "8"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 43 LIMIT 1
+Formulario Load (0.2ms)  SELECT `formularios`.* FROM `formularios` WHERE `formularios`.`id` = 8 LIMIT 1
+ElementoForm Load (0.2ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`formulario_id` = 8
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` IN (16, 17)
+RespostaForm Exists? (0.2ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`formulario_id` = 8 AND `resposta_forms`.`usuario_id` = 43 LIMIT 1
+ElementoForm Load (0.2ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`formulario_id` = 8 ORDER BY `elemento_forms`.`ordem` ASC
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaForm Exists? (0.4ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 43 AND `resposta_forms`.`formulario_id` = 8 LIMIT 1
+RespostaForm Create (0.3ms)  INSERT INTO `resposta_forms` (`created_at`, `data_submissao`, `formulario_id`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:24:29.213033', '2026-06-30', 8, '2026-06-30 17:24:29.213033', 43)
+ElementoForm Load (0.3ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`formulario_id` = 8 ORDER BY `elemento_forms`.`ordem` ASC
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` = 16 AND `campo_forms`.`id` = 40 LIMIT 1
+RespostaElem Create (0.3ms)  INSERT INTO `resposta_elems` (`campo_form_id`, `created_at`, `elemento_form_id`, `resposta_form_id`, `texto_resposta`, `updated_at`) VALUES (40, '2026-06-30 17:24:29.214593', 16, 3, 'Ótimo', '2026-06-30 17:24:29.214593')
+RespostaElem Create (0.2ms)  INSERT INTO `resposta_elems` (`campo_form_id`, `created_at`, `elemento_form_id`, `resposta_form_id`, `texto_resposta`, `updated_at`) VALUES (NULL, '2026-06-30 17:24:29.215184', 17, 3, 'Uma resposta qualquer', '2026-06-30 17:24:29.215184')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/usuarios/43/avaliacoes Completed 302 Found in 6ms (ActiveRecord: 3.2ms (12 queries, 0 cached) | GC: 0.0ms) Started GET “/usuarios/43/avaliacoes” for 127.0.0.1 at 2026-06-30 14:24:29 -0300 Processing by UsuariosController#avaliacoes as HTML

+ +
Parameters: {"usuario_id" => "43"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 43 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering usuarios/avaliacoes.html.erb within layouts/application
+Formulario Load (0.3ms)  SELECT `formularios`.* FROM `formularios` INNER JOIN `turmas` ON `turmas`.`id` = `formularios`.`turma_id` WHERE `formularios`.`turma_id` IN (SELECT `turmas`.`id` FROM `turmas` INNER JOIN `discentes_turmas` ON `turmas`.`id` = `discentes_turmas`.`turma_id` WHERE `discentes_turmas`.`discente_id` = 43)
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`id` = 21
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`id` = 21
+HABTM_Docentes Eager Load (0.3ms)  SELECT `docentes_turmas`.`docente_id` AS t0_r0, `docentes_turmas`.`turma_id` AS t0_r1, `usuarios`.`id` AS t1_r0, `usuarios`.`created_at` AS t1_r1, `usuarios`.`curso_id` AS t1_r2, `usuarios`.`definicao_senha_sent_at` AS t1_r3, `usuarios`.`definicao_senha_token` AS t1_r4, `usuarios`.`departamento_id` AS t1_r5, `usuarios`.`email` AS t1_r6, `usuarios`.`formacao` AS t1_r7, `usuarios`.`matricula` AS t1_r8, `usuarios`.`nome` AS t1_r9, `usuarios`.`redefinicao_senha_sent_at` AS t1_r10, `usuarios`.`redefinicao_senha_token` AS t1_r11, `usuarios`.`senha_hash` AS t1_r12, `usuarios`.`type` AS t1_r13, `usuarios`.`updated_at` AS t1_r14 FROM `docentes_turmas` LEFT OUTER JOIN `usuarios` ON `usuarios`.`id` = `docentes_turmas`.`docente_id` AND `usuarios`.`type` = 'Docente' WHERE `usuarios`.`type` = 'Docente' AND `docentes_turmas`.`turma_id` = 21
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`id` = 27
+Rendered usuarios/avaliacoes.html.erb within layouts/application (Duration: 2.6ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 2.9ms | GC: 0.0ms)
+ +

Completed 200 OK in 4ms (Views: 1.9ms | ActiveRecord: 1.3ms (6 queries, 0 cached) | GC: 0.0ms)

+ +
RespostaForm Exists? (0.1ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`formulario_id` = 8 AND `resposta_forms`.`usuario_id` = 43 LIMIT 1
+ +

Started GET “/usuarios/43/formularios/8/responder” for 127.0.0.1 at 2026-06-30 14:24:29 -0300 Processing by UsuariosController#responder_formulario as HTML

+ +
Parameters: {"usuario_id" => "43", "formulario_id" => "8"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 43 LIMIT 1
+Formulario Load (0.2ms)  SELECT `formularios`.* FROM `formularios` WHERE `formularios`.`id` = 8 LIMIT 1
+ElementoForm Load (0.2ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`formulario_id` = 8
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` IN (16, 17)
+RespostaForm Exists? (0.2ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`formulario_id` = 8 AND `resposta_forms`.`usuario_id` = 43 LIMIT 1
+ +

Redirected to www.example.com/usuarios/43/avaliacoes Completed 302 Found in 2ms (ActiveRecord: 1.0ms (5 queries, 0 cached) | GC: 0.0ms) Started GET “/usuarios/43/avaliacoes” for 127.0.0.1 at 2026-06-30 14:24:29 -0300 Processing by UsuariosController#avaliacoes as HTML

+ +
Parameters: {"usuario_id" => "43"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 43 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering usuarios/avaliacoes.html.erb within layouts/application
+Formulario Load (0.3ms)  SELECT `formularios`.* FROM `formularios` INNER JOIN `turmas` ON `turmas`.`id` = `formularios`.`turma_id` WHERE `formularios`.`turma_id` IN (SELECT `turmas`.`id` FROM `turmas` INNER JOIN `discentes_turmas` ON `turmas`.`id` = `discentes_turmas`.`turma_id` WHERE `discentes_turmas`.`discente_id` = 43)
+Turma Load (0.1ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`id` = 21
+Disciplina Load (0.1ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`id` = 21
+HABTM_Docentes Eager Load (0.3ms)  SELECT `docentes_turmas`.`docente_id` AS t0_r0, `docentes_turmas`.`turma_id` AS t0_r1, `usuarios`.`id` AS t1_r0, `usuarios`.`created_at` AS t1_r1, `usuarios`.`curso_id` AS t1_r2, `usuarios`.`definicao_senha_sent_at` AS t1_r3, `usuarios`.`definicao_senha_token` AS t1_r4, `usuarios`.`departamento_id` AS t1_r5, `usuarios`.`email` AS t1_r6, `usuarios`.`formacao` AS t1_r7, `usuarios`.`matricula` AS t1_r8, `usuarios`.`nome` AS t1_r9, `usuarios`.`redefinicao_senha_sent_at` AS t1_r10, `usuarios`.`redefinicao_senha_token` AS t1_r11, `usuarios`.`senha_hash` AS t1_r12, `usuarios`.`type` AS t1_r13, `usuarios`.`updated_at` AS t1_r14 FROM `docentes_turmas` LEFT OUTER JOIN `usuarios` ON `usuarios`.`id` = `docentes_turmas`.`docente_id` AND `usuarios`.`type` = 'Docente' WHERE `usuarios`.`type` = 'Docente' AND `docentes_turmas`.`turma_id` = 21
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`id` = 27
+Rendered usuarios/avaliacoes.html.erb within layouts/application (Duration: 4.8ms | GC: 2.3ms)
+Rendered layout layouts/application.html.erb (Duration: 5.1ms | GC: 2.3ms)
+ +

Completed 200 OK in 6ms (Views: 4.2ms | ActiveRecord: 1.3ms (6 queries, 0 cached) | GC: 2.3ms)

+ +
TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.4ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Departamento' AND `departamentos`.`codigo` = 'TST' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'TST' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('TST', '2026-06-30 17:24:29.234545', 'Departamento', '2026-06-30 17:24:29.234545')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Curso Load (0.2ms)  SELECT `cursos`.* FROM `cursos` WHERE `cursos`.`codigo` = 'TST' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Curso Exists? (0.3ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`codigo` = 'TST' LIMIT 1
+Curso Create (0.3ms)  INSERT INTO `cursos` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('TST', '2026-06-30 17:24:29.235911', 28, 'Curso Teste', '2026-06-30 17:24:29.235911')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Discente Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Discente' AND `usuarios`.`matricula` = '2024001' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '2024001' LIMIT 1
+Usuario Exists? (0.1ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'discente@teste.com' LIMIT 1
+Discente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:24:29.428536', 5, NULL, NULL, NULL, 'discente@teste.com', NULL, '2024001', 'Discente Teste', NULL, NULL, '$2a$12$HJmA3uMxK19FSJi2RI4q4uPnuqYUD.njwHBfoDfRmjTJjql/2P4jy', 'Discente', '2026-06-30 17:24:29.428536')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Departamento' AND `departamentos`.`codigo` = 'TST' LIMIT 1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0001' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0001' LIMIT 1
+Disciplina Create (0.3ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0001', '2026-06-30 17:24:29.431662', 28, 'Engenharia de Software', '2026-06-30 17:24:29.431662')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`disciplina_id` = 22 AND `turmas`.`numero_da_turma` = '01' AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = '01' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 22 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:24:29.433256', 22, '235M12', '01', '2026.1', '2026-06-30 17:24:29.433256')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Exists? (0.2ms)  SELECT 1 AS one FROM `turmas` INNER JOIN `discentes_turmas` ON `turmas`.`id` = `discentes_turmas`.`turma_id` WHERE `discentes_turmas`.`discente_id` = 44 AND `turmas`.`id` = 22 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Discente::HABTM_Turmas Create (0.3ms)  INSERT INTO `discentes_turmas` (`discente_id`, `turma_id`) VALUES (44, 22)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Formulario Load (0.2ms)  SELECT `formularios`.* FROM `formularios` WHERE `formularios`.`turma_id` = 22 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:24:29.435859', NULL, NULL, NULL, 'Avaliação de Turma 2026.1', 22, '2026-06-30 17:24:29.435859')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ElementoForm Load (0.2ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`formulario_id` = 9 AND `elemento_forms`.`ordem` = 1 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:24:29.437098', 'Como você avalia o professor?', 9, 1, 'Múltipla Escolha', '2026-06-30 17:24:29.437098')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` = 18 AND `campo_forms`.`ordem` = 1 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.4ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:29.438238', 18, 'Ótimo', 1, NULL, '2026-06-30 17:24:29.438238')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` = 18 AND `campo_forms`.`ordem` = 2 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.3ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:29.439322', 18, 'Bom', 2, NULL, '2026-06-30 17:24:29.439322')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+CampoForm Load (0.3ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` = 18 AND `campo_forms`.`ordem` = 3 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.3ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:29.440437', 18, 'Regular', 3, NULL, '2026-06-30 17:24:29.440437')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` = 18 AND `campo_forms`.`ordem` = 4 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.3ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:29.441498', 18, 'Ruim', 4, NULL, '2026-06-30 17:24:29.441498')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ElementoForm Load (0.2ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`formulario_id` = 9 AND `elemento_forms`.`ordem` = 2 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.3ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:24:29.442559', 'Comente sobre a didática', 9, 2, 'Texto', '2026-06-30 17:24:29.442559')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` = 19 AND `campo_forms`.`ordem` = 1 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.4ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:29.443867', 19, NULL, 1, NULL, '2026-06-30 17:24:29.443867')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/usuarios/44/avaliacoes” for 127.0.0.1 at 2026-06-30 14:24:29 -0300 Processing by UsuariosController#avaliacoes as HTML

+ +
Parameters: {"usuario_id" => "44"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 44 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering usuarios/avaliacoes.html.erb within layouts/application
+Formulario Load (0.4ms)  SELECT `formularios`.* FROM `formularios` INNER JOIN `turmas` ON `turmas`.`id` = `formularios`.`turma_id` WHERE `formularios`.`turma_id` IN (SELECT `turmas`.`id` FROM `turmas` INNER JOIN `discentes_turmas` ON `turmas`.`id` = `discentes_turmas`.`turma_id` WHERE `discentes_turmas`.`discente_id` = 44)
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`id` = 22
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`id` = 22
+HABTM_Docentes Eager Load (0.3ms)  SELECT `docentes_turmas`.`docente_id` AS t0_r0, `docentes_turmas`.`turma_id` AS t0_r1, `usuarios`.`id` AS t1_r0, `usuarios`.`created_at` AS t1_r1, `usuarios`.`curso_id` AS t1_r2, `usuarios`.`definicao_senha_sent_at` AS t1_r3, `usuarios`.`definicao_senha_token` AS t1_r4, `usuarios`.`departamento_id` AS t1_r5, `usuarios`.`email` AS t1_r6, `usuarios`.`formacao` AS t1_r7, `usuarios`.`matricula` AS t1_r8, `usuarios`.`nome` AS t1_r9, `usuarios`.`redefinicao_senha_sent_at` AS t1_r10, `usuarios`.`redefinicao_senha_token` AS t1_r11, `usuarios`.`senha_hash` AS t1_r12, `usuarios`.`type` AS t1_r13, `usuarios`.`updated_at` AS t1_r14 FROM `docentes_turmas` LEFT OUTER JOIN `usuarios` ON `usuarios`.`id` = `docentes_turmas`.`docente_id` AND `usuarios`.`type` = 'Docente' WHERE `usuarios`.`type` = 'Docente' AND `docentes_turmas`.`turma_id` = 22
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`id` = 28
+Rendered usuarios/avaliacoes.html.erb within layouts/application (Duration: 2.8ms | GC: 0.2ms)
+Rendered layout layouts/application.html.erb (Duration: 3.0ms | GC: 0.2ms)
+ +

Completed 200 OK in 4ms (Views: 2.0ms | ActiveRecord: 1.4ms (6 queries, 0 cached) | GC: 0.2ms) Started GET “/usuarios/44/formularios/9/responder” for 127.0.0.1 at 2026-06-30 14:24:29 -0300 Processing by UsuariosController#responder_formulario as HTML

+ +
Parameters: {"usuario_id" => "44", "formulario_id" => "9"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 44 LIMIT 1
+Formulario Load (0.2ms)  SELECT `formularios`.* FROM `formularios` WHERE `formularios`.`id` = 9 LIMIT 1
+ElementoForm Load (0.2ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`formulario_id` = 9
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` IN (18, 19)
+RespostaForm Exists? (0.2ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`formulario_id` = 9 AND `resposta_forms`.`usuario_id` = 44 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering usuarios/responder_formulario.html.erb within layouts/application
+ElementoForm Load (0.2ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`formulario_id` = 9 ORDER BY `elemento_forms`.`ordem` ASC
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` = 18 ORDER BY `campo_forms`.`ordem` ASC
+Rendered usuarios/responder_formulario.html.erb within layouts/application (Duration: 1.0ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.2ms | GC: 0.0ms)
+ +

Completed 200 OK in 4ms (Views: 0.9ms | ActiveRecord: 1.5ms (7 queries, 0 cached) | GC: 0.1ms)

+ +
ElementoForm Load (0.2ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`formulario_id` = 9 AND `elemento_forms`.`tipo` = 'Texto' LIMIT 1
+ +

Started POST “/usuarios/44/formularios/9/responder” for 127.0.0.1 at 2026-06-30 14:24:29 -0300 Processing by UsuariosController#submeter_resposta as HTML

+ +
Parameters: {"respostas" => {"19" => ""}, "usuario_id" => "44", "formulario_id" => "9"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 44 LIMIT 1
+Formulario Load (0.2ms)  SELECT `formularios`.* FROM `formularios` WHERE `formularios`.`id` = 9 LIMIT 1
+ElementoForm Load (0.2ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`formulario_id` = 9
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` IN (18, 19)
+RespostaForm Exists? (0.2ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`formulario_id` = 9 AND `resposta_forms`.`usuario_id` = 44 LIMIT 1
+ElementoForm Load (0.2ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`formulario_id` = 9 ORDER BY `elemento_forms`.`ordem` ASC
+Rendering layout layouts/application.html.erb
+Rendering usuarios/responder_formulario.html.erb within layouts/application
+CACHE ElementoForm Load (0.0ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`formulario_id` = 9 ORDER BY `elemento_forms`.`ordem` ASC
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` = 18 ORDER BY `campo_forms`.`ordem` ASC
+Rendered usuarios/responder_formulario.html.erb within layouts/application (Duration: 0.7ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.9ms | GC: 0.0ms)
+ +

Completed 422 Unprocessable Content in 3ms (Views: 0.8ms | ActiveRecord: 1.4ms (8 queries, 1 cached) | GC: 0.1ms)

+ +
TRANSACTION (0.6ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Departamento' AND `departamentos`.`codigo` = 'TST' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'TST' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('TST', '2026-06-30 17:24:29.462451', 'Departamento', '2026-06-30 17:24:29.462451')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '123456789' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.3ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:24:29.464173', NULL, NULL, NULL, 29, 'admin@unb.br', NULL, '123456789', 'Admin', NULL, NULL, '123456', 'Administrador', '2026-06-30 17:24:29.464173')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Administrador Load (0.1ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' ORDER BY `usuarios`.`id` ASC LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Campo Exists? (0.3ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Template Create (0.2ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:24:29.466961', 'Template Prova Matemática 2º semestre', '2026-06-30 17:24:29.466961', 45)
+Elemento Create (0.2ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:24:29.467386', 'Questão Fantasma', 1, 16, '2026-06-30 17:24:29.467386')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:29.467766', 31, NULL, 1, 'Texto', '2026-06-30 17:24:29.467766')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Campo Exists? (0.3ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Template Create (0.2ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:24:29.469016', 'Template Prova Português 2º semestre', '2026-06-30 17:24:29.469016', 45)
+Elemento Create (0.2ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:24:29.469382', 'Questão Fantasma', 1, 17, '2026-06-30 17:24:29.469382')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:24:29.469868', 32, NULL, 1, 'Texto', '2026-06-30 17:24:29.469868')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Administrador Load (0.1ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' ORDER BY `usuarios`.`id` ASC LIMIT 1
+ +

Started GET “/admin/45/templates” for 127.0.0.1 at 2026-06-30 14:24:29 -0300 Processing by TemplatesController#index as HTML

+ +
Parameters: {"admin_id" => "45"}
+Rendering layout layouts/gerenciamento.html.erb
+Rendering templates/index.html.erb within layouts/gerenciamento
+Template Exists? (0.2ms)  SELECT 1 AS one FROM `templates` WHERE `templates`.`usuario_id` = 45 LIMIT 1
+Template Load (0.2ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`usuario_id` = 45
+Elemento Load (0.2ms)  SELECT `elementos`.* FROM `elementos` WHERE `elementos`.`template_id` IN (16, 17)
+Campo Load (0.2ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` IN (31, 32)
+Rendered templates/_grid.html.erb (Duration: 2.0ms | GC: 0.1ms)
+Rendered templates/index.html.erb within layouts/gerenciamento (Duration: 2.0ms | GC: 0.1ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 2.2ms | GC: 0.1ms)
+ +

Completed 200 OK in 3ms (Views: 1.6ms | ActiveRecord: 0.8ms (4 queries, 0 cached) | GC: 0.1ms)

+ +
TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.4ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Departamento' AND `departamentos`.`codigo` = 'TST' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'TST' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('TST', '2026-06-30 17:24:29.479357', 'Departamento', '2026-06-30 17:24:29.479357')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '123456789' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.2ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:24:29.481423', NULL, NULL, NULL, 30, 'admin@unb.br', NULL, '123456789', 'Admin', NULL, NULL, '123456', 'Administrador', '2026-06-30 17:24:29.481423')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Template Load (0.2ms)  SELECT `templates`.* FROM `templates`
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' ORDER BY `usuarios`.`id` ASC LIMIT 1
+ +

Started GET “/admin/46/templates” for 127.0.0.1 at 2026-06-30 14:24:29 -0300 Processing by TemplatesController#index as HTML

+ +
Parameters: {"admin_id" => "46"}
+Rendering layout layouts/gerenciamento.html.erb
+Rendering templates/index.html.erb within layouts/gerenciamento
+Template Exists? (0.2ms)  SELECT 1 AS one FROM `templates` WHERE `templates`.`usuario_id` = 46 LIMIT 1
+Rendered templates/_grid.html.erb (Duration: 0.4ms | GC: 0.0ms)
+Rendered templates/index.html.erb within layouts/gerenciamento (Duration: 0.4ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 0.6ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.6ms | ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.1ms)

+ +
TRANSACTION (0.4ms)  ROLLBACK
+ActiveRecord::InternalMetadata Load (0.3ms)  SELECT * FROM `ar_internal_metadata` WHERE `ar_internal_metadata`.`key` = 'schema_sha1' ORDER BY `ar_internal_metadata`.`key` ASC LIMIT 1
+ActiveRecord::SchemaMigration Load (0.3ms)  SELECT `schema_migrations`.`version` FROM `schema_migrations` ORDER BY `schema_migrations`.`version` ASC
+
dotenv
+
+

Saved a snapshot of ENV

+
+ +
TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.2ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:01.242242', 'Ciência da Computação', '2026-06-30 17:25:01.242242')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'admin123' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:01.258016', 'Ciência da Computação', '2026-06-30 17:25:01.258016')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'admin123' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+TRANSACTION (0.3ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'admin123' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.1ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:01.262219', 'Ciência da Computação', '2026-06-30 17:25:01.262219')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.3ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 33 LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.2ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.3ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:25:01.266288', 33, 'Engenharia de Software', '2026-06-30 17:25:01.266288')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 23 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.2ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 23 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:25:01.271941', 23, NULL, 'TA', '2026.1', '2026-06-30 17:25:01.271941')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.5ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:25:01.276492', NULL, NULL, NULL, NULL, 23, '2026-06-30 17:25:01.276492')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.6ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:25:01.281434', NULL, 10, 1, NULL, '2026-06-30 17:25:01.281434')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:01.288222', 'Ciência da Computação', '2026-06-30 17:25:01.288222')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 34 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:25:01.289631', 34, 'Engenharia de Software', '2026-06-30 17:25:01.289631')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 24 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.3ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 24 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:25:01.291114', 24, NULL, 'TA', '2026.1', '2026-06-30 17:25:01.291114')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:25:01.291754', NULL, NULL, NULL, NULL, 24, '2026-06-30 17:25:01.291754')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.2ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:25:01.292578', NULL, 11, 1, NULL, '2026-06-30 17:25:01.292578')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.2ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`email` = 'admin_campo@unb.br' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Load (0.4ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_2
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:01.300039', 'Ciência da Computação', '2026-06-30 17:25:01.300039')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_2
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_campo' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin_campo@unb.br' LIMIT 1
+Administrador Create (0.8ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:01.490738', NULL, NULL, NULL, 35, 'admin_campo@unb.br', NULL, 'adm_campo', 'Admin Campo', NULL, NULL, '$2a$12$ZeTSo.WcrbS.DhtICYWD7OkhkDWgtdeLBbk.IX24GEzcpmbZ7IHD2', 'Administrador', '2026-06-30 17:25:01.490738')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Template Create (0.5ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:25:01.496743', 'Template', '2026-06-30 17:25:01.496743', 47)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Elemento Create (0.5ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:25:01.501230', 'Questão 1', 1, 18, '2026-06-30 17:25:01.501230')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Campo Exists? (0.3ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` = 33 LIMIT 1
+TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`email` = 'admin_campo@unb.br' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_2
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:01.508956', 'Ciência da Computação', '2026-06-30 17:25:01.508956')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_2
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_campo' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin_campo@unb.br' LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:01.698053', NULL, NULL, NULL, 36, 'admin_campo@unb.br', NULL, 'adm_campo', 'Admin Campo', NULL, NULL, '$2a$12$uv1XBx/6vdNwrMQQKgj0k.Z6PAGmsgB0HLgvwlOs6Mwo93Zky3Tq6', 'Administrador', '2026-06-30 17:25:01.698053')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Template Create (0.5ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:25:01.699424', 'Template', '2026-06-30 17:25:01.699424', 48)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Elemento Create (0.4ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:25:01.700327', 'Questão 1', 1, 19, '2026-06-30 17:25:01.700327')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Campo Exists? (0.3ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` IS NULL AND `campos`.`elemento_id` = 34 LIMIT 1
+TRANSACTION (1.0ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`email` = 'admin_campo@unb.br' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_2
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:01.705130', 'Ciência da Computação', '2026-06-30 17:25:01.705130')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_2
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_campo' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin_campo@unb.br' LIMIT 1
+Administrador Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:01.899450', NULL, NULL, NULL, 37, 'admin_campo@unb.br', NULL, 'adm_campo', 'Admin Campo', NULL, NULL, '$2a$12$80K1.1KGkmx8Dw85krkdlO7RWWHllwIC7Vh/icSKyu5FfRLko/dhu', 'Administrador', '2026-06-30 17:25:01.899450')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Template Create (0.4ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:25:01.900820', 'Template', '2026-06-30 17:25:01.900820', 49)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Elemento Create (0.4ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:25:01.901660', 'Questão 1', 1, 20, '2026-06-30 17:25:01.901660')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Campo Exists? (0.3ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` = 35 LIMIT 1
+TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Campo Exists? (0.2ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` IS NULL LIMIT 1
+TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`email` = 'admin_campo@unb.br' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_2
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:01.906749', 'Ciência da Computação', '2026-06-30 17:25:01.906749')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_2
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_campo' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin_campo@unb.br' LIMIT 1
+Administrador Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:02.096409', NULL, NULL, NULL, 38, 'admin_campo@unb.br', NULL, 'adm_campo', 'Admin Campo', NULL, NULL, '$2a$12$1IZGm3b52ilIjcTnAUV7/udpfEm62C2PRiIW8nbZh3IA0oG3WwLBa', 'Administrador', '2026-06-30 17:25:02.096409')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Template Create (0.5ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:25:02.097956', 'Template', '2026-06-30 17:25:02.097956', 50)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Elemento Create (0.4ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:25:02.098894', 'Questão 1', 1, 21, '2026-06-30 17:25:02.098894')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Campo Exists? (0.5ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` = 36 LIMIT 1
+Campo Create (0.3ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:25:02.100359', 36, NULL, 1, 'Texto', '2026-06-30 17:25:02.100359')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Campo Exists? (0.2ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` = 36 LIMIT 1
+TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`email` = 'admin_campo@unb.br' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_2
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:02.104067', 'Ciência da Computação', '2026-06-30 17:25:02.104067')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_2
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_campo' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin_campo@unb.br' LIMIT 1
+Administrador Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:02.293077', NULL, NULL, NULL, 39, 'admin_campo@unb.br', NULL, 'adm_campo', 'Admin Campo', NULL, NULL, '$2a$12$WjBKxbzbEN2LYbzJSJ4eWuIK.xSuG.mnTiuiW8eyvhSFvIFraG/fm', 'Administrador', '2026-06-30 17:25:02.293077')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Template Create (0.4ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:25:02.294627', 'Template', '2026-06-30 17:25:02.294627', 51)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Elemento Create (0.4ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:25:02.295464', 'Questão 1', 1, 22, '2026-06-30 17:25:02.295464')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Campo Exists? (0.4ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` = 37 LIMIT 1
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:25:02.296844', 37, NULL, 1, 'Texto', '2026-06-30 17:25:02.296844')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Campo Exists? (0.2ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 2 AND `campos`.`elemento_id` = 37 LIMIT 1
+TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:02.300599', 'Ciência da Computação', '2026-06-30 17:25:02.300599')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Curso Exists? (0.3ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`codigo` = 'ESW' LIMIT 1
+TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.1ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:02.307405', 'Ciência da Computação', '2026-06-30 17:25:02.307405')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Curso Exists? (0.2ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`codigo` = 'ESW' LIMIT 1
+TRANSACTION (0.3ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:02.310150', 'Ciência da Computação', '2026-06-30 17:25:02.310150')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Curso Exists? (0.2ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`codigo` IS NULL LIMIT 1
+TRANSACTION (0.3ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Curso Exists? (0.1ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`codigo` = 'ESW' LIMIT 1
+TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:02.313562', 'Ciência da Computação', '2026-06-30 17:25:02.313562')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Curso Exists? (0.3ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`codigo` = 'ESW' LIMIT 1
+Curso Create (0.2ms)  INSERT INTO `cursos` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('ESW', '2026-06-30 17:25:02.314652', 43, 'ES Original', '2026-06-30 17:25:02.314652')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Curso Exists? (0.2ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`codigo` = 'ESW' LIMIT 1
+TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.1ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:02.317254', 'Ciência da Computação', '2026-06-30 17:25:02.317254')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Curso Exists? (0.2ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`codigo` = 'ESW' LIMIT 1
+Curso Create (0.2ms)  INSERT INTO `cursos` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('ESW', '2026-06-30 17:25:02.317989', 44, 'ES', '2026-06-30 17:25:02.317989')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Curso Exists? (0.2ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`codigo` = 'CC01' LIMIT 1
+TRANSACTION (0.3ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Exists? (0.1ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Exists? (0.1ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Exists? (0.2ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` IS NULL LIMIT 1
+TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.2ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.1ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:02.324487', 'CIC Original', '2026-06-30 17:25:02.324487')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Exists? (0.1ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.2ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.1ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:02.326123', 'CIC', '2026-06-30 17:25:02.326123')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Exists? (0.2ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'MAT' LIMIT 1
+TRANSACTION (0.3ms)  ROLLBACK
+TRANSACTION (0.2ms)  BEGIN
+TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:02.330667', 'Ciência da Computação', '2026-06-30 17:25:02.330667')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Exists? (0.2ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:02.333283', 'Ciência da Computação', '2026-06-30 17:25:02.333283')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Exists? (0.2ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+TRANSACTION (0.3ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:02.335703', 'Ciência da Computação', '2026-06-30 17:25:02.335703')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Exists? (0.2ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` IS NULL LIMIT 1
+TRANSACTION (0.3ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Disciplina Exists? (0.1ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.1ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.2ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.1ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:02.339009', 'Ciência da Computação', '2026-06-30 17:25:02.339009')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:25:02.339959', 50, 'ES Original', '2026-06-30 17:25:02.339959')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Exists? (0.2ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+TRANSACTION (0.6ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.1ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.5ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:02.354972', 'Ciência da Computação', '2026-06-30 17:25:02.354972')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.2ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.1ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:25:02.356617', 51, 'ES', '2026-06-30 17:25:02.356617')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Exists? (0.2ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0098' LIMIT 1
+TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:02.361244', 'Ciência da Computação', '2026-06-30 17:25:02.361244')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 52 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:25:02.362623', 52, 'Engenharia de Software', '2026-06-30 17:25:02.362623')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 27 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.3ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 27 LIMIT 1
+Turma Create (0.3ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:25:02.364141', 27, NULL, 'TA', '2026.1', '2026-06-30 17:25:02.364141')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.5ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:25:02.364830', NULL, NULL, NULL, NULL, 25, '2026-06-30 17:25:02.364830')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:02.367753', 'Ciência da Computação', '2026-06-30 17:25:02.367753')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 53 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:25:02.369065', 53, 'Engenharia de Software', '2026-06-30 17:25:02.369065')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.1ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 28 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.2ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 28 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:25:02.370371', 28, NULL, 'TA', '2026.1', '2026-06-30 17:25:02.370371')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.3ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:25:02.370954', NULL, NULL, NULL, NULL, 26, '2026-06-30 17:25:02.370954')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`email` = 'admin_elem@unb.br' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_2
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:02.376375', 'Ciência da Computação', '2026-06-30 17:25:02.376375')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_2
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_elem' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin_elem@unb.br' LIMIT 1
+Administrador Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:02.565564', NULL, NULL, NULL, 54, 'admin_elem@unb.br', NULL, 'adm_elem', 'Admin Elem', NULL, NULL, '$2a$12$QRuB.IroevmFtUv/05rPbu4hIP8HF.Ak8lIh232mRHILyYDOhJjsy', 'Administrador', '2026-06-30 17:25:02.565564')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Template Create (0.5ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:25:02.566989', 'Template Teste', '2026-06-30 17:25:02.566989', 52)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:02.572989', 'Ciência da Computação', '2026-06-30 17:25:02.572989')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.1ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 55 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.2ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:25:02.574543', 55, 'Engenharia de Software', '2026-06-30 17:25:02.574543')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 29 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.3ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 29 LIMIT 1
+Turma Create (0.1ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:25:02.576279', 29, NULL, 'TA', '2026.1', '2026-06-30 17:25:02.576279')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.3ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:02.579302', 'Ciência da Computação', '2026-06-30 17:25:02.579302')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.3ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 56 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.4ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:25:02.580877', 56, 'Engenharia de Software', '2026-06-30 17:25:02.580877')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 30 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 30 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:25:02.582522', 30, NULL, 'TA', '2026.1', '2026-06-30 17:25:02.582522')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:02.584786', 'Ciência da Computação', '2026-06-30 17:25:02.584786')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 57 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:25:02.586071', 57, 'Engenharia de Software', '2026-06-30 17:25:02.586071')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 31 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.3ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 31 LIMIT 1
+Turma Create (0.1ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:25:02.587488', 31, NULL, 'TA', '2026.1', '2026-06-30 17:25:02.587488')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:02.589989', 'Ciência da Computação', '2026-06-30 17:25:02.589989')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 58 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:25:02.591317', 58, 'Engenharia de Software', '2026-06-30 17:25:02.591317')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 32 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.3ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 32 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:25:02.592747', 32, NULL, 'TA', '2026.1', '2026-06-30 17:25:02.592747')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:25:02.593337', NULL, NULL, NULL, NULL, 30, '2026-06-30 17:25:02.593337')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Docente Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Docente' AND `usuarios`.`email` = 'doc_re@unb.br' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_re001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_re@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:02.786451', NULL, NULL, NULL, NULL, 'doc_re@unb.br', 'Doutorado', 'doc_re001', 'Docente RE', NULL, NULL, '$2a$12$8h.az0B1PCDAx8E5hEePr.oRLVATFjKQJnW492ikNWDSMFluFOYtm', 'Docente', '2026-06-30 17:25:02.786451')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+RespostaForm Exists? (0.5ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 53 AND `resposta_forms`.`formulario_id` = 14 LIMIT 1
+RespostaForm Create (0.3ms)  INSERT INTO `resposta_forms` (`created_at`, `data_submissao`, `formulario_id`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:25:02.792946', '2026-06-30', 14, '2026-06-30 17:25:02.792946', 53)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:25:02.793679', NULL, 14, 1, 'Texto', '2026-06-30 17:25:02.793679')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:02.800587', 'Ciência da Computação', '2026-06-30 17:25:02.800587')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 59 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:25:02.801941', 59, 'Engenharia de Software', '2026-06-30 17:25:02.801941')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 33 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.3ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 33 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:25:02.803422', 33, NULL, 'TA', '2026.1', '2026-06-30 17:25:02.803422')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:25:02.804079', NULL, NULL, NULL, NULL, 31, '2026-06-30 17:25:02.804079')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Docente Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Docente' AND `usuarios`.`email` = 'doc_re@unb.br' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_re001' LIMIT 1
+Usuario Exists? (0.1ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_re@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:02.993989', NULL, NULL, NULL, NULL, 'doc_re@unb.br', 'Doutorado', 'doc_re001', 'Docente RE', NULL, NULL, '$2a$12$9roDAiPN04mNPNuFFDvYNO4ilf9prpAMmurSNcRWx79BvqwrzGGR2', 'Docente', '2026-06-30 17:25:02.993989')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaForm Exists? (0.5ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 54 AND `resposta_forms`.`formulario_id` = 15 LIMIT 1
+RespostaForm Create (0.3ms)  INSERT INTO `resposta_forms` (`created_at`, `data_submissao`, `formulario_id`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:25:02.996022', '2026-06-30', 15, '2026-06-30 17:25:02.996022', 54)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:25:02.996735', NULL, 15, 1, 'Texto', '2026-06-30 17:25:02.996735')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:02.999811', 'Ciência da Computação', '2026-06-30 17:25:02.999811')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 60 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:25:03.001122', 60, 'Engenharia de Software', '2026-06-30 17:25:03.001122')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 34 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.3ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 34 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:25:03.002657', 34, NULL, 'TA', '2026.1', '2026-06-30 17:25:03.002657')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.3ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:25:03.003244', NULL, NULL, NULL, NULL, 32, '2026-06-30 17:25:03.003244')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:25:03.003956', NULL, 16, 1, 'Texto', '2026-06-30 17:25:03.003956')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.3ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.2ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.1ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:03.006814', 'Ciência da Computação', '2026-06-30 17:25:03.006814')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 61 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:25:03.008049', 61, 'Engenharia de Software', '2026-06-30 17:25:03.008049')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 35 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.3ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 35 LIMIT 1
+Turma Create (0.3ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:25:03.009505', 35, NULL, 'TA', '2026.1', '2026-06-30 17:25:03.009505')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.2ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:25:03.010160', NULL, NULL, NULL, NULL, 33, '2026-06-30 17:25:03.010160')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Docente Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Docente' AND `usuarios`.`email` = 'doc_re@unb.br' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_re001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_re@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:03.199893', NULL, NULL, NULL, NULL, 'doc_re@unb.br', 'Doutorado', 'doc_re001', 'Docente RE', NULL, NULL, '$2a$12$OBNQKUrNsDkqQBsWxh7ZF.JWUD94FPE517NaF6eYNiT5ktfwoRJRW', 'Docente', '2026-06-30 17:25:03.199893')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+RespostaForm Exists? (0.5ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 55 AND `resposta_forms`.`formulario_id` = 17 LIMIT 1
+RespostaForm Create (0.3ms)  INSERT INTO `resposta_forms` (`created_at`, `data_submissao`, `formulario_id`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:25:03.202016', '2026-06-30', 17, '2026-06-30 17:25:03.202016', 55)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:03.204855', 'Ciência da Computação', '2026-06-30 17:25:03.204855')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 62 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:25:03.206224', 62, 'Engenharia de Software', '2026-06-30 17:25:03.206224')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 36 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 36 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:25:03.207795', 36, NULL, 'TA', '2026.1', '2026-06-30 17:25:03.207795')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:25:03.208403', NULL, NULL, NULL, NULL, 34, '2026-06-30 17:25:03.208403')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Docente Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Docente' AND `usuarios`.`email` = 'doc_re@unb.br' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_re001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_re@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:03.398174', NULL, NULL, NULL, NULL, 'doc_re@unb.br', 'Doutorado', 'doc_re001', 'Docente RE', NULL, NULL, '$2a$12$DEOL6vNd14yMNU33uiVN/.VMGz41azFahV1BTnKPnwLG.1msvxke6', 'Docente', '2026-06-30 17:25:03.398174')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaForm Exists? (0.5ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 56 AND `resposta_forms`.`formulario_id` = 18 LIMIT 1
+RespostaForm Create (0.3ms)  INSERT INTO `resposta_forms` (`created_at`, `data_submissao`, `formulario_id`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:25:03.400264', '2026-06-30', 18, '2026-06-30 17:25:03.400264', 56)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:25:03.400960', NULL, 18, 1, 'Texto', '2026-06-30 17:25:03.400960')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:03.405929', 'Ciência da Computação', '2026-06-30 17:25:03.405929')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 63 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:25:03.407250', 63, 'Engenharia de Software', '2026-06-30 17:25:03.407250')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 37 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.2ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 37 LIMIT 1
+Turma Create (0.1ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:25:03.408663', 37, NULL, 'TA', '2026.1', '2026-06-30 17:25:03.408663')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.2ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:25:03.409312', NULL, NULL, NULL, NULL, 35, '2026-06-30 17:25:03.409312')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Docente Load (0.1ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Docente' AND `usuarios`.`email` = 'doc_rf@unb.br' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_rf001' LIMIT 1
+Usuario Exists? (0.1ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_rf@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:03.598920', NULL, NULL, NULL, NULL, 'doc_rf@unb.br', 'Doutorado', 'doc_rf001', 'Docente RF', NULL, NULL, '$2a$12$7DX0MKJKeFU01VZj/z0dh.MS13OFAVjh7kQGMLAARv50DCrmaXHIy', 'Docente', '2026-06-30 17:25:03.598920')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+RespostaForm Exists? (0.3ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 57 AND `resposta_forms`.`formulario_id` = 19 LIMIT 1
+TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:03.603298', 'Ciência da Computação', '2026-06-30 17:25:03.603298')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 64 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:25:03.604713', 64, 'Engenharia de Software', '2026-06-30 17:25:03.604713')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 38 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 38 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:25:03.606165', 38, NULL, 'TA', '2026.1', '2026-06-30 17:25:03.606165')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:25:03.606758', NULL, NULL, NULL, NULL, 36, '2026-06-30 17:25:03.606758')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Docente Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Docente' AND `usuarios`.`email` = 'doc_rf@unb.br' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_rf001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_rf@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:03.796581', NULL, NULL, NULL, NULL, 'doc_rf@unb.br', 'Doutorado', 'doc_rf001', 'Docente RF', NULL, NULL, '$2a$12$X1K39DrQR5SyPXYZPop/GOrzF3iWjfzPZyiyEpxZhWooA1lUDNOPq', 'Docente', '2026-06-30 17:25:03.796581')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+RespostaForm Exists? (0.3ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 58 AND `resposta_forms`.`formulario_id` = 20 LIMIT 1
+TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Docente Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Docente' AND `usuarios`.`email` = 'doc_rf@unb.br' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_rf001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_rf@unb.br' LIMIT 1
+Docente Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:03.989661', NULL, NULL, NULL, NULL, 'doc_rf@unb.br', 'Doutorado', 'doc_rf001', 'Docente RF', NULL, NULL, '$2a$12$XSCtv3vwvKzzFkVYWJPi..jEzepicVQiHtrnLEDOrcLGPZKoJ3eaG', 'Docente', '2026-06-30 17:25:03.989661')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+RespostaForm Exists? (0.2ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 59 AND `resposta_forms`.`formulario_id` IS NULL LIMIT 1
+TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:03.993986', 'Ciência da Computação', '2026-06-30 17:25:03.993986')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 65 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:25:03.995451', 65, 'Engenharia de Software', '2026-06-30 17:25:03.995451')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 39 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 39 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:25:03.997000', 39, NULL, 'TA', '2026.1', '2026-06-30 17:25:03.997000')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:25:03.997607', NULL, NULL, NULL, NULL, 37, '2026-06-30 17:25:03.997607')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+RespostaForm Exists? (0.1ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` IS NULL AND `resposta_forms`.`formulario_id` = 21 LIMIT 1
+TRANSACTION (0.2ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:04.000359', 'Ciência da Computação', '2026-06-30 17:25:04.000359')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 66 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.6ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:25:04.001954', 66, 'Engenharia de Software', '2026-06-30 17:25:04.001954')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 40 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.3ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 40 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:25:04.003364', 40, NULL, 'TA', '2026.1', '2026-06-30 17:25:04.003364')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:25:04.003970', NULL, NULL, NULL, NULL, 38, '2026-06-30 17:25:04.003970')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Docente Load (0.1ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Docente' AND `usuarios`.`email` = 'doc_rf@unb.br' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_rf001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_rf@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:04.193507', NULL, NULL, NULL, NULL, 'doc_rf@unb.br', 'Doutorado', 'doc_rf001', 'Docente RF', NULL, NULL, '$2a$12$mDEVC7JYiTgHIkG7B8ZPduoKIxvD2UYFjoaDLPUMCjHg8YcfL0TJG', 'Docente', '2026-06-30 17:25:04.193507')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+RespostaForm Exists? (0.5ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 60 AND `resposta_forms`.`formulario_id` = 22 LIMIT 1
+RespostaForm Create (0.3ms)  INSERT INTO `resposta_forms` (`created_at`, `data_submissao`, `formulario_id`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:25:04.195655', '2026-06-30', 22, '2026-06-30 17:25:04.195655', 60)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+RespostaForm Exists? (0.3ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 60 AND `resposta_forms`.`formulario_id` = 22 LIMIT 1
+TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Docente Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Docente' AND `usuarios`.`email` = 'doc2_rf@unb.br' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc2_rf' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc2_rf@unb.br' LIMIT 1
+Docente Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:04.387581', NULL, NULL, NULL, NULL, 'doc2_rf@unb.br', 'Mestrado', 'doc2_rf', 'Docente 2', NULL, NULL, '$2a$12$.GUukyc36g34/X.1tJPD4OyuSItrdwFaAp4e9rVRYdtvVW9ULrVb2', 'Docente', '2026-06-30 17:25:04.387581')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:04.390221', 'Ciência da Computação', '2026-06-30 17:25:04.390221')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 67 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.4ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:25:04.391766', 67, 'Engenharia de Software', '2026-06-30 17:25:04.391766')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 41 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 41 LIMIT 1
+Turma Create (0.3ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:25:04.393346', 41, NULL, 'TA', '2026.1', '2026-06-30 17:25:04.393346')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:25:04.394032', NULL, NULL, NULL, NULL, 39, '2026-06-30 17:25:04.394032')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Docente Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Docente' AND `usuarios`.`email` = 'doc_rf@unb.br' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_rf001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_rf@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:04.583416', NULL, NULL, NULL, NULL, 'doc_rf@unb.br', 'Doutorado', 'doc_rf001', 'Docente RF', NULL, NULL, '$2a$12$xqfRt/Kwdwkk/CfcrYBxa.iTdit4s2H20H7v2J1PS0P9hOD5QRjUK', 'Docente', '2026-06-30 17:25:04.583416')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaForm Exists? (0.5ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 62 AND `resposta_forms`.`formulario_id` = 23 LIMIT 1
+RespostaForm Create (0.3ms)  INSERT INTO `resposta_forms` (`created_at`, `data_submissao`, `formulario_id`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:25:04.585066', '2026-06-30', 23, '2026-06-30 17:25:04.585066', 62)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+RespostaForm Exists? (0.2ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 61 AND `resposta_forms`.`formulario_id` = 23 LIMIT 1
+TRANSACTION (1.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.2ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`email` = 'admin_template@unb.br' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_2
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:04.592296', 'Ciência da Computação', '2026-06-30 17:25:04.592296')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_2
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '78910' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin_template@unb.br' LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:04.781617', NULL, NULL, NULL, 68, 'admin_template@unb.br', NULL, '78910', 'Admin Template', NULL, NULL, '$2a$12$35iuPzbfrA8ih9hMTI4wNOtCoUfgDCLg9iSyuTqptVz9NR1EPX.2a', 'Administrador', '2026-06-30 17:25:04.781617')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`email` = 'admin_template@unb.br' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_2
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:04.788046', 'Ciência da Computação', '2026-06-30 17:25:04.788046')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_2
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '78910' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin_template@unb.br' LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:04.977270', NULL, NULL, NULL, 69, 'admin_template@unb.br', NULL, '78910', 'Admin Template', NULL, NULL, '$2a$12$kkrxqxiOBX2sHO2V8pkgROe77/6B3f5wfiZJdNgQcP71vkylYq3z2', 'Administrador', '2026-06-30 17:25:04.977270')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`email` = 'admin_template@unb.br' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_2
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:04.982820', 'Ciência da Computação', '2026-06-30 17:25:04.982820')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_2
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '78910' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin_template@unb.br' LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:05.172042', NULL, NULL, NULL, 70, 'admin_template@unb.br', NULL, '78910', 'Admin Template', NULL, NULL, '$2a$12$yLEKCdSS4C2h33ba3br6sOIMLfhRxEfiv4oQvgcQ5xxsLP0Yu78uS', 'Administrador', '2026-06-30 17:25:05.172042')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`email` = 'admin_template@unb.br' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Load (0.4ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_2
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:05.176646', 'Ciência da Computação', '2026-06-30 17:25:05.176646')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_2
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '78910' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin_template@unb.br' LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:05.367062', NULL, NULL, NULL, 71, 'admin_template@unb.br', NULL, '78910', 'Admin Template', NULL, NULL, '$2a$12$SlKAUgB2HzZdYXC6QQ61yu9MajONBYG4KqQtkOKKKghrDEnKuShBi', 'Administrador', '2026-06-30 17:25:05.367062')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`email` = 'admin_template@unb.br' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Load (0.6ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_2
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:05.373700', 'Ciência da Computação', '2026-06-30 17:25:05.373700')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_2
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '78910' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin_template@unb.br' LIMIT 1
+Administrador Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:05.563150', NULL, NULL, NULL, 72, 'admin_template@unb.br', NULL, '78910', 'Admin Template', NULL, NULL, '$2a$12$l3/x4hUYJ7rt6a8MnGyL4uZ2BeoyQcZGPQZ0zierKwsWYS6zo0TR6', 'Administrador', '2026-06-30 17:25:05.563150')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Campo Exists? (0.2ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` IS NULL LIMIT 1
+TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:05.568963', 'Ciência da Computação', '2026-06-30 17:25:05.568963')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 73 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.5ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:25:05.570715', 73, 'Engenharia de Software', '2026-06-30 17:25:05.570715')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Exists? (0.2ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 42 LIMIT 1
+TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.5ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.1ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:05.574403', 'Ciência da Computação', '2026-06-30 17:25:05.574403')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.1ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 74 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:25:05.575814', 74, 'Engenharia de Software', '2026-06-30 17:25:05.575814')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Exists? (0.2ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` IS NULL AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 43 LIMIT 1
+TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:05.579848', 'Ciência da Computação', '2026-06-30 17:25:05.579848')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 75 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:25:05.581780', 75, 'Engenharia de Software', '2026-06-30 17:25:05.581780')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Exists? (0.2ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` IS NULL AND `turmas`.`disciplina_id` = 44 LIMIT 1
+TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Turma Exists? (0.2ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` IS NULL LIMIT 1
+TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:05.587268', 'Ciência da Computação', '2026-06-30 17:25:05.587268')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.1ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 76 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.1ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:25:05.589459', 76, 'Engenharia de Software', '2026-06-30 17:25:05.589459')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 45 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:25:05.590794', 45, NULL, 'TA', '2026.1', '2026-06-30 17:25:05.590794')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Exists? (0.2ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 45 LIMIT 1
+TRANSACTION (0.3ms)  ROLLBACK
+TRANSACTION (0.2ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:05.595132', 'Ciência da Computação', '2026-06-30 17:25:05.595132')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.3ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 77 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:25:05.597165', 77, 'Engenharia de Software', '2026-06-30 17:25:05.597165')
+TRANSACTION (0.3ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 46 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:25:05.598990', 46, NULL, 'TA', '2026.1', '2026-06-30 17:25:05.598990')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Exists? (0.2ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.2' AND `turmas`.`disciplina_id` = 46 LIMIT 1
+TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:05.602750', 'Ciência da Computação', '2026-06-30 17:25:05.602750')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 78 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.1ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:25:05.604736', 78, 'Engenharia de Software', '2026-06-30 17:25:05.604736')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.2ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 47 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:25:05.605931', 47, NULL, 'TA', '2026.1', '2026-06-30 17:25:05.605931')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Exists? (0.1ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TB' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 47 LIMIT 1
+TRANSACTION (0.2ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.1ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` IS NULL LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` IS NULL LIMIT 1
+TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:05.811460', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Professor Teste', NULL, NULL, '$2a$12$JW3BIAlNha.lZbpGXYqBvep6iZJcOiEFjxXRKQZmXoNbADsQYW1yi', 'Docente', '2026-06-30 17:25:05.811460')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'outro@unb.br' LIMIT 1
+TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:06.004631', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Professor Teste', NULL, NULL, '$2a$12$xQs7gYhfpKWtyyIJQvnmeuqgzLczlRTCQsR.A2vj7J8H18hNhUJLS', 'Docente', '2026-06-30 17:25:06.004631')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc002' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:06.203990', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Professor Teste', NULL, NULL, '$2a$12$H7CJL0f27T9YOxtiPO6ZK.F5xwVr7QrqijejERVba7Zcy/gaq5Py.', 'Docente', '2026-06-30 17:25:06.203990')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.3ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.6ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:06.397704', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Professor Teste', NULL, NULL, '$2a$12$rFtLs6PCD5bh53dc.MZCvO20FecCaRAgRcBMbjFJSJBQiMezg305i', 'Docente', '2026-06-30 17:25:06.397704')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.9ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.9ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:06.778969', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Professor Teste', NULL, NULL, '$2a$12$eo8tZHWzHm6Fbva7eoQQT.szGNhchOTNNRyltFmVnMqRI8oaRHISS', 'Docente', '2026-06-30 17:25:06.778969')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.6ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:07.159274', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Professor Teste', NULL, NULL, '$2a$12$b09YMnKqjdee.ugtdiaRludXkFAPPxdQJwO/IivOcDYVutJe0zCq6', 'Docente', '2026-06-30 17:25:07.159274')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (1.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:07.352887', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Professor Teste', NULL, NULL, '$2a$12$4qOiJs8iuraEe.0b8LsjwO6ksLNT1Lg7qD/Uck1iu/EkjP3OFSKmi', 'Docente', '2026-06-30 17:25:07.352887')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' AND `usuarios`.`id` != 74 LIMIT 1
+Docente Update (0.7ms)  UPDATE `usuarios` SET `usuarios`.`definicao_senha_sent_at` = '2026-06-30 17:25:07.354299', `usuarios`.`definicao_senha_token` = 'K2EwgcMYfKq9PjqlrGq1xCV8cIihpU9t0SiT3GZGw-o', `usuarios`.`senha_hash` = '$2a$12$cXgo.sEtKFoHdEXkPGA1I.h8PpE45VV8L3dVUnO76Ont0c8UCjksm', `usuarios`.`updated_at` = '2026-06-30 17:25:07.544675' WHERE `usuarios`.`id` = 74
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:07.736690', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Professor Teste', NULL, NULL, '$2a$12$TPJfOyNvjqFlO5Rvuh4zIeDDO4pCuNy9biSymXr7ft6rlpQJQBQWi', 'Docente', '2026-06-30 17:25:07.736690')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.5ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' AND `usuarios`.`id` != 75 LIMIT 1
+Docente Update (0.8ms)  UPDATE `usuarios` SET `usuarios`.`definicao_senha_sent_at` = '2026-06-30 17:25:07.737960', `usuarios`.`definicao_senha_token` = 'Q0a4aCc1dbYxNFwXY-3BZovvKMyqwFlG4gULgbP-neE', `usuarios`.`senha_hash` = '$2a$12$IzpcFpyU4JZ5t88lCLZNauR9G/lBVUgOloCm7Pwd4K0HacjlQZ2l2', `usuarios`.`updated_at` = '2026-06-30 17:25:07.926198' WHERE `usuarios`.`id` = 75
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (1.3ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:08.118910', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Professor Teste', NULL, NULL, '$2a$12$aofMO7DnAfXXxO8YdMC6ZODGAAp40LVSIQ/ePLTOwInoe4iAOMS9K', 'Docente', '2026-06-30 17:25:08.118910')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.5ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' AND `usuarios`.`id` != 76 LIMIT 1
+Docente Update (0.7ms)  UPDATE `usuarios` SET `usuarios`.`definicao_senha_sent_at` = '2026-06-30 17:25:08.120239', `usuarios`.`definicao_senha_token` = 'tXe211thoQl9bipvNs7ywX9EIeaaTWo4UbNBwcBcXYA', `usuarios`.`senha_hash` = '$2a$12$v7P4lYuLVTktV5Dx5EuryuCHqsO7ja3IhD1FXkPK7weXaRFBcNYKi', `usuarios`.`updated_at` = '2026-06-30 17:25:08.309031' WHERE `usuarios`.`id` = 76
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.5ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' AND `usuarios`.`id` != 76 LIMIT 1
+Docente Update (0.5ms)  UPDATE `usuarios` SET `usuarios`.`definicao_senha_sent_at` = NULL, `usuarios`.`definicao_senha_token` = NULL, `usuarios`.`senha_hash` = '$2a$12$BznYCBrRL7Ghn4zwwen62OEDofQ9yfMZ14h9pxy5gd1jDemwX.m8a', `usuarios`.`updated_at` = '2026-06-30 17:25:08.498314' WHERE `usuarios`.`id` = 76
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:08.689960', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Professor Teste', NULL, NULL, '$2a$12$IASXRAw./PVKKa//vVC2K.C75o4SFjq36ypys7OwaX0ukVnyxlLcW', 'Docente', '2026-06-30 17:25:08.689960')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.5ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' AND `usuarios`.`id` != 77 LIMIT 1
+Docente Update (0.5ms)  UPDATE `usuarios` SET `usuarios`.`definicao_senha_sent_at` = '2026-06-30 17:25:08.691119', `usuarios`.`definicao_senha_token` = '9DS19zKWeHqpI9IDxVweU5PqBO5a1stSZjLtTBfgrWE', `usuarios`.`senha_hash` = '$2a$12$RFDFY5sghIMnzu4HZR1pQukhEOZcbJu/cNsc2FQG62JjvES7Tv7Py', `usuarios`.`updated_at` = '2026-06-30 17:25:08.879378' WHERE `usuarios`.`id` = 77
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.5ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' AND `usuarios`.`id` != 77 LIMIT 1
+Docente Update (0.5ms)  UPDATE `usuarios` SET `usuarios`.`definicao_senha_sent_at` = NULL, `usuarios`.`definicao_senha_token` = NULL, `usuarios`.`senha_hash` = '$2a$12$wmW5QLw1qlK/ow2xuRZmcu/WnWAsYVFf6yoN38P439EA/vaxfbInq', `usuarios`.`updated_at` = '2026-06-30 17:25:09.068580' WHERE `usuarios`.`id` = 77
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.9ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:09.260374', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Professor Teste', NULL, NULL, '$2a$12$IdxZWFrMZGv4dDsRUBogO.e0pWIy3R/Clk3SluRNxH7xrXQdlZEpW', 'Docente', '2026-06-30 17:25:09.260374')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.5ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' AND `usuarios`.`id` != 78 LIMIT 1
+Docente Update (0.8ms)  UPDATE `usuarios` SET `usuarios`.`redefinicao_senha_sent_at` = '2026-06-30 17:25:09.261697', `usuarios`.`redefinicao_senha_token` = 'nHy_utSyjgVpYQMWUz7uATyR4xvjq3H1x88YMMVWG9g', `usuarios`.`senha_hash` = '$2a$12$8iERe3FECs/AFnJCPlhkWezqaxcURbPwiEnPnZB13R8YGgoHTYJ4K', `usuarios`.`updated_at` = '2026-06-30 17:25:09.449876' WHERE `usuarios`.`id` = 78
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.9ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:09.642299', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Professor Teste', NULL, NULL, '$2a$12$Vg/xosfsC6XiVEzok336hOAhN.DokYvtr.HVqtkTDznlV9pCF9Q4K', 'Docente', '2026-06-30 17:25:09.642299')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.5ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' AND `usuarios`.`id` != 79 LIMIT 1
+Docente Update (0.7ms)  UPDATE `usuarios` SET `usuarios`.`redefinicao_senha_sent_at` = '2026-06-30 17:25:09.643597', `usuarios`.`redefinicao_senha_token` = 'r0kfwyAE-OvlcSC4npmC2fCjzebqH9bgAlPhSg7ITm8', `usuarios`.`senha_hash` = '$2a$12$84lOkoaH/xa2wGcgU8dkO.98V1vcqO5X6gyHAlvTbUOjbBVOlGDYS', `usuarios`.`updated_at` = '2026-06-30 17:25:09.832273' WHERE `usuarios`.`id` = 79
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:10.024479', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Professor Teste', NULL, NULL, '$2a$12$qaLyk4ytjqaAAV3Vwi9Sx.A7i0q0w5vjd3aEkalJqRecZVRWlndzu', 'Docente', '2026-06-30 17:25:10.024479')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.5ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' AND `usuarios`.`id` != 80 LIMIT 1
+Docente Update (0.6ms)  UPDATE `usuarios` SET `usuarios`.`redefinicao_senha_sent_at` = '2026-06-30 17:25:10.025958', `usuarios`.`redefinicao_senha_token` = 'mIKWfQB5Up5-hBTAA9QSrLCc0MCia-F1Ez73VeA1DcY', `usuarios`.`senha_hash` = '$2a$12$P2HLLOmVkRyEX2WlulxZveFmRax.ChkWsCGumSezFE97cE0g.KA1.', `usuarios`.`updated_at` = '2026-06-30 17:25:10.215017' WHERE `usuarios`.`id` = 80
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.5ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' AND `usuarios`.`id` != 80 LIMIT 1
+Docente Update (0.6ms)  UPDATE `usuarios` SET `usuarios`.`redefinicao_senha_sent_at` = NULL, `usuarios`.`redefinicao_senha_token` = NULL, `usuarios`.`senha_hash` = '$2a$12$StzpuZJWxLA8Krx6KKqSzujHq99JjVLeRtEOjiwrFojaISEZjsZX6', `usuarios`.`updated_at` = '2026-06-30 17:25:10.405048' WHERE `usuarios`.`id` = 80
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.6ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:10.598177', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Professor Teste', NULL, NULL, '$2a$12$6LrpfXIpNb4DTl8aML6DH.5j9ClLnlTSTJ2pIWcDVxGSksLB6Ffry', 'Docente', '2026-06-30 17:25:10.598177')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.5ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' AND `usuarios`.`id` != 81 LIMIT 1
+Docente Update (0.6ms)  UPDATE `usuarios` SET `usuarios`.`redefinicao_senha_sent_at` = '2026-06-30 17:25:10.599368', `usuarios`.`redefinicao_senha_token` = '2wMnczTaQLneW_ERPCk7KSqqOgOHaT2ZQUzBO__0YKE', `usuarios`.`senha_hash` = '$2a$12$FJFcAxgjcOiTd9.BUVLw/eiMRLdpfFzqUxmbGhJbl3GTs5T00arF6', `usuarios`.`updated_at` = '2026-06-30 17:25:10.788046' WHERE `usuarios`.`id` = 81
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.7ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' AND `usuarios`.`id` != 81 LIMIT 1
+Docente Update (0.6ms)  UPDATE `usuarios` SET `usuarios`.`redefinicao_senha_sent_at` = NULL, `usuarios`.`redefinicao_senha_token` = NULL, `usuarios`.`senha_hash` = '$2a$12$pnZUiSPzSMVesaP/dECNTOKMobeFhRX3md9t2NBCw/T6gJjhcXXyC', `usuarios`.`updated_at` = '2026-06-30 17:25:10.979346' WHERE `usuarios`.`id` = 81
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:10.983280', 'Ciência da Computação', '2026-06-30 17:25:10.983280')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_admin' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:11.173209', NULL, NULL, NULL, 79, 'admin_ctrl@unb.br', NULL, 'adm_admin', 'Admin Teste', NULL, NULL, '$2a$12$eMEKp2zQWjCwHFMX3BMkneoxGbbeAjpYzJy26MpVKDO58jz8XL5DK', 'Administrador', '2026-06-30 17:25:11.173209')
+TRANSACTION (0.4ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:11 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin_ctrl@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/82/avaliacoes Completed 302 Found in 214ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.1ms) Started GET “/admin/82/avaliacoes” for 127.0.0.1 at 2026-06-30 14:25:11 -0300 Processing by AdminController#avaliacoes as HTML

+ +
Parameters: {"admin_id" => "82"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 82 LIMIT 1
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 82 LIMIT 1
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/avaliacoes.html.erb within layouts/gerenciamento
+Formulario Load (0.3ms)  SELECT `formularios`.* FROM `formularios` INNER JOIN `turmas` ON `turmas`.`id` = `formularios`.`turma_id`
+Rendered admin/avaliacoes.html.erb within layouts/gerenciamento (Duration: 2.6ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 4.8ms | GC: 0.0ms)
+ +

Completed 200 OK in 10ms (Views: 5.9ms | ActiveRecord: 0.9ms (3 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:11.429917', 'Ciência da Computação', '2026-06-30 17:25:11.429917')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_admin' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+Administrador Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:11.620761', NULL, NULL, NULL, 80, 'admin_ctrl@unb.br', NULL, 'adm_admin', 'Admin Teste', NULL, NULL, '$2a$12$RNfKcHezlHukjOmQdMdbdeFVlu46smKa9bmnjkQ.mEcjm2l90r6Uu', 'Administrador', '2026-06-30 17:25:11.620761')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:11 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin_ctrl@unb.br", "senha" => "Senha123"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/83/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/admin/83/gerenciamento” for 127.0.0.1 at 2026-06-30 14:25:11 -0300 Processing by AdminController#gerenciamento as HTML

+ +
Parameters: {"admin_id" => "83"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 83 LIMIT 1
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 83 LIMIT 1
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/gerenciamento.html.erb within layouts/gerenciamento
+Rendered admin/gerenciamento.html.erb within layouts/gerenciamento (Duration: 0.3ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 0.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 2ms (Views: 0.6ms | ActiveRecord: 0.7ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:11.817047', 'Ciência da Computação', '2026-06-30 17:25:11.817047')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_admin' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+Administrador Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:12.006676', NULL, NULL, NULL, 81, 'admin_ctrl@unb.br', NULL, 'adm_admin', 'Admin Teste', NULL, NULL, '$2a$12$XGEN6Lqdw.RAdposrJLwHux00gcq2jOXxQ6OkYXJf.aNjVNRO6hCe', 'Administrador', '2026-06-30 17:25:12.006676')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:12 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin_ctrl@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/84/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.6ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_outro' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'outro_admin@unb.br' LIMIT 1
+Administrador Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:12.387114', NULL, NULL, NULL, 81, 'outro_admin@unb.br', NULL, 'adm_outro', 'Outro Admin', NULL, NULL, '$2a$12$JLi6QFUsp/Oq4H.oIGX0MucPjlRu7DRvi/cOrwVnLymdxycKuUo.S', 'Administrador', '2026-06-30 17:25:12.387114')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/admin/85/gerenciamento” for 127.0.0.1 at 2026-06-30 14:25:12 -0300 Processing by AdminController#gerenciamento as HTML

+ +
Parameters: {"admin_id" => "85"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 84 LIMIT 1
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 85 LIMIT 1
+ +

Redirected to www.example.com/inicio Filter chain halted as :set_admin rendered or redirected Completed 302 Found in 1ms (ActiveRecord: 0.6ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:12.393734', 'Ciência da Computação', '2026-06-30 17:25:12.393734')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_admin' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+Administrador Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:12.582990', NULL, NULL, NULL, 82, 'admin_ctrl@unb.br', NULL, 'adm_admin', 'Admin Teste', NULL, NULL, '$2a$12$EIqh3BSs4reaFy3k7OS77usWdCh0pGOV.KwL70vaWyQ.ngYmbfrDC', 'Administrador', '2026-06-30 17:25:12.582990')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:12 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin_ctrl@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/86/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/admin/86/enviar_formularios” for 127.0.0.1 at 2026-06-30 14:25:12 -0300 Processing by AdminController#enviar_formularios as HTML

+ +
Parameters: {"admin_id" => "86"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 86 LIMIT 1
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 86 LIMIT 1
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/enviar_formularios.html.erb within layouts/gerenciamento
+Template Load (0.3ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`usuario_id` = 86
+Turma Eager Load (0.4ms)  SELECT `turmas`.`id` AS t0_r0, `turmas`.`created_at` AS t0_r1, `turmas`.`disciplina_id` AS t0_r2, `turmas`.`horario` AS t0_r3, `turmas`.`numero_da_turma` AS t0_r4, `turmas`.`semestre` AS t0_r5, `turmas`.`updated_at` AS t0_r6, `disciplinas`.`id` AS t1_r0, `disciplinas`.`codigo` AS t1_r1, `disciplinas`.`created_at` AS t1_r2, `disciplinas`.`departamento_id` AS t1_r3, `disciplinas`.`nome` AS t1_r4, `disciplinas`.`updated_at` AS t1_r5 FROM `turmas` INNER JOIN `disciplinas` ON `disciplinas`.`id` = `turmas`.`disciplina_id` ORDER BY disciplinas.nome, turmas.semestre
+Rendered admin/enviar_formularios.html.erb within layouts/gerenciamento (Duration: 1.7ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 1.8ms | GC: 0.0ms)
+ +

Completed 200 OK in 4ms (Views: 1.3ms | ActiveRecord: 1.3ms (4 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:12.780864', 'Ciência da Computação', '2026-06-30 17:25:12.780864')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_admin' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+Administrador Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:12.970373', NULL, NULL, NULL, 83, 'admin_ctrl@unb.br', NULL, 'adm_admin', 'Admin Teste', NULL, NULL, '$2a$12$C4/nXcHCf6ATDBDj4IO9mu7JM6KjFRVfO.Yii2Xh3IyYwr9vtEPHG', 'Administrador', '2026-06-30 17:25:12.970373')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:12 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin_ctrl@unb.br", "senha" => "Senha123"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/87/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Disciplina Load (0.4ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'ES' AND `disciplinas`.`codigo` = 'CIC001A' AND `disciplinas`.`departamento_id` = 83 LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.5ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC001A' LIMIT 1
+Disciplina Create (0.4ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC001A', '2026-06-30 17:25:13.162682', 83, 'ES', '2026-06-30 17:25:13.162682')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 48 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 48 LIMIT 1
+Turma Create (0.3ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:25:13.164714', 48, NULL, 'TA', '2026.1', '2026-06-30 17:25:13.164714')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Administrador Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 87 LIMIT 1
+Template Create (0.2ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:25:13.166781', 'Template Ctrl', '2026-06-30 17:25:13.166781', 87)
+Elemento Create (0.2ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:25:13.167196', 'Questão 1', 1, 24, '2026-06-30 17:25:13.167196')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/admin/87/enviar_formularios” for 127.0.0.1 at 2026-06-30 14:25:13 -0300 Processing by AdminController#enviar_formularios as HTML

+ +
Parameters: {"template_id" => nil, "turma_ids" => ["43"], "admin_id" => "87"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 87 LIMIT 1
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 87 LIMIT 1
+ +

Redirected to www.example.com/admin/87/enviar_formularios Completed 302 Found in 1ms (ActiveRecord: 0.4ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:13.171693', 'Ciência da Computação', '2026-06-30 17:25:13.171693')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_admin' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:13.360975', NULL, NULL, NULL, 84, 'admin_ctrl@unb.br', NULL, 'adm_admin', 'Admin Teste', NULL, NULL, '$2a$12$FM4lBW7qElTHmGbEFYg46edCYjSISYlJxjQtNex7h6ZmggxFKJfs.', 'Administrador', '2026-06-30 17:25:13.360975')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:13 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin_ctrl@unb.br", "senha" => "Senha123"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/88/avaliacoes Completed 302 Found in 190ms (ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Disciplina Load (0.4ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'ES' AND `disciplinas`.`codigo` = 'CIC001A' AND `disciplinas`.`departamento_id` = 84 LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.4ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC001A' LIMIT 1
+Disciplina Create (0.3ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC001A', '2026-06-30 17:25:13.555066', 84, 'ES', '2026-06-30 17:25:13.555066')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 49 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 49 LIMIT 1
+Turma Create (0.3ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:25:13.557064', 49, NULL, 'TA', '2026.1', '2026-06-30 17:25:13.557064')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Administrador Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 88 LIMIT 1
+Template Create (0.3ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:25:13.558942', 'Template Ctrl', '2026-06-30 17:25:13.558942', 88)
+Elemento Create (0.2ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:25:13.559378', 'Questão 1', 1, 25, '2026-06-30 17:25:13.559378')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/admin/88/enviar_formularios” for 127.0.0.1 at 2026-06-30 14:25:13 -0300 Processing by AdminController#enviar_formularios as HTML

+ +
Parameters: {"template_id" => "25", "turma_ids" => nil, "admin_id" => "88"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 88 LIMIT 1
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 88 LIMIT 1
+ +

Redirected to www.example.com/admin/88/enviar_formularios Completed 302 Found in 1ms (ActiveRecord: 0.5ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:13.563759', 'Ciência da Computação', '2026-06-30 17:25:13.563759')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_admin' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+Administrador Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:13.755967', NULL, NULL, NULL, 85, 'admin_ctrl@unb.br', NULL, 'adm_admin', 'Admin Teste', NULL, NULL, '$2a$12$0z3RSry9.Pufy/GqJC8qweQjhlwFBxNx5pVcDsvzuBjf2dW.hLSvO', 'Administrador', '2026-06-30 17:25:13.755967')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:13 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin_ctrl@unb.br", "senha" => "Senha123"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/89/avaliacoes Completed 302 Found in 190ms (ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Disciplina Load (0.4ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'ES' AND `disciplinas`.`codigo` = 'CIC001A' AND `disciplinas`.`departamento_id` = 85 LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.4ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC001A' LIMIT 1
+Disciplina Create (0.3ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC001A', '2026-06-30 17:25:13.950267', 85, 'ES', '2026-06-30 17:25:13.950267')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 50 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 50 LIMIT 1
+Turma Create (0.3ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:25:13.952250', 50, NULL, 'TA', '2026.1', '2026-06-30 17:25:13.952250')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Administrador Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 89 LIMIT 1
+Template Create (0.2ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:25:13.954051', 'Template Ctrl', '2026-06-30 17:25:13.954051', 89)
+Elemento Create (0.3ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:25:13.954453', 'Questão 1', 1, 26, '2026-06-30 17:25:13.954453')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Formulario Count (0.2ms)  SELECT COUNT(*) FROM `formularios`
+ +

Started POST “/admin/89/enviar_formularios” for 127.0.0.1 at 2026-06-30 14:25:13 -0300 Processing by AdminController#enviar_formularios as HTML

+ +
Parameters: {"template_id" => "26", "turma_ids" => ["45"], "admin_id" => "89"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 89 LIMIT 1
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 89 LIMIT 1
+Template Load (0.2ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`id` = 26 LIMIT 1
+Elemento Load (0.2ms)  SELECT `elementos`.* FROM `elementos` WHERE `elementos`.`template_id` = 26
+Campo Load (0.2ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` = 40
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`id` = 45
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`id` = 50 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:25:13.961539', NULL, NULL, NULL, 'ES - 2026.1', 45, '2026-06-30 17:25:13.961539')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:25:13.962774', 'Questão 1', 24, 1, 'Texto', '2026-06-30 17:25:13.962774')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/admin/89/gerenciamento Completed 302 Found in 6ms (ActiveRecord: 2.5ms (9 queries, 0 cached) | GC: 0.0ms)

+ +
Formulario Count (0.2ms)  SELECT COUNT(*) FROM `formularios`
+TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:13.974721', 'Ciência da Computação', '2026-06-30 17:25:13.974721')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_admin' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:14.163863', NULL, NULL, NULL, 86, 'admin_ctrl@unb.br', NULL, 'adm_admin', 'Admin Teste', NULL, NULL, '$2a$12$PXtgHkiEYWrANKPxFeGgreDK.ODTR4aPIFZ3VsaZ8jE4Co0MENgv.', 'Administrador', '2026-06-30 17:25:14.163863')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:14 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin_ctrl@unb.br", "senha" => "Senha123"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/90/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Disciplina Load (0.4ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'ES' AND `disciplinas`.`codigo` = 'CIC001A' AND `disciplinas`.`departamento_id` = 86 LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.4ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC001A' LIMIT 1
+Disciplina Create (0.3ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC001A', '2026-06-30 17:25:14.356170', 86, 'ES', '2026-06-30 17:25:14.356170')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 51 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 51 LIMIT 1
+Turma Create (0.3ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:25:14.358412', 51, NULL, 'TA', '2026.1', '2026-06-30 17:25:14.358412')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Administrador Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 90 LIMIT 1
+Template Create (0.2ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:25:14.360249', 'Template Ctrl', '2026-06-30 17:25:14.360249', 90)
+Elemento Create (0.2ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:25:14.360650', 'Questão 1', 1, 27, '2026-06-30 17:25:14.360650')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TB' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 51 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:25:14.361853', 51, NULL, 'TB', '2026.1', '2026-06-30 17:25:14.361853')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Formulario Count (0.2ms)  SELECT COUNT(*) FROM `formularios`
+ +

Started POST “/admin/90/enviar_formularios” for 127.0.0.1 at 2026-06-30 14:25:14 -0300 Processing by AdminController#enviar_formularios as HTML

+ +
Parameters: {"template_id" => "27", "turma_ids" => ["46", "47"], "admin_id" => "90"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 90 LIMIT 1
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 90 LIMIT 1
+Template Load (0.2ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`id` = 27 LIMIT 1
+Elemento Load (0.2ms)  SELECT `elementos`.* FROM `elementos` WHERE `elementos`.`template_id` = 27
+Campo Load (0.2ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` = 41
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`id` IN (46, 47)
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`id` = 51 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:25:14.366802', NULL, NULL, NULL, 'ES - 2026.1', 46, '2026-06-30 17:25:14.366802')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:25:14.367886', 'Questão 1', 25, 1, 'Texto', '2026-06-30 17:25:14.367886')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`id` = 51 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:25:14.369345', NULL, NULL, NULL, 'ES - 2026.1', 47, '2026-06-30 17:25:14.369345')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.3ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:25:14.370347', 'Questão 1', 26, 1, 'Texto', '2026-06-30 17:25:14.370347')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/admin/90/gerenciamento Completed 302 Found in 8ms (ActiveRecord: 4.0ms (12 queries, 0 cached) | GC: 0.2ms)

+ +
Formulario Count (0.2ms)  SELECT COUNT(*) FROM `formularios`
+TRANSACTION (1.3ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:14.374679', 'Ciência da Computação', '2026-06-30 17:25:14.374679')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_admin' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+Administrador Create (1.1ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:14.563983', NULL, NULL, NULL, 87, 'admin_ctrl@unb.br', NULL, 'adm_admin', 'Admin Teste', NULL, NULL, '$2a$12$1mewvosiqw1gDB7ip/bwYuGPAx3Q8vkOU1IL7ORjONPj2uC1ZbSWG', 'Administrador', '2026-06-30 17:25:14.563983')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:14 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin_ctrl@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/91/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Disciplina Load (0.4ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'ES' AND `disciplinas`.`codigo` = 'CIC001A' AND `disciplinas`.`departamento_id` = 87 LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.5ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC001A' LIMIT 1
+Disciplina Create (0.4ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC001A', '2026-06-30 17:25:14.757202', 87, 'ES', '2026-06-30 17:25:14.757202')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 52 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Turma Exists? (0.5ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 52 LIMIT 1
+Turma Create (0.3ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:25:14.759490', 52, NULL, 'TA', '2026.1', '2026-06-30 17:25:14.759490')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Administrador Load (0.5ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 91 LIMIT 1
+Template Create (0.3ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:25:14.761779', 'Template Ctrl', '2026-06-30 17:25:14.761779', 91)
+Elemento Create (0.3ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:25:14.762233', 'Questão 1', 1, 28, '2026-06-30 17:25:14.762233')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/admin/91/enviar_formularios” for 127.0.0.1 at 2026-06-30 14:25:14 -0300 Processing by AdminController#enviar_formularios as HTML

+ +
Parameters: {"template_id" => "28", "turma_ids" => ["48"], "admin_id" => "91"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 91 LIMIT 1
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 91 LIMIT 1
+Template Load (0.2ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`id` = 28 LIMIT 1
+Elemento Load (0.2ms)  SELECT `elementos`.* FROM `elementos` WHERE `elementos`.`template_id` = 28
+Campo Load (0.2ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` = 42
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`id` = 48
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`id` = 52 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:25:14.767040', NULL, NULL, NULL, 'ES - 2026.1', 48, '2026-06-30 17:25:14.767040')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:25:14.768141', 'Questão 1', 27, 1, 'Texto', '2026-06-30 17:25:14.768141')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/admin/91/gerenciamento Completed 302 Found in 6ms (ActiveRecord: 2.9ms (9 queries, 0 cached) | GC: 0.0ms)

+ +
Formulario Load (0.3ms)  SELECT `formularios`.* FROM `formularios` ORDER BY `formularios`.`id` DESC LIMIT 1
+ElementoForm Count (0.2ms)  SELECT COUNT(*) FROM `elemento_forms` WHERE `elemento_forms`.`formulario_id` = 27
+TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:14.773030', 'Ciência da Computação', '2026-06-30 17:25:14.773030')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_admin' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+Administrador Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:14.962528', NULL, NULL, NULL, 88, 'admin_ctrl@unb.br', NULL, 'adm_admin', 'Admin Teste', NULL, NULL, '$2a$12$Lyoaqd4lcalgQWOIyDnWb.8Amrf6IrjSqrLt6ZnuUpNUe5AnF9ZtW', 'Administrador', '2026-06-30 17:25:14.962528')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:14 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin_ctrl@unb.br", "senha" => "Senha123"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/92/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/admin/92/resultados” for 127.0.0.1 at 2026-06-30 14:25:15 -0300 Processing by AdminController#resultados as HTML

+ +
Parameters: {"admin_id" => "92"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 92 LIMIT 1
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 92 LIMIT 1
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/resultados.html.erb within layouts/gerenciamento
+Formulario Eager Load (0.4ms)  SELECT `formularios`.`id` AS t0_r0, `formularios`.`created_at` AS t0_r1, `formularios`.`data_fim` AS t0_r2, `formularios`.`data_inicio` AS t0_r3, `formularios`.`nome` AS t0_r4, `formularios`.`titulo` AS t0_r5, `formularios`.`turma_id` AS t0_r6, `formularios`.`updated_at` AS t0_r7, `turmas`.`id` AS t1_r0, `turmas`.`created_at` AS t1_r1, `turmas`.`disciplina_id` AS t1_r2, `turmas`.`horario` AS t1_r3, `turmas`.`numero_da_turma` AS t1_r4, `turmas`.`semestre` AS t1_r5, `turmas`.`updated_at` AS t1_r6, `disciplinas`.`id` AS t2_r0, `disciplinas`.`codigo` AS t2_r1, `disciplinas`.`created_at` AS t2_r2, `disciplinas`.`departamento_id` AS t2_r3, `disciplinas`.`nome` AS t2_r4, `disciplinas`.`updated_at` AS t2_r5 FROM `formularios` INNER JOIN `turmas` ON `turmas`.`id` = `formularios`.`turma_id` INNER JOIN `disciplinas` ON `disciplinas`.`id` = `turmas`.`disciplina_id` WHERE `disciplinas`.`departamento_id` = 88
+Rendered admin/resultados.html.erb within layouts/gerenciamento (Duration: 1.1ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 1.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 3ms (Views: 1.1ms | ActiveRecord: 1.1ms (3 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:15.160329', 'Ciência da Computação', '2026-06-30 17:25:15.160329')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_admin' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:15.351006', NULL, NULL, NULL, 89, 'admin_ctrl@unb.br', NULL, 'adm_admin', 'Admin Teste', NULL, NULL, '$2a$12$03A7GpWVUkXHDz1kD68Hku7PsOYAEoh19k12dAKf.yOne7SskixUC', 'Administrador', '2026-06-30 17:25:15.351006')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:15 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin_ctrl@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/93/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Disciplina Load (0.3ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'ES Download' AND `disciplinas`.`codigo` = 'CIC002A' AND `disciplinas`.`departamento_id` = 89 LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.4ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC002A' LIMIT 1
+Disciplina Create (0.3ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC002A', '2026-06-30 17:25:15.542940', 89, 'ES Download', '2026-06-30 17:25:15.542940')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 53 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 53 LIMIT 1
+Turma Create (0.3ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:25:15.544906', 53, NULL, 'TA', '2026.1', '2026-06-30 17:25:15.544906')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:25:15.545720', NULL, NULL, NULL, NULL, 49, '2026-06-30 17:25:15.545720')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/admin/93/resultados/999999/download.csv” for 127.0.0.1 at 2026-06-30 14:25:15 -0300 Processing by AdminController#exportar_csv as CSV

+ +
Parameters: {"admin_id" => "93", "id" => "999999"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 93 LIMIT 1
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 93 LIMIT 1
+Formulario Load (0.2ms)  SELECT `formularios`.* FROM `formularios` WHERE `formularios`.`id` = 999999 LIMIT 1
+ +

Redirected to www.example.com/admin/93/resultados Completed 302 Found in 1ms (ActiveRecord: 0.6ms (3 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:15.551114', 'Ciência da Computação', '2026-06-30 17:25:15.551114')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_admin' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+Administrador Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:15.740968', NULL, NULL, NULL, 90, 'admin_ctrl@unb.br', NULL, 'adm_admin', 'Admin Teste', NULL, NULL, '$2a$12$igCmcIKLpPzQ2kLpVLVAj.SlS6v1ck63a5WvK/gLeZL/FT8YwbBrC', 'Administrador', '2026-06-30 17:25:15.740968')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:15 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin_ctrl@unb.br", "senha" => "Senha123"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/94/avaliacoes Completed 302 Found in 190ms (ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'ES Download' AND `disciplinas`.`codigo` = 'CIC002A' AND `disciplinas`.`departamento_id` = 90 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.4ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC002A' LIMIT 1
+Disciplina Create (0.3ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC002A', '2026-06-30 17:25:15.934112', 90, 'ES Download', '2026-06-30 17:25:15.934112')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 54 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 54 LIMIT 1
+Turma Create (0.3ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:25:15.936135', 54, NULL, 'TA', '2026.1', '2026-06-30 17:25:15.936135')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:25:15.936956', NULL, NULL, NULL, NULL, 50, '2026-06-30 17:25:15.936956')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/admin/94/resultados/29/download.csv” for 127.0.0.1 at 2026-06-30 14:25:15 -0300 Processing by AdminController#exportar_csv as CSV

+ +
Parameters: {"admin_id" => "94", "id" => "29"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 94 LIMIT 1
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 94 LIMIT 1
+Formulario Load (0.2ms)  SELECT `formularios`.* FROM `formularios` WHERE `formularios`.`id` = 29 LIMIT 1
+RespostaForm Exists? (0.2ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`formulario_id` = 29 LIMIT 1
+ +

Redirected to www.example.com/admin/94/resultados Completed 302 Found in 2ms (ActiveRecord: 0.9ms (4 queries, 0 cached) | GC: 0.1ms)

+ +
TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:15.943156', 'Ciência da Computação', '2026-06-30 17:25:15.943156')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_admin' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+Administrador Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:16.132713', NULL, NULL, NULL, 91, 'admin_ctrl@unb.br', NULL, 'adm_admin', 'Admin Teste', NULL, NULL, '$2a$12$1HuP.9lMCLr7fdvwwmhlxO6HMiYsCz2nTgaZdYpX2Y9mUuP94sTR6', 'Administrador', '2026-06-30 17:25:16.132713')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:16 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin_ctrl@unb.br", "senha" => "Senha123"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/95/avaliacoes Completed 302 Found in 190ms (ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Disciplina Load (0.5ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'ES Download' AND `disciplinas`.`codigo` = 'CIC002A' AND `disciplinas`.`departamento_id` = 91 LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.4ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC002A' LIMIT 1
+Disciplina Create (0.3ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC002A', '2026-06-30 17:25:16.327220', 91, 'ES Download', '2026-06-30 17:25:16.327220')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 55 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 55 LIMIT 1
+Turma Create (0.3ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:25:16.329282', 55, NULL, 'TA', '2026.1', '2026-06-30 17:25:16.329282')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:25:16.330089', NULL, NULL, NULL, NULL, 51, '2026-06-30 17:25:16.330089')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Docente Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Docente' AND `usuarios`.`email` = 'doc_csv@unb.br' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_csv' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_csv@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:16.521007', NULL, NULL, NULL, NULL, 'doc_csv@unb.br', 'Doutorado', 'doc_csv', 'Docente CSV', NULL, NULL, '$2a$12$VcERaHUxp/l.Y5xgxyIn9OSXkoZQqPk6iWhBE7KLDtoduvfz/f0eG', 'Docente', '2026-06-30 17:25:16.521007')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaForm Exists? (0.5ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 96 AND `resposta_forms`.`formulario_id` = 30 LIMIT 1
+RespostaForm Create (0.3ms)  INSERT INTO `resposta_forms` (`created_at`, `data_submissao`, `formulario_id`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:25:16.523249', '2026-06-30', 30, '2026-06-30 17:25:16.523249', 96)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/admin/95/resultados/30/download.csv” for 127.0.0.1 at 2026-06-30 14:25:16 -0300 Processing by AdminController#exportar_csv as CSV

+ +
Parameters: {"admin_id" => "95", "id" => "30"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 95 LIMIT 1
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 95 LIMIT 1
+Formulario Load (0.2ms)  SELECT `formularios`.* FROM `formularios` WHERE `formularios`.`id` = 30 LIMIT 1
+RespostaForm Exists? (0.2ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`formulario_id` = 30 LIMIT 1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`id` = 51 LIMIT 1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`id` = 55 LIMIT 1
+Rendering admin/exportar_csv.csv.erb
+ElementoForm Pluck (0.2ms)  SELECT `elemento_forms`.`enunciado` FROM `elemento_forms` WHERE `elemento_forms`.`formulario_id` = 30 ORDER BY `elemento_forms`.`ordem` ASC
+RespostaForm Load (0.2ms)  SELECT `resposta_forms`.* FROM `resposta_forms` WHERE `resposta_forms`.`formulario_id` = 30
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 96
+RespostaElem Load (0.3ms)  SELECT `resposta_elems`.* FROM `resposta_elems` WHERE `resposta_elems`.`resposta_form_id` = 10
+Rendered admin/exportar_csv.csv.erb (Duration: 2.3ms | GC: 0.0ms)
+ +

Completed 200 OK in 7ms (Views: 2.3ms | ActiveRecord: 2.1ms (10 queries, 0 cached) | GC: 0.1ms)

+ +
TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:16.534173', 'Ciência da Computação', '2026-06-30 17:25:16.534173')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_admin' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:16.724598', NULL, NULL, NULL, 92, 'admin_ctrl@unb.br', NULL, 'adm_admin', 'Admin Teste', NULL, NULL, '$2a$12$4jZHKtgXb/kwhB4NwibMUeCqVAM3iZwvlveOgIdHhsOkzutVcQ6hS', 'Administrador', '2026-06-30 17:25:16.724598')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:16 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin_ctrl@unb.br", "senha" => "Senha123"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/97/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/admin/97/sincronizar_sigaa” for 127.0.0.1 at 2026-06-30 14:25:16 -0300 Processing by AdminController#sincronizar_sigaa as HTML

+ +
Parameters: {"admin_id" => "97"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 97 LIMIT 1
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 97 LIMIT 1
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/sincronizar_sigaa.html.erb within layouts/gerenciamento
+Rendered admin/sincronizar_sigaa.html.erb within layouts/gerenciamento (Duration: 1.7ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 1.9ms | GC: 0.0ms)
+ +

Completed 200 OK in 5ms (Views: 3.1ms | ActiveRecord: 0.6ms (2 queries, 0 cached) | GC: 0.1ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:16.922881', 'Ciência da Computação', '2026-06-30 17:25:16.922881')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_admin' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:17.112653', NULL, NULL, NULL, 93, 'admin_ctrl@unb.br', NULL, 'adm_admin', 'Admin Teste', NULL, NULL, '$2a$12$pm./MJe1PpJLWffmtJ4tEuUt2n9idI4rSMuQPw2DbLk/jaahzEKje', 'Administrador', '2026-06-30 17:25:17.112653')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:17 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin_ctrl@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/98/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started POST “/admin/98/sincronizar_sigaa” for 127.0.0.1 at 2026-06-30 14:25:17 -0300 Processing by AdminController#sincronizar_sigaa as HTML

+ +
Parameters: {"acao" => "importar", "admin_id" => "98"}
+Usuario Load (0.5ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 98 LIMIT 1
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 98 LIMIT 1
+ +

Redirected to www.example.com/admin/98/gerenciamento Completed 302 Found in 2ms (ActiveRecord: 0.8ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:17.307671', 'Ciência da Computação', '2026-06-30 17:25:17.307671')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_admin' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+Administrador Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:17.497180', NULL, NULL, NULL, 94, 'admin_ctrl@unb.br', NULL, 'adm_admin', 'Admin Teste', NULL, NULL, '$2a$12$NAs2CK4BM2mOFCZMqh4yBOLVWVCqqAzhYnzkh3VoV1UViUcCW5coi', 'Administrador', '2026-06-30 17:25:17.497180')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:17 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin_ctrl@unb.br", "senha" => "Senha123"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/99/avaliacoes Completed 302 Found in 192ms (ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms) Started POST “/admin/99/sincronizar_sigaa” for 127.0.0.1 at 2026-06-30 14:25:17 -0300 Processing by AdminController#sincronizar_sigaa as HTML

+ +
Parameters: {"acao" => "importar", "arquivo_classes" => #<ActionDispatch::Http::UploadedFile:0x0000000128d63c00 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-98961-b5insb.json>, @content_type="application/json", @original_filename="class_members.json", @headers="content-disposition: form-data; name=\"arquivo_classes\"; filename=\"class_members.json\"\r\ncontent-type: application/json\r\ncontent-length: 16065\r\n">, "arquivo_membros" => #<ActionDispatch::Http::UploadedFile:0x0000000128d63b10 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-98961-l7d73s.json>, @content_type="application/json", @original_filename="class_members.json", @headers="content-disposition: form-data; name=\"arquivo_membros\"; filename=\"class_members.json\"\r\ncontent-type: application/json\r\ncontent-length: 16065\r\n">, "admin_id" => "99"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 99 LIMIT 1
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 99 LIMIT 1
+ +

Redirected to www.example.com/admin/99/gerenciamento Completed 302 Found in 1ms (ActiveRecord: 0.5ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.3ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:17.699552', 'Ciência da Computação', '2026-06-30 17:25:17.699552')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.5ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_admin' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+Administrador Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:17.891472', NULL, NULL, NULL, 95, 'admin_ctrl@unb.br', NULL, 'adm_admin', 'Admin Teste', NULL, NULL, '$2a$12$b9Irk4VBJk4ShZ0RZ3Onf.V43m8MsXGEnnp9PD4Oj2FvVN7REwL6m', 'Administrador', '2026-06-30 17:25:17.891472')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:17 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin_ctrl@unb.br", "senha" => "Senha123"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/100/avaliacoes Completed 302 Found in 191ms (ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms) Started POST “/admin/100/sincronizar_sigaa” for 127.0.0.1 at 2026-06-30 14:25:18 -0300 Processing by AdminController#sincronizar_sigaa as HTML

+ +
Parameters: {"acao" => "atualizar", "arquivo_classes" => #<ActionDispatch::Http::UploadedFile:0x0000000128a83b70 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-98961-o1bqkb.json>, @content_type="application/json", @original_filename="class_members.json", @headers="content-disposition: form-data; name=\"arquivo_classes\"; filename=\"class_members.json\"\r\ncontent-type: application/json\r\ncontent-length: 16065\r\n">, "arquivo_membros" => #<ActionDispatch::Http::UploadedFile:0x0000000128a83b20 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-98961-hhnt3q.json>, @content_type="application/json", @original_filename="class_members.json", @headers="content-disposition: form-data; name=\"arquivo_membros\"; filename=\"class_members.json\"\r\ncontent-type: application/json\r\ncontent-length: 16065\r\n">, "admin_id" => "100"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 100 LIMIT 1
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 100 LIMIT 1
+ +

Redirected to www.example.com/admin/100/gerenciamento Completed 302 Found in 2ms (ActiveRecord: 0.6ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:18.090447', 'Ciência da Computação', '2026-06-30 17:25:18.090447')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_admin' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+Administrador Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:18.282067', NULL, NULL, NULL, 96, 'admin_ctrl@unb.br', NULL, 'adm_admin', 'Admin Teste', NULL, NULL, '$2a$12$x49uwCfvWHyUvsv.ohguQu1woKcjjWHvMKNB8THDDvHaooBKAH9Um', 'Administrador', '2026-06-30 17:25:18.282067')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:18 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin_ctrl@unb.br", "senha" => "Senha123"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/101/avaliacoes Completed 302 Found in 191ms (ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms) Started POST “/admin/101/sincronizar_sigaa” for 127.0.0.1 at 2026-06-30 14:25:18 -0300 Processing by AdminController#sincronizar_sigaa as HTML

+ +
Parameters: {"acao" => "importar", "arquivo_classes" => #<ActionDispatch::Http::UploadedFile:0x00000001289e33f0 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-98961-qppomr.json>, @content_type="application/json", @original_filename="class_members.json", @headers="content-disposition: form-data; name=\"arquivo_classes\"; filename=\"class_members.json\"\r\ncontent-type: application/json\r\ncontent-length: 16065\r\n">, "arquivo_membros" => #<ActionDispatch::Http::UploadedFile:0x00000001289e33a0 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-98961-lx4yse.json>, @content_type="application/json", @original_filename="class_members.json", @headers="content-disposition: form-data; name=\"arquivo_membros\"; filename=\"class_members.json\"\r\ncontent-type: application/json\r\ncontent-length: 16065\r\n">, "admin_id" => "101"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 101 LIMIT 1
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 101 LIMIT 1
+ +

Redirected to www.example.com/admin/101/gerenciamento Completed 302 Found in 2ms (ActiveRecord: 0.7ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:18.480941', 'Ciência da Computação', '2026-06-30 17:25:18.480941')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_admin' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+Administrador Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:18.670955', NULL, NULL, NULL, 97, 'admin_ctrl@unb.br', NULL, 'adm_admin', 'Admin Teste', NULL, NULL, '$2a$12$0cla8fXZsYBil1Rn8etzNeqJezpzb2wizR4ts9KaAKb9zyDg9zakm', 'Administrador', '2026-06-30 17:25:18.670955')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:18 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin_ctrl@unb.br", "senha" => "Senha123"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/102/avaliacoes Completed 302 Found in 202ms (ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms) Started POST “/admin/102/sincronizar_sigaa” for 127.0.0.1 at 2026-06-30 14:25:18 -0300 Processing by AdminController#sincronizar_sigaa as HTML

+ +
Parameters: {"acao" => "atualizar", "arquivo_classes" => #<ActionDispatch::Http::UploadedFile:0x0000000128982190 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-98961-8jrmrb.json>, @content_type="application/json", @original_filename="class_members.json", @headers="content-disposition: form-data; name=\"arquivo_classes\"; filename=\"class_members.json\"\r\ncontent-type: application/json\r\ncontent-length: 16065\r\n">, "arquivo_membros" => #<ActionDispatch::Http::UploadedFile:0x0000000128982140 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-98961-1hwbww.json>, @content_type="application/json", @original_filename="class_members.json", @headers="content-disposition: form-data; name=\"arquivo_membros\"; filename=\"class_members.json\"\r\ncontent-type: application/json\r\ncontent-length: 16065\r\n">, "admin_id" => "102"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 102 LIMIT 1
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 102 LIMIT 1
+ +

Redirected to www.example.com/admin/102/gerenciamento Completed 302 Found in 9ms (ActiveRecord: 0.7ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.4ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.6ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:18.900052', 'Ciência da Computação', '2026-06-30 17:25:18.900052')
+TRANSACTION (0.4ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.6ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_admin' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+Administrador Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:19.094792', NULL, NULL, NULL, 98, 'admin_ctrl@unb.br', NULL, 'adm_admin', 'Admin Teste', NULL, NULL, '$2a$12$EDDjKeoekkybTMjq3pypUuJJZxQZZ31TFYBT7NknXHoKHSluhcJ.i', 'Administrador', '2026-06-30 17:25:19.094792')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:19 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin_ctrl@unb.br", "senha" => "Senha123"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/103/avaliacoes Completed 302 Found in 190ms (ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms) Started POST “/admin/103/sincronizar_sigaa” for 127.0.0.1 at 2026-06-30 14:25:19 -0300 Processing by AdminController#sincronizar_sigaa as HTML

+ +
Parameters: {"acao" => "importar", "arquivo_classes" => #<ActionDispatch::Http::UploadedFile:0x000000012864c408 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-98961-944hzg.json>, @content_type="application/json", @original_filename="class_members.json", @headers="content-disposition: form-data; name=\"arquivo_classes\"; filename=\"class_members.json\"\r\ncontent-type: application/json\r\ncontent-length: 16065\r\n">, "arquivo_membros" => #<ActionDispatch::Http::UploadedFile:0x000000012864c2c8 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-98961-6x86iw.json>, @content_type="application/json", @original_filename="class_members.json", @headers="content-disposition: form-data; name=\"arquivo_membros\"; filename=\"class_members.json\"\r\ncontent-type: application/json\r\ncontent-length: 16065\r\n">, "admin_id" => "103"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 103 LIMIT 1
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 103 LIMIT 1
+ +

Redirected to www.example.com/admin/103/gerenciamento Completed 302 Found in 2ms (ActiveRecord: 0.7ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:19.293516', 'Ciência da Computação', '2026-06-30 17:25:19.293516')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_admin' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+Administrador Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:19.484410', NULL, NULL, NULL, 99, 'admin_ctrl@unb.br', NULL, 'adm_admin', 'Admin Teste', NULL, NULL, '$2a$12$5/ioEaHac3MMICQ2fTEw6OY8Ge6aAU3ouEOSclGIvhaNFUlA6hKk2', 'Administrador', '2026-06-30 17:25:19.484410')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:19 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin_ctrl@unb.br", "senha" => "Senha123"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/104/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms) Started POST “/admin/104/sincronizar_sigaa” for 127.0.0.1 at 2026-06-30 14:25:19 -0300 Processing by AdminController#sincronizar_sigaa as HTML

+ +
Parameters: {"acao" => "atualizar", "arquivo_classes" => #<ActionDispatch::Http::UploadedFile:0x00000001285a6878 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-98961-ukk2mb.json>, @content_type="application/json", @original_filename="class_members.json", @headers="content-disposition: form-data; name=\"arquivo_classes\"; filename=\"class_members.json\"\r\ncontent-type: application/json\r\ncontent-length: 16065\r\n">, "arquivo_membros" => #<ActionDispatch::Http::UploadedFile:0x00000001285a67d8 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-98961-2xqm9e.json>, @content_type="application/json", @original_filename="class_members.json", @headers="content-disposition: form-data; name=\"arquivo_membros\"; filename=\"class_members.json\"\r\ncontent-type: application/json\r\ncontent-length: 16065\r\n">, "admin_id" => "104"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 104 LIMIT 1
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 104 LIMIT 1
+ +

Redirected to www.example.com/admin/104/gerenciamento Completed 302 Found in 1ms (ActiveRecord: 0.5ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:19.681181', 'Ciência da Computação', '2026-06-30 17:25:19.681181')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_admin' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+Administrador Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:19.872000', NULL, NULL, NULL, 100, 'admin_ctrl@unb.br', NULL, 'adm_admin', 'Admin Teste', NULL, NULL, '$2a$12$XW0xUTR0AQdnZeYFx1ILW.aVXennorXdYPwmPnhYgwpJHAH6bwq.O', 'Administrador', '2026-06-30 17:25:19.872000')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:19 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin_ctrl@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/105/avaliacoes Completed 302 Found in 190ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started POST “/admin/105/sincronizar_sigaa” for 127.0.0.1 at 2026-06-30 14:25:20 -0300 Processing by AdminController#sincronizar_sigaa as HTML

+ +
Parameters: {"acao" => "invalida", "arquivo_classes" => #<ActionDispatch::Http::UploadedFile:0x0000000127ee10b0 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-98961-i2cgz.json>, @content_type="application/json", @original_filename="class_members.json", @headers="content-disposition: form-data; name=\"arquivo_classes\"; filename=\"class_members.json\"\r\ncontent-type: application/json\r\ncontent-length: 16065\r\n">, "arquivo_membros" => #<ActionDispatch::Http::UploadedFile:0x0000000127ee0750 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-98961-bjdqsc.json>, @content_type="application/json", @original_filename="class_members.json", @headers="content-disposition: form-data; name=\"arquivo_membros\"; filename=\"class_members.json\"\r\ncontent-type: application/json\r\ncontent-length: 16065\r\n">, "admin_id" => "105"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 105 LIMIT 1
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 105 LIMIT 1
+ +

Redirected to www.example.com/admin/105/gerenciamento Completed 302 Found in 1ms (ActiveRecord: 0.6ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.2ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_cf' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_cf@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:20.261131', NULL, NULL, NULL, NULL, 'doc_cf@unb.br', 'Doutorado', 'doc_cf', 'Docente CF', NULL, NULL, '$2a$12$gHsVygohTXQfPgDV6Zc16uJZ/oynTKySNbNVw8bLZThco89LwambO', 'Docente', '2026-06-30 17:25:20.261131')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:20.263902', 'Ciência da Computação', '2026-06-30 17:25:20.263902')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 101 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:25:20.265276', 101, 'Engenharia de Software', '2026-06-30 17:25:20.265276')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 56 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 56 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:25:20.266805', 56, NULL, 'TA', '2026.1', '2026-06-30 17:25:20.266805')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:25:20.267424', NULL, NULL, NULL, NULL, 52, '2026-06-30 17:25:20.267424')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.3ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:25:20.268163', NULL, 31, 1, NULL, '2026-06-30 17:25:20.268163')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.5ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:25:20.268837', 30, 'Opção A', 1, NULL, '2026-06-30 17:25:20.268837')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:20 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_cf@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_cf@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/106/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started DELETE “/logout” for 127.0.0.1 at 2026-06-30 14:25:20 -0300 Processing by SessionsController#destroy as HTML Redirected to www.example.com/ Completed 302 Found in 0ms (ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 0.0ms) Started GET “/campo_forms” for 127.0.0.1 at 2026-06-30 14:25:20 -0300 Processing by CampoFormsController#index as HTML

+ +
Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+ +

Redirected to www.example.com/ Filter chain halted as :require_login rendered or redirected Completed 302 Found in 1ms (ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_cf' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_cf@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:20.654712', NULL, NULL, NULL, NULL, 'doc_cf@unb.br', 'Doutorado', 'doc_cf', 'Docente CF', NULL, NULL, '$2a$12$9at7WJzsoJx9xe/5HRfm/.fC/k6bHDfLlZ6PZXAwb3Pe9OZB4wPZq', 'Docente', '2026-06-30 17:25:20.654712')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:20.657088', 'Ciência da Computação', '2026-06-30 17:25:20.657088')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 102 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.4ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.3ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:25:20.658642', 102, 'Engenharia de Software', '2026-06-30 17:25:20.658642')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 57 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 57 LIMIT 1
+Turma Create (0.3ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:25:20.660279', 57, NULL, 'TA', '2026.1', '2026-06-30 17:25:20.660279')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.3ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:25:20.661004', NULL, NULL, NULL, NULL, 53, '2026-06-30 17:25:20.661004')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.5ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:25:20.661630', NULL, 32, 1, NULL, '2026-06-30 17:25:20.661630')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.3ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:25:20.662569', 31, 'Opção A', 1, NULL, '2026-06-30 17:25:20.662569')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:20 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_cf@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_cf@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/107/avaliacoes Completed 302 Found in 190ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/campo_forms” for 127.0.0.1 at 2026-06-30 14:25:20 -0300 Processing by CampoFormsController#index as HTML

+ +
Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 107 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering campo_forms/index.html.erb within layouts/application
+CampoForm Load (0.3ms)  SELECT `campo_forms`.* FROM `campo_forms`
+Rendered campo_forms/_campo_form.html.erb (Duration: 0.1ms | GC: 0.0ms)
+Rendered campo_forms/index.html.erb within layouts/application (Duration: 1.7ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 5.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 8ms (Views: 5.8ms | ActiveRecord: 0.7ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.6ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_cf' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_cf@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:21.053537', NULL, NULL, NULL, NULL, 'doc_cf@unb.br', 'Doutorado', 'doc_cf', 'Docente CF', NULL, NULL, '$2a$12$VegQSu52No90DJGBL6OOresRzMqLkywSubjDJlWu.k/O0FHLWtHB.', 'Docente', '2026-06-30 17:25:21.053537')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:21.055906', 'Ciência da Computação', '2026-06-30 17:25:21.055906')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 103 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.4ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.3ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:25:21.057500', 103, 'Engenharia de Software', '2026-06-30 17:25:21.057500')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 58 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 58 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:25:21.059149', 58, NULL, 'TA', '2026.1', '2026-06-30 17:25:21.059149')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:25:21.059800', NULL, NULL, NULL, NULL, 54, '2026-06-30 17:25:21.059800')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:25:21.060587', NULL, 33, 1, NULL, '2026-06-30 17:25:21.060587')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.4ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:25:21.061371', 32, 'Opção A', 1, NULL, '2026-06-30 17:25:21.061371')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:21 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_cf@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_cf@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/108/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/campo_forms/new” for 127.0.0.1 at 2026-06-30 14:25:21 -0300 Processing by CampoFormsController#new as HTML

+ +
Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 108 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering campo_forms/new.html.erb within layouts/application
+Rendered campo_forms/_form.html.erb (Duration: 1.5ms | GC: 0.0ms)
+Rendered campo_forms/new.html.erb within layouts/application (Duration: 1.9ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 2.2ms | GC: 0.0ms)
+ +

Completed 200 OK in 4ms (Views: 2.3ms | ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.6ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_cf' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_cf@unb.br' LIMIT 1
+Docente Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:21.446276', NULL, NULL, NULL, NULL, 'doc_cf@unb.br', 'Doutorado', 'doc_cf', 'Docente CF', NULL, NULL, '$2a$12$L/.oiIYj6yxPOdsb82ctiO96iicQ34UdaJFBposcdWZ7IF2EkewMK', 'Docente', '2026-06-30 17:25:21.446276')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:21.448797', 'Ciência da Computação', '2026-06-30 17:25:21.448797')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 104 LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.4ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:25:21.450391', 104, 'Engenharia de Software', '2026-06-30 17:25:21.450391')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 59 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 59 LIMIT 1
+Turma Create (0.3ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:25:21.451960', 59, NULL, 'TA', '2026.1', '2026-06-30 17:25:21.451960')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:25:21.452638', NULL, NULL, NULL, NULL, 55, '2026-06-30 17:25:21.452638')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:25:21.453439', NULL, 34, 1, NULL, '2026-06-30 17:25:21.453439')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.4ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:25:21.454195', 33, 'Opção A', 1, NULL, '2026-06-30 17:25:21.454195')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:21 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_cf@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_cf@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/109/avaliacoes Completed 302 Found in 190ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
CampoForm Count (0.3ms)  SELECT COUNT(*) FROM `campo_forms`
+ +

Started POST “/campo_forms” for 127.0.0.1 at 2026-06-30 14:25:21 -0300 Processing by CampoFormsController#create as HTML

+ +
Parameters: {"campo_form" => {"ordem" => "99", "enunciado" => "Nova Opção", "elemento_form_id" => "33"}}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 109 LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+ElementoForm Load (0.5ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`id` = 33 LIMIT 1
+CampoForm Create (0.3ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:25:21.648819', 33, 'Nova Opção', 99, NULL, '2026-06-30 17:25:21.648819')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/campo_forms/54 Completed 302 Found in 3ms (ActiveRecord: 1.4ms (3 queries, 0 cached) | GC: 0.0ms)

+ +
CampoForm Count (0.2ms)  SELECT COUNT(*) FROM `campo_forms`
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` ORDER BY `campo_forms`.`id` DESC LIMIT 1
+TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_cf' LIMIT 1
+Usuario Exists? (0.1ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_cf@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:21.843320', NULL, NULL, NULL, NULL, 'doc_cf@unb.br', 'Doutorado', 'doc_cf', 'Docente CF', NULL, NULL, '$2a$12$hY/CDMdNF1oKcSGWxl5e7OCDjVYLxc/RjcV5G8tiXaZas60rcBk7C', 'Docente', '2026-06-30 17:25:21.843320')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:21.845774', 'Ciência da Computação', '2026-06-30 17:25:21.845774')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 105 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:25:21.847317', 105, 'Engenharia de Software', '2026-06-30 17:25:21.847317')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 60 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 60 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:25:21.848944', 60, NULL, 'TA', '2026.1', '2026-06-30 17:25:21.848944')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:25:21.849570', NULL, NULL, NULL, NULL, 56, '2026-06-30 17:25:21.849570')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:25:21.850415', NULL, 35, 1, NULL, '2026-06-30 17:25:21.850415')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.4ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:25:21.851250', 34, 'Opção A', 1, NULL, '2026-06-30 17:25:21.851250')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:21 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_cf@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_cf@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/110/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
CampoForm Count (0.3ms)  SELECT COUNT(*) FROM `campo_forms`
+ +

Started POST “/campo_forms” for 127.0.0.1 at 2026-06-30 14:25:22 -0300 Processing by CampoFormsController#create as HTML

+ +
Parameters: {"campo_form" => {"ordem" => nil, "enunciado" => "X", "elemento_form_id" => "34"}}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 110 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Load (0.3ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`id` = 34 LIMIT 1
+TRANSACTION (0.2ms)  ROLLBACK TO SAVEPOINT active_record_1
+Rendering layout layouts/application.html.erb
+Rendering campo_forms/new.html.erb within layouts/application
+Rendered campo_forms/_form.html.erb (Duration: 0.7ms | GC: 0.0ms)
+Rendered campo_forms/new.html.erb within layouts/application (Duration: 0.8ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.1ms | GC: 0.0ms)
+ +

Completed 422 Unprocessable Content in 3ms (Views: 1.2ms | ActiveRecord: 0.9ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
CampoForm Count (0.2ms)  SELECT COUNT(*) FROM `campo_forms`
+TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_cf' LIMIT 1
+Usuario Exists? (0.1ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_cf@unb.br' LIMIT 1
+Docente Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:22.241523', NULL, NULL, NULL, NULL, 'doc_cf@unb.br', 'Doutorado', 'doc_cf', 'Docente CF', NULL, NULL, '$2a$12$YxprxjyMly073q6Kf80CjuSjaqCVs3PR9PALUa/WZVBwTa3yYHvRW', 'Docente', '2026-06-30 17:25:22.241523')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.5ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:22.244149', 'Ciência da Computação', '2026-06-30 17:25:22.244149')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 106 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.4ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.3ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:25:22.245667', 106, 'Engenharia de Software', '2026-06-30 17:25:22.245667')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 61 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 61 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:25:22.247324', 61, NULL, 'TA', '2026.1', '2026-06-30 17:25:22.247324')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.3ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:25:22.248158', NULL, NULL, NULL, NULL, 57, '2026-06-30 17:25:22.248158')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.3ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:25:22.248954', NULL, 36, 1, NULL, '2026-06-30 17:25:22.248954')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.4ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:25:22.249710', 35, 'Opção A', 1, NULL, '2026-06-30 17:25:22.249710')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:22 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_cf@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_cf@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/111/avaliacoes Completed 302 Found in 191ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/campo_forms/56” for 127.0.0.1 at 2026-06-30 14:25:22 -0300 Processing by CampoFormsController#show as HTML

+ +
Parameters: {"id" => "56"}
+Usuario Load (0.5ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 111 LIMIT 1
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`id` = 56 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering campo_forms/show.html.erb within layouts/application
+Rendered campo_forms/_campo_form.html.erb (Duration: 0.0ms | GC: 0.0ms)
+Rendered campo_forms/show.html.erb within layouts/application (Duration: 0.4ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.6ms | GC: 0.0ms)
+ +

Completed 200 OK in 3ms (Views: 0.8ms | ActiveRecord: 0.7ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.6ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.5ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_cf' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_cf@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:22.636899', NULL, NULL, NULL, NULL, 'doc_cf@unb.br', 'Doutorado', 'doc_cf', 'Docente CF', NULL, NULL, '$2a$12$tSifYP.h0UD9AthWyB0faONNma6CHHSsXf9Ltl6E4.G8fwEfhyE5a', 'Docente', '2026-06-30 17:25:22.636899')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:22.639307', 'Ciência da Computação', '2026-06-30 17:25:22.639307')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 107 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:25:22.640798', 107, 'Engenharia de Software', '2026-06-30 17:25:22.640798')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 62 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 62 LIMIT 1
+Turma Create (0.3ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:25:22.642313', 62, NULL, 'TA', '2026.1', '2026-06-30 17:25:22.642313')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:25:22.642972', NULL, NULL, NULL, NULL, 58, '2026-06-30 17:25:22.642972')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:25:22.643714', NULL, 37, 1, NULL, '2026-06-30 17:25:22.643714')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.2ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:25:22.644562', 36, 'Opção A', 1, NULL, '2026-06-30 17:25:22.644562')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:22 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_cf@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_cf@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/112/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/campo_forms/57/edit” for 127.0.0.1 at 2026-06-30 14:25:22 -0300 Processing by CampoFormsController#edit as HTML

+ +
Parameters: {"id" => "57"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 112 LIMIT 1
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`id` = 57 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering campo_forms/edit.html.erb within layouts/application
+Rendered campo_forms/_form.html.erb (Duration: 0.5ms | GC: 0.0ms)
+Rendered campo_forms/edit.html.erb within layouts/application (Duration: 0.7ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.9ms | GC: 0.0ms)
+ +

Completed 200 OK in 3ms (Views: 1.1ms | ActiveRecord: 0.6ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_cf' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_cf@unb.br' LIMIT 1
+Docente Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:23.029876', NULL, NULL, NULL, NULL, 'doc_cf@unb.br', 'Doutorado', 'doc_cf', 'Docente CF', NULL, NULL, '$2a$12$YR6pr9pYI6RLovAv7v4eAuVzbkno96MckdUFqUPDfL.TOZp/Jg0Yu', 'Docente', '2026-06-30 17:25:23.029876')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:23.032487', 'Ciência da Computação', '2026-06-30 17:25:23.032487')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 108 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.4ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.3ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:25:23.034055', 108, 'Engenharia de Software', '2026-06-30 17:25:23.034055')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 63 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 63 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:25:23.035692', 63, NULL, 'TA', '2026.1', '2026-06-30 17:25:23.035692')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.2ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:25:23.036459', NULL, NULL, NULL, NULL, 59, '2026-06-30 17:25:23.036459')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:25:23.037082', NULL, 38, 1, NULL, '2026-06-30 17:25:23.037082')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.4ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:25:23.037873', 37, 'Opção A', 1, NULL, '2026-06-30 17:25:23.037873')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:23 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_cf@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_cf@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/113/avaliacoes Completed 302 Found in 196ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started PATCH “/campo_forms/58” for 127.0.0.1 at 2026-06-30 14:25:23 -0300 Processing by CampoFormsController#update as HTML

+ +
Parameters: {"campo_form" => {"ordem" => "1", "enunciado" => "Opção Atualizada", "elemento_form_id" => "37"}, "id" => "58"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 113 LIMIT 1
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`id` = 58 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Update (0.6ms)  UPDATE `campo_forms` SET `campo_forms`.`enunciado` = 'Opção Atualizada', `campo_forms`.`updated_at` = '2026-06-30 17:25:23.238025' WHERE `campo_forms`.`id` = 58
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/campo_forms/58 Completed 303 See Other in 3ms (ActiveRecord: 1.4ms (3 queries, 0 cached) | GC: 0.0ms)

+ +
CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`id` = 58 LIMIT 1
+TRANSACTION (0.6ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_cf' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_cf@unb.br' LIMIT 1
+Docente Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:23.431646', NULL, NULL, NULL, NULL, 'doc_cf@unb.br', 'Doutorado', 'doc_cf', 'Docente CF', NULL, NULL, '$2a$12$Z3luFCwlxRNSPz40PRkC4ulWZY3kjDBa5ao3Q8zOjw3IIOt6JtBWi', 'Docente', '2026-06-30 17:25:23.431646')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:23.434117', 'Ciência da Computação', '2026-06-30 17:25:23.434117')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 109 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.3ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:25:23.435607', 109, 'Engenharia de Software', '2026-06-30 17:25:23.435607')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 64 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 64 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:25:23.437408', 64, NULL, 'TA', '2026.1', '2026-06-30 17:25:23.437408')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:25:23.438050', NULL, NULL, NULL, NULL, 60, '2026-06-30 17:25:23.438050')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:25:23.438801', NULL, 39, 1, NULL, '2026-06-30 17:25:23.438801')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.4ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:25:23.439543', 38, 'Opção A', 1, NULL, '2026-06-30 17:25:23.439543')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:23 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_cf@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_cf@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/114/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started PATCH “/campo_forms/59” for 127.0.0.1 at 2026-06-30 14:25:23 -0300 Processing by CampoFormsController#update as HTML

+ +
Parameters: {"campo_form" => {"ordem" => nil, "enunciado" => "X", "elemento_form_id" => "38"}, "id" => "59"}
+Usuario Load (0.5ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 114 LIMIT 1
+CampoForm Load (0.3ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`id` = 59 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering campo_forms/edit.html.erb within layouts/application
+Rendered campo_forms/_form.html.erb (Duration: 0.7ms | GC: 0.0ms)
+Rendered campo_forms/edit.html.erb within layouts/application (Duration: 0.8ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.1ms | GC: 0.0ms)
+ +

Completed 422 Unprocessable Content in 3ms (Views: 1.2ms | ActiveRecord: 0.7ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.9ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_cf' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_cf@unb.br' LIMIT 1
+Docente Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:23.824206', NULL, NULL, NULL, NULL, 'doc_cf@unb.br', 'Doutorado', 'doc_cf', 'Docente CF', NULL, NULL, '$2a$12$38XRGyQ0Q.SRLFR1LlWyoOCxhKoIzAHZWlHgkqYSLuDb6CJyd2x3S', 'Docente', '2026-06-30 17:25:23.824206')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.4ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.6ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.4ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:23.827174', 'Ciência da Computação', '2026-06-30 17:25:23.827174')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 110 LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.5ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.4ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:25:23.828935', 110, 'Engenharia de Software', '2026-06-30 17:25:23.828935')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 65 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 65 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:25:23.830565', 65, NULL, 'TA', '2026.1', '2026-06-30 17:25:23.830565')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:25:23.831193', NULL, NULL, NULL, NULL, 61, '2026-06-30 17:25:23.831193')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:25:23.831946', NULL, 40, 1, NULL, '2026-06-30 17:25:23.831946')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.4ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:25:23.832709', 39, 'Opção A', 1, NULL, '2026-06-30 17:25:23.832709')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:23 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_cf@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_cf@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/115/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+CampoForm Create (0.7ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:25:24.022703', 39, NULL, 50, NULL, '2026-06-30 17:25:24.022703')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+CampoForm Count (0.3ms)  SELECT COUNT(*) FROM `campo_forms`
+ +

Started DELETE “/campo_forms/61” for 127.0.0.1 at 2026-06-30 14:25:24 -0300 Processing by CampoFormsController#destroy as HTML

+ +
Parameters: {"id" => "61"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 115 LIMIT 1
+CampoForm Load (0.3ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`id` = 61 LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+RespostaElem Load (0.5ms)  SELECT `resposta_elems`.* FROM `resposta_elems` WHERE `resposta_elems`.`campo_form_id` = 61
+CampoForm Destroy (0.3ms)  DELETE FROM `campo_forms` WHERE `campo_forms`.`id` = 61
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/campo_forms Completed 303 See Other in 3ms (ActiveRecord: 1.7ms (4 queries, 0 cached) | GC: 0.0ms)

+ +
CampoForm Count (0.2ms)  SELECT COUNT(*) FROM `campo_forms`
+TRANSACTION (0.9ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:24.031310', 'Ciência da Computação', '2026-06-30 17:25:24.031310')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_campo2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'adm_campo2@unb.br' LIMIT 1
+Administrador Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:24.219982', NULL, NULL, NULL, 111, 'adm_campo2@unb.br', NULL, 'adm_campo2', 'Admin Campo', NULL, NULL, '$2a$12$giAhklkZ9GMnC6rB4F2Flu1WFJu4.WOafFSbGTNAKqcRo60F8yJSa', 'Administrador', '2026-06-30 17:25:24.219982')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Template Create (0.6ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:25:24.221370', 'Template Campo', '2026-06-30 17:25:24.221370', 116)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Elemento Create (0.4ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:25:24.222375', 'Q1', 1, 29, '2026-06-30 17:25:24.222375')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Campo Exists? (0.4ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` = 43 LIMIT 1
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:25:24.223735', 43, 'Opção A', 1, 'Multipla Escolha', '2026-06-30 17:25:24.223735')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:24 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "adm_campo2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'adm_campo2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/116/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started DELETE “/logout” for 127.0.0.1 at 2026-06-30 14:25:24 -0300 Processing by SessionsController#destroy as HTML Redirected to www.example.com/ Completed 302 Found in 0ms (ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 0.0ms) Started GET “/campos” for 127.0.0.1 at 2026-06-30 14:25:24 -0300 Processing by CamposController#index as HTML

+ +
Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+ +

Redirected to www.example.com/ Filter chain halted as :require_login rendered or redirected Completed 302 Found in 1ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:24.418709', 'Ciência da Computação', '2026-06-30 17:25:24.418709')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_campo2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'adm_campo2@unb.br' LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:24.608500', NULL, NULL, NULL, 112, 'adm_campo2@unb.br', NULL, 'adm_campo2', 'Admin Campo', NULL, NULL, '$2a$12$w/Ls7wwtEyfyDJd2vL/bEe7h7GDbaBr.bYSDjub0cWVn7l.tJ29vG', 'Administrador', '2026-06-30 17:25:24.608500')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Template Create (0.4ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:25:24.609966', 'Template Campo', '2026-06-30 17:25:24.609966', 117)
+TRANSACTION (0.6ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.3ms)  SAVEPOINT active_record_1
+Elemento Create (0.6ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:25:24.611290', 'Q1', 1, 30, '2026-06-30 17:25:24.611290')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Campo Exists? (0.5ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` = 44 LIMIT 1
+Campo Create (0.3ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:25:24.612870', 44, 'Opção A', 1, 'Multipla Escolha', '2026-06-30 17:25:24.612870')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:24 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "adm_campo2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'adm_campo2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/117/avaliacoes Completed 302 Found in 195ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/campos” for 127.0.0.1 at 2026-06-30 14:25:24 -0300 Processing by CamposController#index as HTML

+ +
Usuario Load (0.5ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 117 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering campos/index.html.erb within layouts/application
+Campo Load (0.3ms)  SELECT `campos`.* FROM `campos`
+Rendered campos/_campo.html.erb (Duration: 0.1ms | GC: 0.0ms)
+Rendered campos/index.html.erb within layouts/application (Duration: 1.4ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.6ms | GC: 0.0ms)
+ +

Completed 200 OK in 4ms (Views: 1.8ms | ActiveRecord: 0.7ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.6ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:24.816034', 'Ciência da Computação', '2026-06-30 17:25:24.816034')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_campo2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'adm_campo2@unb.br' LIMIT 1
+Administrador Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:25.006798', NULL, NULL, NULL, 113, 'adm_campo2@unb.br', NULL, 'adm_campo2', 'Admin Campo', NULL, NULL, '$2a$12$6Y5oyqzsgrl4vlfTTjxJpO.fpZYFPc.p4YgQAun5BmF/GGHLl64Uq', 'Administrador', '2026-06-30 17:25:25.006798')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Template Create (0.5ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:25:25.008348', 'Template Campo', '2026-06-30 17:25:25.008348', 118)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Elemento Create (0.4ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:25:25.009260', 'Q1', 1, 31, '2026-06-30 17:25:25.009260')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Campo Exists? (0.5ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` = 45 LIMIT 1
+Campo Create (0.3ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:25:25.010709', 45, 'Opção A', 1, 'Multipla Escolha', '2026-06-30 17:25:25.010709')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:25 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "adm_campo2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'adm_campo2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/118/avaliacoes Completed 302 Found in 192ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/campos/new” for 127.0.0.1 at 2026-06-30 14:25:25 -0300 Processing by CamposController#new as HTML

+ +
Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 118 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering campos/new.html.erb within layouts/application
+Rendered campos/_form.html.erb (Duration: 0.8ms | GC: 0.0ms)
+Rendered campos/new.html.erb within layouts/application (Duration: 1.1ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 3ms (Views: 1.6ms | ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.6ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.5ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:25.210425', 'Ciência da Computação', '2026-06-30 17:25:25.210425')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_campo2' LIMIT 1
+Usuario Exists? (0.1ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'adm_campo2@unb.br' LIMIT 1
+Administrador Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:25.402071', NULL, NULL, NULL, 114, 'adm_campo2@unb.br', NULL, 'adm_campo2', 'Admin Campo', NULL, NULL, '$2a$12$2D2VH5yqqPR0HfRXTEIs0uAoTZ0dhQMYaFTPC0Rhd27hmrZVgDQP.', 'Administrador', '2026-06-30 17:25:25.402071')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Template Create (0.4ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:25:25.403762', 'Template Campo', '2026-06-30 17:25:25.403762', 119)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Elemento Create (0.4ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:25:25.404550', 'Q1', 1, 32, '2026-06-30 17:25:25.404550')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Campo Exists? (0.5ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` = 46 LIMIT 1
+Campo Create (0.3ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:25:25.405968', 46, 'Opção A', 1, 'Multipla Escolha', '2026-06-30 17:25:25.405968')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:25 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "adm_campo2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'adm_campo2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/119/avaliacoes Completed 302 Found in 190ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Campo Count (0.3ms)  SELECT COUNT(*) FROM `campos`
+ +

Started POST “/campos” for 127.0.0.1 at 2026-06-30 14:25:25 -0300 Processing by CamposController#create as HTML

+ +
Parameters: {"campo" => {"ordem" => "99", "tipo_elemento" => "Texto", "enunciado" => "Novo campo", "elemento_id" => "46"}}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 119 LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Elemento Load (0.4ms)  SELECT `elementos`.* FROM `elementos` WHERE `elementos`.`id` = 46 LIMIT 1
+Campo Exists? (0.3ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 99 AND `campos`.`elemento_id` = 46 LIMIT 1
+Campo Create (0.3ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:25:25.600758', 46, 'Novo campo', 99, 'Texto', '2026-06-30 17:25:25.600758')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/campos/100 Completed 302 Found in 3ms (ActiveRecord: 1.5ms (4 queries, 0 cached) | GC: 0.0ms)

+ +
Campo Count (0.1ms)  SELECT COUNT(*) FROM `campos`
+Campo Load (0.1ms)  SELECT `campos`.* FROM `campos` ORDER BY `campos`.`id` DESC LIMIT 1
+TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:25.604740', 'Ciência da Computação', '2026-06-30 17:25:25.604740')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_campo2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'adm_campo2@unb.br' LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:25.795201', NULL, NULL, NULL, 115, 'adm_campo2@unb.br', NULL, 'adm_campo2', 'Admin Campo', NULL, NULL, '$2a$12$vI1dHfOwHivFdR0KRdQ/iOiVakfA4i2VV/Sn2XVG6L85nvvI7KDMu', 'Administrador', '2026-06-30 17:25:25.795201')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Template Create (0.5ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:25:25.796658', 'Template Campo', '2026-06-30 17:25:25.796658', 120)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Elemento Create (0.4ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:25:25.797581', 'Q1', 1, 33, '2026-06-30 17:25:25.797581')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Campo Exists? (0.3ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` = 47 LIMIT 1
+Campo Create (0.3ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:25:25.798965', 47, 'Opção A', 1, 'Multipla Escolha', '2026-06-30 17:25:25.798965')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:25 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "adm_campo2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'adm_campo2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/120/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Campo Count (0.4ms)  SELECT COUNT(*) FROM `campos`
+ +

Started POST “/campos” for 127.0.0.1 at 2026-06-30 14:25:25 -0300 Processing by CamposController#create as HTML

+ +
Parameters: {"campo" => {"ordem" => "2", "tipo_elemento" => "", "enunciado" => "X", "elemento_id" => "47"}}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 120 LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Elemento Load (0.5ms)  SELECT `elementos`.* FROM `elementos` WHERE `elementos`.`id` = 47 LIMIT 1
+Campo Exists? (0.3ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 2 AND `campos`.`elemento_id` = 47 LIMIT 1
+TRANSACTION (0.2ms)  ROLLBACK TO SAVEPOINT active_record_1
+Rendering layout layouts/application.html.erb
+Rendering campos/new.html.erb within layouts/application
+Rendered campos/_form.html.erb (Duration: 0.8ms | GC: 0.0ms)
+Rendered campos/new.html.erb within layouts/application (Duration: 0.9ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.1ms | GC: 0.0ms)
+ +

Completed 422 Unprocessable Content in 4ms (Views: 1.3ms | ActiveRecord: 1.5ms (3 queries, 0 cached) | GC: 0.0ms)

+ +
Campo Count (0.2ms)  SELECT COUNT(*) FROM `campos`
+TRANSACTION (1.3ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:25.997853', 'Ciência da Computação', '2026-06-30 17:25:25.997853')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_campo2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'adm_campo2@unb.br' LIMIT 1
+Administrador Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:26.187486', NULL, NULL, NULL, 116, 'adm_campo2@unb.br', NULL, 'adm_campo2', 'Admin Campo', NULL, NULL, '$2a$12$SORi07ABU92INlo6ZT5qlOHUUVjTF2GLgJnrZv6v5aXDLsnnS4xze', 'Administrador', '2026-06-30 17:25:26.187486')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Template Create (0.5ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:25:26.189003', 'Template Campo', '2026-06-30 17:25:26.189003', 121)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Elemento Create (0.4ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:25:26.189938', 'Q1', 1, 34, '2026-06-30 17:25:26.189938')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Campo Exists? (0.5ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` = 48 LIMIT 1
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:25:26.191377', 48, 'Opção A', 1, 'Multipla Escolha', '2026-06-30 17:25:26.191377')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:26 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "adm_campo2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'adm_campo2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/121/avaliacoes Completed 302 Found in 190ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/campos/102” for 127.0.0.1 at 2026-06-30 14:25:26 -0300 Processing by CamposController#show as HTML

+ +
Parameters: {"id" => "102"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 121 LIMIT 1
+Campo Load (0.2ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`id` = 102 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering campos/show.html.erb within layouts/application
+Rendered campos/_campo.html.erb (Duration: 0.0ms | GC: 0.0ms)
+Rendered campos/show.html.erb within layouts/application (Duration: 0.4ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.7ms | GC: 0.0ms)
+ +

Completed 200 OK in 2ms (Views: 0.8ms | ActiveRecord: 0.4ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.1ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:26.388579', 'Ciência da Computação', '2026-06-30 17:25:26.388579')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_campo2' LIMIT 1
+Usuario Exists? (0.1ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'adm_campo2@unb.br' LIMIT 1
+Administrador Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:26.581527', NULL, NULL, NULL, 117, 'adm_campo2@unb.br', NULL, 'adm_campo2', 'Admin Campo', NULL, NULL, '$2a$12$wkjGmSYPz86Ch4fTW6yub.EkmWCRueb5lQDHbczwBWgxVcoZXkBVO', 'Administrador', '2026-06-30 17:25:26.581527')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Template Create (0.5ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:25:26.583337', 'Template Campo', '2026-06-30 17:25:26.583337', 122)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Elemento Create (0.4ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:25:26.584320', 'Q1', 1, 35, '2026-06-30 17:25:26.584320')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Campo Exists? (0.5ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` = 49 LIMIT 1
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:25:26.585775', 49, 'Opção A', 1, 'Multipla Escolha', '2026-06-30 17:25:26.585775')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:26 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "adm_campo2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'adm_campo2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/122/avaliacoes Completed 302 Found in 190ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/campos/103/edit” for 127.0.0.1 at 2026-06-30 14:25:26 -0300 Processing by CamposController#edit as HTML

+ +
Parameters: {"id" => "103"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 122 LIMIT 1
+Campo Load (0.2ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`id` = 103 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering campos/edit.html.erb within layouts/application
+Rendered campos/_form.html.erb (Duration: 0.5ms | GC: 0.0ms)
+Rendered campos/edit.html.erb within layouts/application (Duration: 0.8ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.0ms | GC: 0.0ms)
+ +

Completed 200 OK in 4ms (Views: 1.2ms | ActiveRecord: 0.6ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:26.783863', 'Ciência da Computação', '2026-06-30 17:25:26.783863')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_campo2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'adm_campo2@unb.br' LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:26.972929', NULL, NULL, NULL, 118, 'adm_campo2@unb.br', NULL, 'adm_campo2', 'Admin Campo', NULL, NULL, '$2a$12$WjCZh2qWAYiK/kUT6ULhZ.5ic1kGm.xTV5WwXo1/tyvAip5HDCGEe', 'Administrador', '2026-06-30 17:25:26.972929')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Template Create (0.4ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:25:26.974230', 'Template Campo', '2026-06-30 17:25:26.974230', 123)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Elemento Create (0.4ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:25:26.975116', 'Q1', 1, 36, '2026-06-30 17:25:26.975116')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Campo Exists? (0.4ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` = 50 LIMIT 1
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:25:26.976498', 50, 'Opção A', 1, 'Multipla Escolha', '2026-06-30 17:25:26.976498')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:26 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "adm_campo2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'adm_campo2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/123/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started PATCH “/campos/104” for 127.0.0.1 at 2026-06-30 14:25:27 -0300 Processing by CamposController#update as HTML

+ +
Parameters: {"campo" => {"ordem" => "1", "tipo_elemento" => "Texto", "enunciado" => "Atualizado", "elemento_id" => "50"}, "id" => "104"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 123 LIMIT 1
+Campo Load (0.2ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`id` = 104 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Campo Exists? (0.2ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`id` != 104 AND `campos`.`elemento_id` = 50 LIMIT 1
+Campo Update (0.3ms)  UPDATE `campos` SET `campos`.`enunciado` = 'Atualizado', `campos`.`tipo_elemento` = 'Texto', `campos`.`updated_at` = '2026-06-30 17:25:27.170230' WHERE `campos`.`id` = 104
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/campos/104 Completed 303 See Other in 5ms (ActiveRecord: 3.1ms (4 queries, 0 cached) | GC: 0.0ms)

+ +
Campo Load (0.2ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`id` = 104 LIMIT 1
+TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:27.174198', 'Ciência da Computação', '2026-06-30 17:25:27.174198')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_campo2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'adm_campo2@unb.br' LIMIT 1
+Administrador Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:27.364488', NULL, NULL, NULL, 119, 'adm_campo2@unb.br', NULL, 'adm_campo2', 'Admin Campo', NULL, NULL, '$2a$12$ihxeUAD9WcU9IIzV6tCKk.tKFONkakp0bby0FlHCjMwsDBoHd3CGq', 'Administrador', '2026-06-30 17:25:27.364488')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Template Create (0.5ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:25:27.365985', 'Template Campo', '2026-06-30 17:25:27.365985', 124)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Elemento Create (0.4ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:25:27.366896', 'Q1', 1, 37, '2026-06-30 17:25:27.366896')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Campo Exists? (0.5ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` = 51 LIMIT 1
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:25:27.368327', 51, 'Opção A', 1, 'Multipla Escolha', '2026-06-30 17:25:27.368327')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:27 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "adm_campo2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'adm_campo2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/124/avaliacoes Completed 302 Found in 190ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started PATCH “/campos/105” for 127.0.0.1 at 2026-06-30 14:25:27 -0300 Processing by CamposController#update as HTML

+ +
Parameters: {"campo" => {"ordem" => "1", "tipo_elemento" => "", "enunciado" => "X", "elemento_id" => "51"}, "id" => "105"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 124 LIMIT 1
+Campo Load (0.2ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`id` = 105 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Campo Exists? (0.5ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`id` != 105 AND `campos`.`elemento_id` = 51 LIMIT 1
+TRANSACTION (0.1ms)  ROLLBACK TO SAVEPOINT active_record_1
+Rendering layout layouts/application.html.erb
+Rendering campos/edit.html.erb within layouts/application
+Rendered campos/_form.html.erb (Duration: 0.8ms | GC: 0.0ms)
+Rendered campos/edit.html.erb within layouts/application (Duration: 0.8ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.1ms | GC: 0.0ms)
+ +

Completed 422 Unprocessable Content in 4ms (Views: 1.2ms | ActiveRecord: 1.4ms (3 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:27.567017', 'Ciência da Computação', '2026-06-30 17:25:27.567017')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_campo2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'adm_campo2@unb.br' LIMIT 1
+Administrador Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:27.757477', NULL, NULL, NULL, 120, 'adm_campo2@unb.br', NULL, 'adm_campo2', 'Admin Campo', NULL, NULL, '$2a$12$M/3fmVwkdl6QAC9Uc6/Y4.RThzbiYx.zHZ3FHVGk7XhG6AgJcAJai', 'Administrador', '2026-06-30 17:25:27.757477')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Template Create (0.5ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:25:27.759018', 'Template Campo', '2026-06-30 17:25:27.759018', 125)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Elemento Create (0.4ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:25:27.759958', 'Q1', 1, 38, '2026-06-30 17:25:27.759958')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Campo Exists? (0.5ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` = 52 LIMIT 1
+Campo Create (0.3ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:25:27.761405', 52, 'Opção A', 1, 'Multipla Escolha', '2026-06-30 17:25:27.761405')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:27 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "adm_campo2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'adm_campo2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/125/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Campo Exists? (0.6ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 50 AND `campos`.`elemento_id` = 52 LIMIT 1
+Campo Create (0.3ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:25:27.952774', 52, NULL, 50, 'Texto', '2026-06-30 17:25:27.952774')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Campo Count (0.2ms)  SELECT COUNT(*) FROM `campos`
+ +

Started DELETE “/campos/107” for 127.0.0.1 at 2026-06-30 14:25:27 -0300 Processing by CamposController#destroy as HTML

+ +
Parameters: {"id" => "107"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 125 LIMIT 1
+Campo Load (0.1ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`id` = 107 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Campo Destroy (0.4ms)  DELETE FROM `campos` WHERE `campos`.`id` = 107
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/campos Completed 303 See Other in 2ms (ActiveRecord: 1.0ms (3 queries, 0 cached) | GC: 0.0ms)

+ +
Campo Count (0.2ms)  SELECT COUNT(*) FROM `campos`
+TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_cursos' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_cursos@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:28.148012', NULL, NULL, NULL, NULL, 'doc_cursos@unb.br', 'Doutorado', 'doc_cursos', 'Docente Cursos', NULL, NULL, '$2a$12$ChgfwCZPpXwjCR6MT9QCoee014LFJaZJYQY89KgpKe.pgTBUy4X3C', 'Docente', '2026-06-30 17:25:28.148012')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:28.150222', 'Ciência da Computação', '2026-06-30 17:25:28.150222')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Curso Exists? (0.3ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`codigo` = 'ESW01' LIMIT 1
+Curso Create (0.2ms)  INSERT INTO `cursos` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('ESW01', '2026-06-30 17:25:28.151358', 121, 'Engenharia de Software', '2026-06-30 17:25:28.151358')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:28 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_cursos@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_cursos@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/126/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started DELETE “/logout” for 127.0.0.1 at 2026-06-30 14:25:28 -0300 Processing by SessionsController#destroy as HTML Redirected to www.example.com/ Completed 302 Found in 0ms (ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 0.0ms) Started GET “/cursos” for 127.0.0.1 at 2026-06-30 14:25:28 -0300 Processing by CursosController#index as HTML

+ +
Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+ +

Redirected to www.example.com/ Filter chain halted as :require_login rendered or redirected Completed 302 Found in 1ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_cursos' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_cursos@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:28.535575', NULL, NULL, NULL, NULL, 'doc_cursos@unb.br', 'Doutorado', 'doc_cursos', 'Docente Cursos', NULL, NULL, '$2a$12$N.eHjMDpm3AL46560FZTE.MstOykKt75gvcbO0HEh8DT4D3NZcujC', 'Docente', '2026-06-30 17:25:28.535575')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:28.537988', 'Ciência da Computação', '2026-06-30 17:25:28.537988')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Curso Exists? (0.4ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`codigo` = 'ESW01' LIMIT 1
+Curso Create (0.3ms)  INSERT INTO `cursos` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('ESW01', '2026-06-30 17:25:28.539173', 122, 'Engenharia de Software', '2026-06-30 17:25:28.539173')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:28 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_cursos@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_cursos@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/127/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/cursos” for 127.0.0.1 at 2026-06-30 14:25:28 -0300 Processing by CursosController#index as HTML

+ +
Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 127 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering cursos/index.html.erb within layouts/application
+Curso Load (0.2ms)  SELECT `cursos`.* FROM `cursos`
+Rendered cursos/_curso.html.erb (Duration: 0.1ms | GC: 0.0ms)
+Rendered cursos/index.html.erb within layouts/application (Duration: 1.2ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 3ms (Views: 1.6ms | ActiveRecord: 0.6ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_cursos' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_cursos@unb.br' LIMIT 1
+Docente Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:28.923091', NULL, NULL, NULL, NULL, 'doc_cursos@unb.br', 'Doutorado', 'doc_cursos', 'Docente Cursos', NULL, NULL, '$2a$12$0cw9CT5lYmhitS5HXJz1huZU3QkWPt7.WNEezNJtP.uZdg7fHByjS', 'Docente', '2026-06-30 17:25:28.923091')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:28.925725', 'Ciência da Computação', '2026-06-30 17:25:28.925725')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Curso Exists? (0.3ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`codigo` = 'ESW01' LIMIT 1
+Curso Create (0.2ms)  INSERT INTO `cursos` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('ESW01', '2026-06-30 17:25:28.926822', 123, 'Engenharia de Software', '2026-06-30 17:25:28.926822')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:28 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_cursos@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_cursos@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/128/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/cursos/new” for 127.0.0.1 at 2026-06-30 14:25:29 -0300 Processing by CursosController#new as HTML

+ +
Usuario Load (0.5ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 128 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering cursos/new.html.erb within layouts/application
+Rendered cursos/_form.html.erb (Duration: 0.7ms | GC: 0.0ms)
+Rendered cursos/new.html.erb within layouts/application (Duration: 1.2ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 3ms (Views: 1.6ms | ActiveRecord: 0.5ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.6ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_cursos' LIMIT 1
+Usuario Exists? (0.1ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_cursos@unb.br' LIMIT 1
+Docente Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:29.316112', NULL, NULL, NULL, NULL, 'doc_cursos@unb.br', 'Doutorado', 'doc_cursos', 'Docente Cursos', NULL, NULL, '$2a$12$GGFfmRR.Kv1rrW03ca7Ax.JeZkAEAy0HGPnTXOIp/njr1P1IVR.RS', 'Docente', '2026-06-30 17:25:29.316112')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:29.318723', 'Ciência da Computação', '2026-06-30 17:25:29.318723')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Curso Exists? (0.4ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`codigo` = 'ESW01' LIMIT 1
+Curso Create (0.3ms)  INSERT INTO `cursos` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('ESW01', '2026-06-30 17:25:29.319946', 124, 'Engenharia de Software', '2026-06-30 17:25:29.319946')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:29 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_cursos@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_cursos@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/129/avaliacoes Completed 302 Found in 191ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Curso Count (0.3ms)  SELECT COUNT(*) FROM `cursos`
+ +

Started POST “/cursos” for 127.0.0.1 at 2026-06-30 14:25:29 -0300 Processing by CursosController#create as HTML

+ +
Parameters: {"curso" => {"nome" => "Novo Curso", "codigo" => "NC01", "departamento_id" => "124"}}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 129 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`id` = 124 LIMIT 1
+Curso Exists? (0.2ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`codigo` = 'NC01' LIMIT 1
+Curso Create (0.3ms)  INSERT INTO `cursos` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('NC01', '2026-06-30 17:25:29.516143', 124, 'Novo Curso', '2026-06-30 17:25:29.516143')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/cursos/12 Completed 302 Found in 3ms (ActiveRecord: 1.3ms (4 queries, 0 cached) | GC: 0.0ms)

+ +
Curso Count (0.2ms)  SELECT COUNT(*) FROM `cursos`
+Curso Load (0.2ms)  SELECT `cursos`.* FROM `cursos` ORDER BY `cursos`.`id` DESC LIMIT 1
+TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_cursos' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_cursos@unb.br' LIMIT 1
+Docente Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:29.707137', NULL, NULL, NULL, NULL, 'doc_cursos@unb.br', 'Doutorado', 'doc_cursos', 'Docente Cursos', NULL, NULL, '$2a$12$kqlMZO4n9OM2Jl5DxIPGv.mXFBjeP9VcnnO0n8sCzL174C3rWU3VS', 'Docente', '2026-06-30 17:25:29.707137')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:29.709825', 'Ciência da Computação', '2026-06-30 17:25:29.709825')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Curso Exists? (0.4ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`codigo` = 'ESW01' LIMIT 1
+Curso Create (0.3ms)  INSERT INTO `cursos` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('ESW01', '2026-06-30 17:25:29.711077', 125, 'Engenharia de Software', '2026-06-30 17:25:29.711077')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:29 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_cursos@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_cursos@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/130/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Curso Count (0.3ms)  SELECT COUNT(*) FROM `cursos`
+ +

Started POST “/cursos” for 127.0.0.1 at 2026-06-30 14:25:29 -0300 Processing by CursosController#create as HTML

+ +
Parameters: {"curso" => {"nome" => "", "codigo" => "", "departamento_id" => "125"}}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 130 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Load (0.4ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`id` = 125 LIMIT 1
+Curso Exists? (0.1ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`codigo` = '' LIMIT 1
+TRANSACTION (0.1ms)  ROLLBACK TO SAVEPOINT active_record_1
+Rendering layout layouts/application.html.erb
+Rendering cursos/new.html.erb within layouts/application
+Rendered cursos/_form.html.erb (Duration: 1.0ms | GC: 0.0ms)
+Rendered cursos/new.html.erb within layouts/application (Duration: 1.7ms | GC: 0.3ms)
+Rendered layout layouts/application.html.erb (Duration: 2.0ms | GC: 0.3ms)
+ +

Completed 422 Unprocessable Content in 4ms (Views: 2.2ms | ActiveRecord: 1.0ms (3 queries, 0 cached) | GC: 0.3ms)

+ +
Curso Count (0.2ms)  SELECT COUNT(*) FROM `cursos`
+TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_cursos' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_cursos@unb.br' LIMIT 1
+Docente Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:30.097243', NULL, NULL, NULL, NULL, 'doc_cursos@unb.br', 'Doutorado', 'doc_cursos', 'Docente Cursos', NULL, NULL, '$2a$12$DDp3f8XoX1N.2Bz64KD1jOIaGSLWeWO.4VXx.aGR2xBMvE5cPm8gG', 'Docente', '2026-06-30 17:25:30.097243')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:30.099669', 'Ciência da Computação', '2026-06-30 17:25:30.099669')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Curso Exists? (0.3ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`codigo` = 'ESW01' LIMIT 1
+Curso Create (0.3ms)  INSERT INTO `cursos` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('ESW01', '2026-06-30 17:25:30.100766', 126, 'Engenharia de Software', '2026-06-30 17:25:30.100766')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:30 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_cursos@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_cursos@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/131/avaliacoes Completed 302 Found in 190ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/cursos/14” for 127.0.0.1 at 2026-06-30 14:25:30 -0300 Processing by CursosController#show as HTML

+ +
Parameters: {"id" => "14"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 131 LIMIT 1
+Curso Load (0.2ms)  SELECT `cursos`.* FROM `cursos` WHERE `cursos`.`id` = 14 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering cursos/show.html.erb within layouts/application
+Rendered cursos/_curso.html.erb (Duration: 0.0ms | GC: 0.0ms)
+Rendered cursos/show.html.erb within layouts/application (Duration: 0.4ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.6ms | GC: 0.0ms)
+ +

Completed 200 OK in 4ms (Views: 0.8ms | ActiveRecord: 0.6ms (2 queries, 0 cached) | GC: 0.3ms)

+ +
TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_cursos' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_cursos@unb.br' LIMIT 1
+Docente Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:30.485705', NULL, NULL, NULL, NULL, 'doc_cursos@unb.br', 'Doutorado', 'doc_cursos', 'Docente Cursos', NULL, NULL, '$2a$12$qigsg1FGdDM6xvxVIQNNbue4KAzXId8ECroF7cD8B4Fa04SL.bOce', 'Docente', '2026-06-30 17:25:30.485705')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:30.488151', 'Ciência da Computação', '2026-06-30 17:25:30.488151')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Curso Exists? (0.3ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`codigo` = 'ESW01' LIMIT 1
+Curso Create (0.2ms)  INSERT INTO `cursos` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('ESW01', '2026-06-30 17:25:30.489774', 127, 'Engenharia de Software', '2026-06-30 17:25:30.489774')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:30 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_cursos@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_cursos@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/132/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/cursos/15/edit” for 127.0.0.1 at 2026-06-30 14:25:30 -0300 Processing by CursosController#edit as HTML

+ +
Parameters: {"id" => "15"}
+Usuario Load (0.5ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 132 LIMIT 1
+Curso Load (0.3ms)  SELECT `cursos`.* FROM `cursos` WHERE `cursos`.`id` = 15 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering cursos/edit.html.erb within layouts/application
+Rendered cursos/_form.html.erb (Duration: 0.4ms | GC: 0.0ms)
+Rendered cursos/edit.html.erb within layouts/application (Duration: 0.7ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.9ms | GC: 0.0ms)
+ +

Completed 200 OK in 4ms (Views: 1.1ms | ActiveRecord: 0.8ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_cursos' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_cursos@unb.br' LIMIT 1
+Docente Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:30.876322', NULL, NULL, NULL, NULL, 'doc_cursos@unb.br', 'Doutorado', 'doc_cursos', 'Docente Cursos', NULL, NULL, '$2a$12$3kgCxkx3xiFjIpoYswpFN.OZ1KxOScllZc1vN4eMf8kcv4mibwfpi', 'Docente', '2026-06-30 17:25:30.876322')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:30.878870', 'Ciência da Computação', '2026-06-30 17:25:30.878870')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Curso Exists? (0.3ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`codigo` = 'ESW01' LIMIT 1
+Curso Create (0.2ms)  INSERT INTO `cursos` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('ESW01', '2026-06-30 17:25:30.879955', 128, 'Engenharia de Software', '2026-06-30 17:25:30.879955')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:30 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_cursos@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_cursos@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/133/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started PATCH “/cursos/16” for 127.0.0.1 at 2026-06-30 14:25:31 -0300 Processing by CursosController#update as HTML

+ +
Parameters: {"curso" => {"nome" => "Nome Atualizado", "codigo" => "ESW01", "departamento_id" => "128"}, "id" => "16"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 133 LIMIT 1
+Curso Load (0.2ms)  SELECT `cursos`.* FROM `cursos` WHERE `cursos`.`id` = 16 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Curso Update (0.4ms)  UPDATE `cursos` SET `cursos`.`nome` = 'Nome Atualizado', `cursos`.`updated_at` = '2026-06-30 17:25:31.074894' WHERE `cursos`.`id` = 16
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/cursos/16 Completed 303 See Other in 4ms (ActiveRecord: 3.0ms (3 queries, 0 cached) | GC: 0.0ms)

+ +
Curso Load (0.2ms)  SELECT `cursos`.* FROM `cursos` WHERE `cursos`.`id` = 16 LIMIT 1
+TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_cursos' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_cursos@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:31.267186', NULL, NULL, NULL, NULL, 'doc_cursos@unb.br', 'Doutorado', 'doc_cursos', 'Docente Cursos', NULL, NULL, '$2a$12$hdsC6LObxhCI7H.Rg1K0heMWKOlaPbdhZ3ytZ7gFzU7Y4IgzcZxRe', 'Docente', '2026-06-30 17:25:31.267186')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:31.269343', 'Ciência da Computação', '2026-06-30 17:25:31.269343')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Curso Exists? (0.3ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`codigo` = 'ESW01' LIMIT 1
+Curso Create (0.2ms)  INSERT INTO `cursos` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('ESW01', '2026-06-30 17:25:31.270444', 129, 'Engenharia de Software', '2026-06-30 17:25:31.270444')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:31 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_cursos@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_cursos@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/134/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.2ms) Started PATCH “/cursos/17” for 127.0.0.1 at 2026-06-30 14:25:31 -0300 Processing by CursosController#update as HTML

+ +
Parameters: {"curso" => {"nome" => "", "codigo" => "", "departamento_id" => "129"}, "id" => "17"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 134 LIMIT 1
+Curso Load (0.2ms)  SELECT `cursos`.* FROM `cursos` WHERE `cursos`.`id` = 17 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Curso Exists? (0.4ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`codigo` = '' AND `cursos`.`id` != 17 LIMIT 1
+TRANSACTION (0.1ms)  ROLLBACK TO SAVEPOINT active_record_1
+Rendering layout layouts/application.html.erb
+Rendering cursos/edit.html.erb within layouts/application
+Rendered cursos/_form.html.erb (Duration: 1.0ms | GC: 0.0ms)
+Rendered cursos/edit.html.erb within layouts/application (Duration: 1.0ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.4ms | GC: 0.1ms)
+ +

Completed 422 Unprocessable Content in 4ms (Views: 1.5ms | ActiveRecord: 1.2ms (3 queries, 0 cached) | GC: 0.1ms)

+ +
TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_cursos' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_cursos@unb.br' LIMIT 1
+Docente Create (0.8ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:31.654824', NULL, NULL, NULL, NULL, 'doc_cursos@unb.br', 'Doutorado', 'doc_cursos', 'Docente Cursos', NULL, NULL, '$2a$12$zY.AJZq6SqQ09N7XzYvpm.P3MPXJo0C7L0Nb3tBCoiLQKn8uKLdpm', 'Docente', '2026-06-30 17:25:31.654824')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:31.657261', 'Ciência da Computação', '2026-06-30 17:25:31.657261')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Curso Exists? (0.3ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`codigo` = 'ESW01' LIMIT 1
+Curso Create (0.2ms)  INSERT INTO `cursos` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('ESW01', '2026-06-30 17:25:31.658313', 130, 'Engenharia de Software', '2026-06-30 17:25:31.658313')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:31 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_cursos@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_cursos@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/135/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Curso Count (0.3ms)  SELECT COUNT(*) FROM `cursos`
+ +

Started DELETE “/cursos/18” for 127.0.0.1 at 2026-06-30 14:25:31 -0300 Processing by CursosController#destroy as HTML

+ +
Parameters: {"id" => "18"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 135 LIMIT 1
+Curso Load (0.2ms)  SELECT `cursos`.* FROM `cursos` WHERE `cursos`.`id` = 18 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Curso Destroy (0.5ms)  DELETE FROM `cursos` WHERE `cursos`.`id` = 18
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/cursos Completed 303 See Other in 2ms (ActiveRecord: 1.2ms (3 queries, 0 cached) | GC: 0.0ms)

+ +
Curso Count (0.2ms)  SELECT COUNT(*) FROM `cursos`
+TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_dep' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_dep@unb.br' LIMIT 1
+Docente Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:32.042135', NULL, NULL, NULL, NULL, 'doc_dep@unb.br', 'Doutorado', 'doc_dep', 'Docente Dep', NULL, NULL, '$2a$12$1mPJxl6N8VE.S0Q32eoeZe6XS2lyZqu33cd2P8zFK6xo7.zdHZPcu', 'Docente', '2026-06-30 17:25:32.042135')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.5ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'MAT01' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('MAT01', '2026-06-30 17:25:32.044239', 'Matemática', '2026-06-30 17:25:32.044239')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:32 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_dep@unb.br", "senha" => "Senha123"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_dep@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/136/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.1ms) Started DELETE “/logout” for 127.0.0.1 at 2026-06-30 14:25:32 -0300 Processing by SessionsController#destroy as HTML Redirected to www.example.com/ Completed 302 Found in 0ms (ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 0.0ms) Started GET “/departamentos” for 127.0.0.1 at 2026-06-30 14:25:32 -0300 Processing by DepartamentosController#index as HTML

+ +
Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+ +

Redirected to www.example.com/ Filter chain halted as :require_login rendered or redirected Completed 302 Found in 1ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_dep' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_dep@unb.br' LIMIT 1
+Docente Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:32.427093', NULL, NULL, NULL, NULL, 'doc_dep@unb.br', 'Doutorado', 'doc_dep', 'Docente Dep', NULL, NULL, '$2a$12$ww5ASAdnR55Uv3reXK9VTu/aYq2eD.mkLEi0Wgbxklg9iuR/ohVxy', 'Docente', '2026-06-30 17:25:32.427093')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'MAT01' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('MAT01', '2026-06-30 17:25:32.428979', 'Matemática', '2026-06-30 17:25:32.428979')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:32 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_dep@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_dep@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/137/avaliacoes Completed 302 Found in 187ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/departamentos” for 127.0.0.1 at 2026-06-30 14:25:32 -0300 Processing by DepartamentosController#index as HTML

+ +
Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 137 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering departamentos/index.html.erb within layouts/application
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos`
+Rendered departamentos/_departamento.html.erb (Duration: 0.1ms | GC: 0.0ms)
+Rendered departamentos/index.html.erb within layouts/application (Duration: 1.3ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.5ms | GC: 0.0ms)
+ +

Completed 200 OK in 4ms (Views: 1.8ms | ActiveRecord: 0.6ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_dep' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_dep@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:32.811609', NULL, NULL, NULL, NULL, 'doc_dep@unb.br', 'Doutorado', 'doc_dep', 'Docente Dep', NULL, NULL, '$2a$12$YtMW8lqPg3xj/NKfh/STFuAwAJMuFHkidgaCCq6uqW2DPPGM2z4D2', 'Docente', '2026-06-30 17:25:32.811609')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'MAT01' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('MAT01', '2026-06-30 17:25:32.813707', 'Matemática', '2026-06-30 17:25:32.813707')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:32 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_dep@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_dep@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/138/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/departamentos/new” for 127.0.0.1 at 2026-06-30 14:25:33 -0300 Processing by DepartamentosController#new as HTML

+ +
Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 138 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering departamentos/new.html.erb within layouts/application
+Rendered departamentos/_form.html.erb (Duration: 0.5ms | GC: 0.0ms)
+Rendered departamentos/new.html.erb within layouts/application (Duration: 0.9ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.1ms | GC: 0.0ms)
+ +

Completed 200 OK in 3ms (Views: 1.2ms | ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_dep' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_dep@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:33.196090', NULL, NULL, NULL, NULL, 'doc_dep@unb.br', 'Doutorado', 'doc_dep', 'Docente Dep', NULL, NULL, '$2a$12$9w8CRWVekxI7bDFX7jVU2OPwYXwVk60yUJSZFlibU2XA.vjf.RKRO', 'Docente', '2026-06-30 17:25:33.196090')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'MAT01' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('MAT01', '2026-06-30 17:25:33.197981', 'Matemática', '2026-06-30 17:25:33.197981')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:33 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_dep@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_dep@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/139/avaliacoes Completed 302 Found in 190ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Departamento Count (0.3ms)  SELECT COUNT(*) FROM `departamentos`
+ +

Started POST “/departamentos” for 127.0.0.1 at 2026-06-30 14:25:33 -0300 Processing by DepartamentosController#create as HTML

+ +
Parameters: {"departamento" => {"nome" => "Física", "codigo" => "FIS01"}}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 139 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'FIS01' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('FIS01', '2026-06-30 17:25:33.391922', 'Física', '2026-06-30 17:25:33.391922')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/departamentos/135 Completed 302 Found in 2ms (ActiveRecord: 1.1ms (3 queries, 0 cached) | GC: 0.0ms)

+ +
Departamento Count (0.2ms)  SELECT COUNT(*) FROM `departamentos`
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` ORDER BY `departamentos`.`id` DESC LIMIT 1
+TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_dep' LIMIT 1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_dep@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:33.583885', NULL, NULL, NULL, NULL, 'doc_dep@unb.br', 'Doutorado', 'doc_dep', 'Docente Dep', NULL, NULL, '$2a$12$o0R1imlRtptoP0tdL9bU7OMCK1ErCd9k6f/6jbJabViv/NeOOYae2', 'Docente', '2026-06-30 17:25:33.583885')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'MAT01' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('MAT01', '2026-06-30 17:25:33.585885', 'Matemática', '2026-06-30 17:25:33.585885')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:33 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_dep@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_dep@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/140/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Departamento Count (0.3ms)  SELECT COUNT(*) FROM `departamentos`
+ +

Started POST “/departamentos” for 127.0.0.1 at 2026-06-30 14:25:33 -0300 Processing by DepartamentosController#create as HTML

+ +
Parameters: {"departamento" => {"nome" => "", "codigo" => ""}}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 140 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = '' LIMIT 1
+TRANSACTION (0.1ms)  ROLLBACK TO SAVEPOINT active_record_1
+Rendering layout layouts/application.html.erb
+Rendering departamentos/new.html.erb within layouts/application
+Rendered departamentos/_form.html.erb (Duration: 0.9ms | GC: 0.0ms)
+Rendered departamentos/new.html.erb within layouts/application (Duration: 0.9ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.3ms | GC: 0.1ms)
+ +

Completed 422 Unprocessable Content in 3ms (Views: 1.4ms | ActiveRecord: 1.0ms (2 queries, 0 cached) | GC: 0.1ms)

+ +
Departamento Count (0.2ms)  SELECT COUNT(*) FROM `departamentos`
+TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_dep' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_dep@unb.br' LIMIT 1
+Docente Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:33.971837', NULL, NULL, NULL, NULL, 'doc_dep@unb.br', 'Doutorado', 'doc_dep', 'Docente Dep', NULL, NULL, '$2a$12$LTz.UZxNngpZe5IrlWj3uOfMI/dQdEqSs03EuO.tZ/LhTm9J9vvi.', 'Docente', '2026-06-30 17:25:33.971837')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'MAT01' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('MAT01', '2026-06-30 17:25:33.973901', 'Matemática', '2026-06-30 17:25:33.973901')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:33 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_dep@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_dep@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/141/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/departamentos/137” for 127.0.0.1 at 2026-06-30 14:25:34 -0300 Processing by DepartamentosController#show as HTML

+ +
Parameters: {"id" => "137"}
+Usuario Load (0.5ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 141 LIMIT 1
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`id` = 137 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering departamentos/show.html.erb within layouts/application
+Rendered departamentos/_departamento.html.erb (Duration: 0.0ms | GC: 0.0ms)
+Rendered departamentos/show.html.erb within layouts/application (Duration: 0.4ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.6ms | GC: 0.0ms)
+ +

Completed 200 OK in 3ms (Views: 0.8ms | ActiveRecord: 0.7ms (2 queries, 0 cached) | GC: 0.1ms)

+ +
TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_dep' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_dep@unb.br' LIMIT 1
+Docente Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:34.356255', NULL, NULL, NULL, NULL, 'doc_dep@unb.br', 'Doutorado', 'doc_dep', 'Docente Dep', NULL, NULL, '$2a$12$dd5pyhSl4Qt8p85Da2J8TuQqjkbzJ/NuWxSbdsFyB0au5sZ.7hzOu', 'Docente', '2026-06-30 17:25:34.356255')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'MAT01' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('MAT01', '2026-06-30 17:25:34.358270', 'Matemática', '2026-06-30 17:25:34.358270')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:34 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_dep@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_dep@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/142/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/departamentos/138/edit” for 127.0.0.1 at 2026-06-30 14:25:34 -0300 Processing by DepartamentosController#edit as HTML

+ +
Parameters: {"id" => "138"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 142 LIMIT 1
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`id` = 138 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering departamentos/edit.html.erb within layouts/application
+Rendered departamentos/_form.html.erb (Duration: 0.4ms | GC: 0.0ms)
+Rendered departamentos/edit.html.erb within layouts/application (Duration: 0.6ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.9ms | GC: 0.0ms)
+ +

Completed 200 OK in 3ms (Views: 1.0ms | ActiveRecord: 0.6ms (2 queries, 0 cached) | GC: 0.1ms)

+ +
TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_dep' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_dep@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:34.740147', NULL, NULL, NULL, NULL, 'doc_dep@unb.br', 'Doutorado', 'doc_dep', 'Docente Dep', NULL, NULL, '$2a$12$47qNBUHorWyeQ4SnZS2WzuVbk3eH2t7jPIxrroShVzRKIJ3tEkJz2', 'Docente', '2026-06-30 17:25:34.740147')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'MAT01' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('MAT01', '2026-06-30 17:25:34.742006', 'Matemática', '2026-06-30 17:25:34.742006')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:34 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_dep@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_dep@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/143/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started PATCH “/departamentos/139” for 127.0.0.1 at 2026-06-30 14:25:34 -0300 Processing by DepartamentosController#update as HTML

+ +
Parameters: {"departamento" => {"nome" => "Matemática Aplicada", "codigo" => "MAT01"}, "id" => "139"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 143 LIMIT 1
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`id` = 139 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Update (0.4ms)  UPDATE `departamentos` SET `departamentos`.`nome` = 'Matemática Aplicada', `departamentos`.`updated_at` = '2026-06-30 17:25:34.935199' WHERE `departamentos`.`id` = 139
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/departamentos/139 Completed 303 See Other in 4ms (ActiveRecord: 3.0ms (3 queries, 0 cached) | GC: 0.0ms)

+ +
Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`id` = 139 LIMIT 1
+TRANSACTION (1.3ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_dep' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_dep@unb.br' LIMIT 1
+Docente Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:35.126738', NULL, NULL, NULL, NULL, 'doc_dep@unb.br', 'Doutorado', 'doc_dep', 'Docente Dep', NULL, NULL, '$2a$12$3.Nb5o142AmPXT5pYNAom.Z54yEx9sdH8Ot6AbQDLSMRGk5XhNBUC', 'Docente', '2026-06-30 17:25:35.126738')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'MAT01' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('MAT01', '2026-06-30 17:25:35.128576', 'Matemática', '2026-06-30 17:25:35.128576')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:35 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_dep@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_dep@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/144/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started PATCH “/departamentos/140” for 127.0.0.1 at 2026-06-30 14:25:35 -0300 Processing by DepartamentosController#update as HTML

+ +
Parameters: {"departamento" => {"nome" => "", "codigo" => ""}, "id" => "140"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 144 LIMIT 1
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`id` = 140 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = '' AND `departamentos`.`id` != 140 LIMIT 1
+TRANSACTION (0.1ms)  ROLLBACK TO SAVEPOINT active_record_1
+Rendering layout layouts/application.html.erb
+Rendering departamentos/edit.html.erb within layouts/application
+Rendered departamentos/_form.html.erb (Duration: 0.9ms | GC: 0.0ms)
+Rendered departamentos/edit.html.erb within layouts/application (Duration: 1.0ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.2ms | GC: 0.0ms)
+ +

Completed 422 Unprocessable Content in 4ms (Views: 1.4ms | ActiveRecord: 1.2ms (3 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_dep' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_dep@unb.br' LIMIT 1
+Docente Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:35.512854', NULL, NULL, NULL, NULL, 'doc_dep@unb.br', 'Doutorado', 'doc_dep', 'Docente Dep', NULL, NULL, '$2a$12$KWlUqobsvG56bcN3jL7mpeYsG3CtK5agRzkG/4GDRdYcDjihOxOzq', 'Docente', '2026-06-30 17:25:35.512854')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'MAT01' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('MAT01', '2026-06-30 17:25:35.514772', 'Matemática', '2026-06-30 17:25:35.514772')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:35 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_dep@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_dep@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/145/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.5ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'DEL01' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('DEL01', '2026-06-30 17:25:35.706171', 'Para Deletar', '2026-06-30 17:25:35.706171')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Count (0.2ms)  SELECT COUNT(*) FROM `departamentos`
+ +

Started DELETE “/departamentos/142” for 127.0.0.1 at 2026-06-30 14:25:35 -0300 Processing by DepartamentosController#destroy as HTML

+ +
Parameters: {"id" => "142"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 145 LIMIT 1
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`id` = 142 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Curso Exists? (0.4ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`departamento_id` = 142 LIMIT 1
+Disciplina Exists? (0.2ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`departamento_id` = 142 LIMIT 1
+Departamento Destroy (0.3ms)  DELETE FROM `departamentos` WHERE `departamentos`.`id` = 142
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/departamentos Completed 303 See Other in 3ms (ActiveRecord: 1.5ms (5 queries, 0 cached) | GC: 0.0ms)

+ +
Departamento Count (0.2ms)  SELECT COUNT(*) FROM `departamentos`
+TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_disc2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_disc2@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:35.902555', NULL, NULL, NULL, NULL, 'doc_disc2@unb.br', 'Doutorado', 'doc_disc2', 'Docente Disc2', NULL, NULL, '$2a$12$3mLJbNVFzaoh0GT9pz7MYuG9.hmReB78rmlbhFAbxATFbZvSCgl8W', 'Docente', '2026-06-30 17:25:35.902555')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:35.906741', 'Ciência da Computação', '2026-06-30 17:25:35.906741')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Curso Load (0.2ms)  SELECT `cursos`.* FROM `cursos` WHERE `cursos`.`nome` = 'Engenharia de Software' AND `cursos`.`codigo` = 'ESW_D' AND `cursos`.`departamento_id` = 143 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Curso Exists? (0.3ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`codigo` = 'ESW_D' LIMIT 1
+Curso Create (0.2ms)  INSERT INTO `cursos` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('ESW_D', '2026-06-30 17:25:35.908192', 143, 'Engenharia de Software', '2026-06-30 17:25:35.908192')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'disc_teste' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'disc_teste@unb.br' LIMIT 1
+Discente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:36.099802', 19, NULL, NULL, NULL, 'disc_teste@unb.br', NULL, 'disc_teste', 'Discente Teste', NULL, NULL, '$2a$12$A1rLz3I0BthUGyM1clxv.ecWgq6xDDNme7TPfO8GdU8RKYZm5qiQ.', 'Discente', '2026-06-30 17:25:36.099802')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:36 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_disc2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_disc2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/146/avaliacoes Completed 302 Found in 192ms (ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms) Started DELETE “/logout” for 127.0.0.1 at 2026-06-30 14:25:36 -0300 Processing by SessionsController#destroy as HTML Redirected to www.example.com/ Completed 302 Found in 0ms (ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 0.0ms) Started GET “/discentes” for 127.0.0.1 at 2026-06-30 14:25:36 -0300 Processing by DiscentesController#index as HTML

+ +
Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+ +

Redirected to www.example.com/ Filter chain halted as :require_login rendered or redirected Completed 302 Found in 1ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_disc2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_disc2@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:36.487844', NULL, NULL, NULL, NULL, 'doc_disc2@unb.br', 'Doutorado', 'doc_disc2', 'Docente Disc2', NULL, NULL, '$2a$12$xh9YwL4uazl3LxZC/vZ9i.Fm8j63Xa3qMK2zPxDSWJFg8ZkVpzRGy', 'Docente', '2026-06-30 17:25:36.487844')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:36.490303', 'Ciência da Computação', '2026-06-30 17:25:36.490303')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Curso Load (0.2ms)  SELECT `cursos`.* FROM `cursos` WHERE `cursos`.`nome` = 'Engenharia de Software' AND `cursos`.`codigo` = 'ESW_D' AND `cursos`.`departamento_id` = 144 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Curso Exists? (0.3ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`codigo` = 'ESW_D' LIMIT 1
+Curso Create (0.2ms)  INSERT INTO `cursos` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('ESW_D', '2026-06-30 17:25:36.491734', 144, 'Engenharia de Software', '2026-06-30 17:25:36.491734')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'disc_teste' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'disc_teste@unb.br' LIMIT 1
+Discente Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:36.680894', 20, NULL, NULL, NULL, 'disc_teste@unb.br', NULL, 'disc_teste', 'Discente Teste', NULL, NULL, '$2a$12$I5IZofkENLTwScoDNQ7IzuXaYqBmT3Q14cJk0JMrAbFMKSBtT/R6y', 'Discente', '2026-06-30 17:25:36.680894')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:36 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_disc2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_disc2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/148/avaliacoes Completed 302 Found in 190ms (ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.1ms) Started GET “/discentes” for 127.0.0.1 at 2026-06-30 14:25:36 -0300 Processing by DiscentesController#index as HTML

+ +
Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 148 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering discentes/index.html.erb within layouts/application
+Discente Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Discente'
+Rendered discentes/_discente.html.erb (Duration: 0.1ms | GC: 0.0ms)
+Rendered discentes/index.html.erb within layouts/application (Duration: 1.6ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.9ms | GC: 0.1ms)
+ +

Completed 200 OK in 4ms (Views: 2.0ms | ActiveRecord: 0.8ms (2 queries, 0 cached) | GC: 0.1ms)

+ +
TRANSACTION (0.6ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_disc2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_disc2@unb.br' LIMIT 1
+Docente Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:37.068468', NULL, NULL, NULL, NULL, 'doc_disc2@unb.br', 'Doutorado', 'doc_disc2', 'Docente Disc2', NULL, NULL, '$2a$12$JmUt.NE8jSmCkruaaKHSseya.phUroPvcnjI2tXmxsZ4kkp6NZSei', 'Docente', '2026-06-30 17:25:37.068468')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.4ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.5ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.4ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:37.071185', 'Ciência da Computação', '2026-06-30 17:25:37.071185')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Curso Load (0.2ms)  SELECT `cursos`.* FROM `cursos` WHERE `cursos`.`nome` = 'Engenharia de Software' AND `cursos`.`codigo` = 'ESW_D' AND `cursos`.`departamento_id` = 145 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Curso Exists? (0.3ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`codigo` = 'ESW_D' LIMIT 1
+Curso Create (0.3ms)  INSERT INTO `cursos` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('ESW_D', '2026-06-30 17:25:37.073011', 145, 'Engenharia de Software', '2026-06-30 17:25:37.073011')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'disc_teste' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'disc_teste@unb.br' LIMIT 1
+Discente Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:37.261979', 21, NULL, NULL, NULL, 'disc_teste@unb.br', NULL, 'disc_teste', 'Discente Teste', NULL, NULL, '$2a$12$SYKTK0sgtk.ud83S42Jv7epSPWNV/Tb6ot5AAbeUqNcakiLCjd0du', 'Discente', '2026-06-30 17:25:37.261979')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:37 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_disc2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_disc2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/150/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/discentes/new” for 127.0.0.1 at 2026-06-30 14:25:37 -0300 Processing by DiscentesController#new as HTML

+ +
Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 150 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering discentes/new.html.erb within layouts/application
+Rendered discentes/_form.html.erb (Duration: 0.9ms | GC: 0.0ms)
+Rendered discentes/new.html.erb within layouts/application (Duration: 1.3ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.5ms | GC: 0.0ms)
+ +

Completed 200 OK in 3ms (Views: 1.7ms | ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_disc2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_disc2@unb.br' LIMIT 1
+Docente Create (0.8ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:37.645858', NULL, NULL, NULL, NULL, 'doc_disc2@unb.br', 'Doutorado', 'doc_disc2', 'Docente Disc2', NULL, NULL, '$2a$12$mZeRFrRtUiPPmTlyQ3/Cnux8/XOUeuHkb8nOjfOB8A52R3I0h.csm', 'Docente', '2026-06-30 17:25:37.645858')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:37.648322', 'Ciência da Computação', '2026-06-30 17:25:37.648322')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Curso Load (0.2ms)  SELECT `cursos`.* FROM `cursos` WHERE `cursos`.`nome` = 'Engenharia de Software' AND `cursos`.`codigo` = 'ESW_D' AND `cursos`.`departamento_id` = 146 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Curso Exists? (0.3ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`codigo` = 'ESW_D' LIMIT 1
+Curso Create (0.2ms)  INSERT INTO `cursos` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('ESW_D', '2026-06-30 17:25:37.649756', 146, 'Engenharia de Software', '2026-06-30 17:25:37.649756')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'disc_teste' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'disc_teste@unb.br' LIMIT 1
+Discente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:37.839638', 22, NULL, NULL, NULL, 'disc_teste@unb.br', NULL, 'disc_teste', 'Discente Teste', NULL, NULL, '$2a$12$DKwu938MUpMfPFwdvDxVd.TTS0cUABJ5xfYSuvRqAvdQ0hC4fMXQ6', 'Discente', '2026-06-30 17:25:37.839638')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:37 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_disc2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_disc2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/152/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Discente Count (0.4ms)  SELECT COUNT(*) FROM `usuarios` WHERE `usuarios`.`type` = 'Discente'
+ +

Started POST “/discentes” for 127.0.0.1 at 2026-06-30 14:25:38 -0300 Processing by DiscentesController#create as HTML

+ +
Parameters: {"discente" => {"nome" => "Novo Aluno", "matricula" => "disc_novo", "email" => "[FILTERED]", "curso_id" => "22"}}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 152 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'disc_novo' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'disc_novo@unb.br' LIMIT 1
+Discente Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:38.033494', 22, NULL, NULL, NULL, 'disc_novo@unb.br', NULL, 'disc_novo', 'Novo Aluno', NULL, NULL, NULL, 'Discente', '2026-06-30 17:25:38.033494')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/discentes/154 Completed 302 Found in 3ms (ActiveRecord: 1.6ms (4 queries, 0 cached) | GC: 0.0ms)

+ +
Discente Count (0.2ms)  SELECT COUNT(*) FROM `usuarios` WHERE `usuarios`.`type` = 'Discente'
+Discente Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Discente' ORDER BY `usuarios`.`id` DESC LIMIT 1
+TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_disc2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_disc2@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:38.225500', NULL, NULL, NULL, NULL, 'doc_disc2@unb.br', 'Doutorado', 'doc_disc2', 'Docente Disc2', NULL, NULL, '$2a$12$7kcRaN.0OHrWjgXDfFmEQ.LpJsIBQrs0yeRJs7tpQUJbQplc7xpWG', 'Docente', '2026-06-30 17:25:38.225500')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:38.227751', 'Ciência da Computação', '2026-06-30 17:25:38.227751')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Curso Load (0.2ms)  SELECT `cursos`.* FROM `cursos` WHERE `cursos`.`nome` = 'Engenharia de Software' AND `cursos`.`codigo` = 'ESW_D' AND `cursos`.`departamento_id` = 147 LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Curso Exists? (0.4ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`codigo` = 'ESW_D' LIMIT 1
+Curso Create (0.2ms)  INSERT INTO `cursos` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('ESW_D', '2026-06-30 17:25:38.229266', 147, 'Engenharia de Software', '2026-06-30 17:25:38.229266')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'disc_teste' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'disc_teste@unb.br' LIMIT 1
+Discente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:38.418351', 23, NULL, NULL, NULL, 'disc_teste@unb.br', NULL, 'disc_teste', 'Discente Teste', NULL, NULL, '$2a$12$9wMbOrnEslnCffsZB2AVAO/.EacM.XUIEWmm1WLhU9DA/VwP5BRLq', 'Discente', '2026-06-30 17:25:38.418351')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:38 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_disc2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_disc2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/155/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Discente Count (0.5ms)  SELECT COUNT(*) FROM `usuarios` WHERE `usuarios`.`type` = 'Discente'
+ +

Started POST “/discentes” for 127.0.0.1 at 2026-06-30 14:25:38 -0300 Processing by DiscentesController#create as HTML

+ +
Parameters: {"discente" => {"nome" => "", "matricula" => "", "email" => "[FILTERED]", "curso_id" => nil}}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 155 LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = '' LIMIT 1
+TRANSACTION (0.1ms)  ROLLBACK TO SAVEPOINT active_record_1
+Rendering layout layouts/application.html.erb
+Rendering discentes/new.html.erb within layouts/application
+Rendered discentes/_form.html.erb (Duration: 2.1ms | GC: 0.0ms)
+Rendered discentes/new.html.erb within layouts/application (Duration: 2.1ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 2.4ms | GC: 0.0ms)
+ +

Completed 422 Unprocessable Content in 5ms (Views: 2.5ms | ActiveRecord: 1.3ms (3 queries, 0 cached) | GC: 0.0ms)

+ +
Discente Count (0.2ms)  SELECT COUNT(*) FROM `usuarios` WHERE `usuarios`.`type` = 'Discente'
+TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_disc2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_disc2@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:38.806043', NULL, NULL, NULL, NULL, 'doc_disc2@unb.br', 'Doutorado', 'doc_disc2', 'Docente Disc2', NULL, NULL, '$2a$12$eoucXFr6EpA.EDzGkMDLgej.8VsvSyamOQbO0tfvUQQn9LJtkZjKG', 'Docente', '2026-06-30 17:25:38.806043')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.4ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:38.808527', 'Ciência da Computação', '2026-06-30 17:25:38.808527')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Curso Load (0.3ms)  SELECT `cursos`.* FROM `cursos` WHERE `cursos`.`nome` = 'Engenharia de Software' AND `cursos`.`codigo` = 'ESW_D' AND `cursos`.`departamento_id` = 148 LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Curso Exists? (0.4ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`codigo` = 'ESW_D' LIMIT 1
+Curso Create (0.3ms)  INSERT INTO `cursos` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('ESW_D', '2026-06-30 17:25:38.810185', 148, 'Engenharia de Software', '2026-06-30 17:25:38.810185')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'disc_teste' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'disc_teste@unb.br' LIMIT 1
+Discente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:38.998887', 24, NULL, NULL, NULL, 'disc_teste@unb.br', NULL, 'disc_teste', 'Discente Teste', NULL, NULL, '$2a$12$DgfWZ2DZz.Qy0P.hiCphI.BzmV6Qd4kfXMTmmbLxr8/3cX5liKgWe', 'Discente', '2026-06-30 17:25:38.998887')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:39 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_disc2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_disc2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/157/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/discentes/158” for 127.0.0.1 at 2026-06-30 14:25:39 -0300 Processing by DiscentesController#show as HTML

+ +
Parameters: {"id" => "158"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 157 LIMIT 1
+Discente Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Discente' AND `usuarios`.`id` = 158 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering discentes/show.html.erb within layouts/application
+Rendered discentes/_discente.html.erb (Duration: 0.0ms | GC: 0.0ms)
+Rendered discentes/show.html.erb within layouts/application (Duration: 0.4ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.6ms | GC: 0.0ms)
+ +

Completed 200 OK in 3ms (Views: 0.7ms | ActiveRecord: 0.5ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_disc2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_disc2@unb.br' LIMIT 1
+Docente Create (0.8ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:39.381595', NULL, NULL, NULL, NULL, 'doc_disc2@unb.br', 'Doutorado', 'doc_disc2', 'Docente Disc2', NULL, NULL, '$2a$12$Vhr08XTt15KiW15Dqh/BH.dGx1fD6Zrf/OIZDQrX5y529/4IEt706', 'Docente', '2026-06-30 17:25:39.381595')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:39.384121', 'Ciência da Computação', '2026-06-30 17:25:39.384121')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Curso Load (0.2ms)  SELECT `cursos`.* FROM `cursos` WHERE `cursos`.`nome` = 'Engenharia de Software' AND `cursos`.`codigo` = 'ESW_D' AND `cursos`.`departamento_id` = 149 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Curso Exists? (0.4ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`codigo` = 'ESW_D' LIMIT 1
+Curso Create (0.2ms)  INSERT INTO `cursos` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('ESW_D', '2026-06-30 17:25:39.385673', 149, 'Engenharia de Software', '2026-06-30 17:25:39.385673')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'disc_teste' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'disc_teste@unb.br' LIMIT 1
+Discente Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:39.574308', 25, NULL, NULL, NULL, 'disc_teste@unb.br', NULL, 'disc_teste', 'Discente Teste', NULL, NULL, '$2a$12$5qyEtuWVb1cDQuFElLuWa.rhxlH55KynrENe5ukJSbNe.xKkVfaKe', 'Discente', '2026-06-30 17:25:39.574308')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:39 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_disc2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_disc2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/159/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/discentes/160/edit” for 127.0.0.1 at 2026-06-30 14:25:39 -0300 Processing by DiscentesController#edit as HTML

+ +
Parameters: {"id" => "160"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 159 LIMIT 1
+Discente Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Discente' AND `usuarios`.`id` = 160 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering discentes/edit.html.erb within layouts/application
+Rendered discentes/_form.html.erb (Duration: 0.6ms | GC: 0.0ms)
+Rendered discentes/edit.html.erb within layouts/application (Duration: 0.8ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.1ms | GC: 0.0ms)
+ +

Completed 200 OK in 3ms (Views: 1.2ms | ActiveRecord: 0.7ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_disc2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_disc2@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:39.958331', NULL, NULL, NULL, NULL, 'doc_disc2@unb.br', 'Doutorado', 'doc_disc2', 'Docente Disc2', NULL, NULL, '$2a$12$JUyAYjqwKGjp.XXgjx9C5u4.rjfpQ4Jz6XORdap8lHsNx6fCdH7tG', 'Docente', '2026-06-30 17:25:39.958331')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:39.960405', 'Ciência da Computação', '2026-06-30 17:25:39.960405')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Curso Load (0.2ms)  SELECT `cursos`.* FROM `cursos` WHERE `cursos`.`nome` = 'Engenharia de Software' AND `cursos`.`codigo` = 'ESW_D' AND `cursos`.`departamento_id` = 150 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Curso Exists? (0.4ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`codigo` = 'ESW_D' LIMIT 1
+Curso Create (0.3ms)  INSERT INTO `cursos` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('ESW_D', '2026-06-30 17:25:39.961848', 150, 'Engenharia de Software', '2026-06-30 17:25:39.961848')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'disc_teste' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'disc_teste@unb.br' LIMIT 1
+Discente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:40.150588', 26, NULL, NULL, NULL, 'disc_teste@unb.br', NULL, 'disc_teste', 'Discente Teste', NULL, NULL, '$2a$12$wiv9xpwV2S4O1BSMLRpy7.0y26GAeejogzgNo283J84wMOkPVzbX.', 'Discente', '2026-06-30 17:25:40.150588')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:40 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_disc2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_disc2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/161/avaliacoes Completed 302 Found in 190ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started PATCH “/discentes/162” for 127.0.0.1 at 2026-06-30 14:25:40 -0300 Processing by DiscentesController#update as HTML

+ +
Parameters: {"discente" => {"nome" => "Aluno Atualizado", "matricula" => "disc_teste", "email" => "[FILTERED]", "curso_id" => "26"}, "id" => "162"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 161 LIMIT 1
+Discente Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Discente' AND `usuarios`.`id` = 162 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'disc_teste@unb.br' AND `usuarios`.`id` != 162 LIMIT 1
+Discente Update (0.4ms)  UPDATE `usuarios` SET `usuarios`.`nome` = 'Aluno Atualizado', `usuarios`.`updated_at` = '2026-06-30 17:25:40.344812' WHERE `usuarios`.`id` = 162
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/discentes/162 Completed 303 See Other in 3ms (ActiveRecord: 1.7ms (4 queries, 0 cached) | GC: 0.0ms)

+ +
Discente Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Discente' AND `usuarios`.`id` = 162 LIMIT 1
+TRANSACTION (1.3ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_disc2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_disc2@unb.br' LIMIT 1
+Docente Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:40.536819', NULL, NULL, NULL, NULL, 'doc_disc2@unb.br', 'Doutorado', 'doc_disc2', 'Docente Disc2', NULL, NULL, '$2a$12$x3J0NColMi3olxO51DjtD.gkH0iIXX1HFRGfBRKPdyHpfWwe1.LqO', 'Docente', '2026-06-30 17:25:40.536819')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:40.538743', 'Ciência da Computação', '2026-06-30 17:25:40.538743')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Curso Load (0.2ms)  SELECT `cursos`.* FROM `cursos` WHERE `cursos`.`nome` = 'Engenharia de Software' AND `cursos`.`codigo` = 'ESW_D' AND `cursos`.`departamento_id` = 151 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Curso Exists? (0.3ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`codigo` = 'ESW_D' LIMIT 1
+Curso Create (0.2ms)  INSERT INTO `cursos` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('ESW_D', '2026-06-30 17:25:40.540193', 151, 'Engenharia de Software', '2026-06-30 17:25:40.540193')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'disc_teste' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'disc_teste@unb.br' LIMIT 1
+Discente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:40.730385', 27, NULL, NULL, NULL, 'disc_teste@unb.br', NULL, 'disc_teste', 'Discente Teste', NULL, NULL, '$2a$12$xLFEYlCHJ9F8uLs5hIqtGe1oagtObiwL9ldkxAMHXyyWQHqa/Nfzq', 'Discente', '2026-06-30 17:25:40.730385')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:40 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_disc2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_disc2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/163/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started PATCH “/discentes/164” for 127.0.0.1 at 2026-06-30 14:25:40 -0300 Processing by DiscentesController#update as HTML

+ +
Parameters: {"discente" => {"nome" => "", "matricula" => "", "email" => "[FILTERED]", "curso_id" => nil}, "id" => "164"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 163 LIMIT 1
+Discente Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Discente' AND `usuarios`.`id` = 164 LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '' AND `usuarios`.`id` != 164 LIMIT 1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = '' AND `usuarios`.`id` != 164 LIMIT 1
+TRANSACTION (0.2ms)  ROLLBACK TO SAVEPOINT active_record_1
+Rendering layout layouts/application.html.erb
+Rendering discentes/edit.html.erb within layouts/application
+Rendered discentes/_form.html.erb (Duration: 2.1ms | GC: 0.0ms)
+Rendered discentes/edit.html.erb within layouts/application (Duration: 2.2ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 2.4ms | GC: 0.0ms)
+ +

Completed 422 Unprocessable Content in 6ms (Views: 2.6ms | ActiveRecord: 1.6ms (4 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_disc2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_disc2@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:41.119587', NULL, NULL, NULL, NULL, 'doc_disc2@unb.br', 'Doutorado', 'doc_disc2', 'Docente Disc2', NULL, NULL, '$2a$12$inxbX99Gdv46uVFIcuMFjeFzTFrlzMMvb71VKfzZIJ/A01HXFngx.', 'Docente', '2026-06-30 17:25:41.119587')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:41.122003', 'Ciência da Computação', '2026-06-30 17:25:41.122003')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Curso Load (0.2ms)  SELECT `cursos`.* FROM `cursos` WHERE `cursos`.`nome` = 'Engenharia de Software' AND `cursos`.`codigo` = 'ESW_D' AND `cursos`.`departamento_id` = 152 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Curso Exists? (0.3ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`codigo` = 'ESW_D' LIMIT 1
+Curso Create (0.3ms)  INSERT INTO `cursos` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('ESW_D', '2026-06-30 17:25:41.123568', 152, 'Engenharia de Software', '2026-06-30 17:25:41.123568')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'disc_teste' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'disc_teste@unb.br' LIMIT 1
+Discente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:41.314508', 28, NULL, NULL, NULL, 'disc_teste@unb.br', NULL, 'disc_teste', 'Discente Teste', NULL, NULL, '$2a$12$VGPDEhN9QPSRX6gS5ML0J.crSKPSTTkHoPAO.1yoU5xc5K1OAN8mG', 'Discente', '2026-06-30 17:25:41.314508')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:41 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_disc2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_disc2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/165/avaliacoes Completed 302 Found in 190ms (ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.5ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'del_disc' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'del_disc@unb.br' LIMIT 1
+Discente Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:41.507935', 28, NULL, NULL, NULL, 'del_disc@unb.br', NULL, 'del_disc', 'Para Deletar', NULL, NULL, NULL, 'Discente', '2026-06-30 17:25:41.507935')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Discente Count (0.2ms)  SELECT COUNT(*) FROM `usuarios` WHERE `usuarios`.`type` = 'Discente'
+ +

Started DELETE “/discentes/167” for 127.0.0.1 at 2026-06-30 14:25:41 -0300 Processing by DiscentesController#destroy as HTML

+ +
Parameters: {"id" => "167"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 165 LIMIT 1
+Discente Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Discente' AND `usuarios`.`id` = 167 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Discente::HABTM_Turmas Delete All (0.3ms)  DELETE FROM `discentes_turmas` WHERE `discentes_turmas`.`discente_id` = 167
+Discente Destroy (0.3ms)  DELETE FROM `usuarios` WHERE `usuarios`.`id` = 167
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/discentes Completed 303 See Other in 7ms (ActiveRecord: 4.0ms (4 queries, 0 cached) | GC: 0.0ms)

+ +
Discente Count (0.2ms)  SELECT COUNT(*) FROM `usuarios` WHERE `usuarios`.`type` = 'Discente'
+TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_disc' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_disc@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:41.708714', NULL, NULL, NULL, NULL, 'doc_disc@unb.br', 'Doutorado', 'doc_disc', 'Docente Disc', NULL, NULL, '$2a$12$jiBJZttfl648SHUtyIJhBuIz9yNukdFB3GDKrnT85mK4cs9bh9DBq', 'Docente', '2026-06-30 17:25:41.708714')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:41.711212', 'Ciência da Computação', '2026-06-30 17:25:41.711212')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.6ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'MAT001D' LIMIT 1
+Disciplina Create (0.3ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('MAT001D', '2026-06-30 17:25:41.712635', 153, 'Álgebra Linear', '2026-06-30 17:25:41.712635')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:41 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_disc@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_disc@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/168/avaliacoes Completed 302 Found in 190ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started DELETE “/logout” for 127.0.0.1 at 2026-06-30 14:25:41 -0300 Processing by SessionsController#destroy as HTML Redirected to www.example.com/ Completed 302 Found in 0ms (ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 0.0ms) Started GET “/disciplinas” for 127.0.0.1 at 2026-06-30 14:25:41 -0300 Processing by DisciplinasController#index as HTML

+ +
Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+ +

Redirected to www.example.com/ Filter chain halted as :require_login rendered or redirected Completed 302 Found in 1ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_disc' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_disc@unb.br' LIMIT 1
+Docente Create (0.8ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:42.097487', NULL, NULL, NULL, NULL, 'doc_disc@unb.br', 'Doutorado', 'doc_disc', 'Docente Disc', NULL, NULL, '$2a$12$EpDB09A8iIzfTI5fV3eLD.8.5hMNQ5Td9PridMJjhxd5a1kshChKS', 'Docente', '2026-06-30 17:25:42.097487')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:42.099990', 'Ciência da Computação', '2026-06-30 17:25:42.099990')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'MAT001D' LIMIT 1
+Disciplina Create (0.3ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('MAT001D', '2026-06-30 17:25:42.101113', 154, 'Álgebra Linear', '2026-06-30 17:25:42.101113')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:42 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_disc@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_disc@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/169/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/disciplinas” for 127.0.0.1 at 2026-06-30 14:25:42 -0300 Processing by DisciplinasController#index as HTML

+ +
Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 169 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering disciplinas/index.html.erb within layouts/application
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas`
+Rendered disciplinas/_disciplina.html.erb (Duration: 0.1ms | GC: 0.0ms)
+Rendered disciplinas/index.html.erb within layouts/application (Duration: 1.1ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 3ms (Views: 1.6ms | ActiveRecord: 0.6ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.3ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_disc' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_disc@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:42.485235', NULL, NULL, NULL, NULL, 'doc_disc@unb.br', 'Doutorado', 'doc_disc', 'Docente Disc', NULL, NULL, '$2a$12$XqfWxSYiNnxqMxcihoSw2eUbRePzjvlUNgEVkEzgjIiVrPL8Uq2si', 'Docente', '2026-06-30 17:25:42.485235')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:42.487509', 'Ciência da Computação', '2026-06-30 17:25:42.487509')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.4ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'MAT001D' LIMIT 1
+Disciplina Create (0.3ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('MAT001D', '2026-06-30 17:25:42.488689', 155, 'Álgebra Linear', '2026-06-30 17:25:42.488689')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:42 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_disc@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_disc@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/170/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/disciplinas/new” for 127.0.0.1 at 2026-06-30 14:25:42 -0300 Processing by DisciplinasController#new as HTML

+ +
Usuario Load (0.5ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 170 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering disciplinas/new.html.erb within layouts/application
+Rendered disciplinas/_form.html.erb (Duration: 0.6ms | GC: 0.0ms)
+Rendered disciplinas/new.html.erb within layouts/application (Duration: 0.9ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.2ms | GC: 0.0ms)
+ +

Completed 200 OK in 3ms (Views: 1.3ms | ActiveRecord: 0.5ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_disc' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_disc@unb.br' LIMIT 1
+Docente Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:42.872684', NULL, NULL, NULL, NULL, 'doc_disc@unb.br', 'Doutorado', 'doc_disc', 'Docente Disc', NULL, NULL, '$2a$12$KOV/zBgi0ypDgyyF0Ib1B./y9aX47BVCdn3RZ3dXn8fvkEfvffE0.', 'Docente', '2026-06-30 17:25:42.872684')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:42.875292', 'Ciência da Computação', '2026-06-30 17:25:42.875292')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.4ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'MAT001D' LIMIT 1
+Disciplina Create (0.3ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('MAT001D', '2026-06-30 17:25:42.876480', 156, 'Álgebra Linear', '2026-06-30 17:25:42.876480')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:42 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_disc@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_disc@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/171/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Disciplina Count (0.3ms)  SELECT COUNT(*) FROM `disciplinas`
+ +

Started POST “/disciplinas” for 127.0.0.1 at 2026-06-30 14:25:43 -0300 Processing by DisciplinasController#create as HTML

+ +
Parameters: {"disciplina" => {"nome" => "Cálculo 1", "codigo" => "MAT002D", "departamento_id" => "156"}}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 171 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Load (0.4ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`id` = 156 LIMIT 1
+Disciplina Exists? (0.2ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'MAT002D' LIMIT 1
+Disciplina Create (0.3ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('MAT002D', '2026-06-30 17:25:43.068862', 156, 'Cálculo 1', '2026-06-30 17:25:43.068862')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/disciplinas/70 Completed 302 Found in 3ms (ActiveRecord: 1.4ms (4 queries, 0 cached) | GC: 0.0ms)

+ +
Disciplina Count (0.2ms)  SELECT COUNT(*) FROM `disciplinas`
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` ORDER BY `disciplinas`.`id` DESC LIMIT 1
+TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_disc' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_disc@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:43.260877', NULL, NULL, NULL, NULL, 'doc_disc@unb.br', 'Doutorado', 'doc_disc', 'Docente Disc', NULL, NULL, '$2a$12$P3PkWQWUSQZBpPEFd8ehCOAGSrmKk9EeOgtP6CnTa1SiJRH114/YO', 'Docente', '2026-06-30 17:25:43.260877')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:43.263120', 'Ciência da Computação', '2026-06-30 17:25:43.263120')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'MAT001D' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('MAT001D', '2026-06-30 17:25:43.264191', 157, 'Álgebra Linear', '2026-06-30 17:25:43.264191')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:43 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_disc@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_disc@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/172/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Disciplina Count (0.2ms)  SELECT COUNT(*) FROM `disciplinas`
+ +

Started POST “/disciplinas” for 127.0.0.1 at 2026-06-30 14:25:43 -0300 Processing by DisciplinasController#create as HTML

+ +
Parameters: {"disciplina" => {"nome" => "", "codigo" => "", "departamento_id" => "157"}}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 172 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`id` = 157 LIMIT 1
+Disciplina Exists? (0.2ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = '' LIMIT 1
+TRANSACTION (0.1ms)  ROLLBACK TO SAVEPOINT active_record_1
+Rendering layout layouts/application.html.erb
+Rendering disciplinas/new.html.erb within layouts/application
+Rendered disciplinas/_form.html.erb (Duration: 0.9ms | GC: 0.0ms)
+Rendered disciplinas/new.html.erb within layouts/application (Duration: 1.0ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.2ms | GC: 0.0ms)
+ +

Completed 422 Unprocessable Content in 3ms (Views: 1.4ms | ActiveRecord: 1.0ms (3 queries, 0 cached) | GC: 0.0ms)

+ +
Disciplina Count (0.2ms)  SELECT COUNT(*) FROM `disciplinas`
+TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_disc' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_disc@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:43.648164', NULL, NULL, NULL, NULL, 'doc_disc@unb.br', 'Doutorado', 'doc_disc', 'Docente Disc', NULL, NULL, '$2a$12$110jlkGAS.CuQ28Y5gdMO.sFMfLjPTkbDQCpAvQEXrQ2DKGRjzNu6', 'Docente', '2026-06-30 17:25:43.648164')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:43.650215', 'Ciência da Computação', '2026-06-30 17:25:43.650215')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.4ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'MAT001D' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('MAT001D', '2026-06-30 17:25:43.651332', 158, 'Álgebra Linear', '2026-06-30 17:25:43.651332')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:43 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_disc@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_disc@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/173/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/disciplinas/72” for 127.0.0.1 at 2026-06-30 14:25:43 -0300 Processing by DisciplinasController#show as HTML

+ +
Parameters: {"id" => "72"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 173 LIMIT 1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`id` = 72 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering disciplinas/show.html.erb within layouts/application
+Rendered disciplinas/_disciplina.html.erb (Duration: 0.0ms | GC: 0.0ms)
+Rendered disciplinas/show.html.erb within layouts/application (Duration: 0.4ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.6ms | GC: 0.0ms)
+ +

Completed 200 OK in 3ms (Views: 0.7ms | ActiveRecord: 0.6ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_disc' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_disc@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:44.033987', NULL, NULL, NULL, NULL, 'doc_disc@unb.br', 'Doutorado', 'doc_disc', 'Docente Disc', NULL, NULL, '$2a$12$L10wuWQbhltmZzApxbeFF.Hu2wIPmZzQTKzRSV/7FpFbyZRGlEjWm', 'Docente', '2026-06-30 17:25:44.033987')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:44.036007', 'Ciência da Computação', '2026-06-30 17:25:44.036007')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.4ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'MAT001D' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('MAT001D', '2026-06-30 17:25:44.037122', 159, 'Álgebra Linear', '2026-06-30 17:25:44.037122')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:44 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_disc@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_disc@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/174/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/disciplinas/73/edit” for 127.0.0.1 at 2026-06-30 14:25:44 -0300 Processing by DisciplinasController#edit as HTML

+ +
Parameters: {"id" => "73"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 174 LIMIT 1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`id` = 73 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering disciplinas/edit.html.erb within layouts/application
+Rendered disciplinas/_form.html.erb (Duration: 0.4ms | GC: 0.0ms)
+Rendered disciplinas/edit.html.erb within layouts/application (Duration: 0.6ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.9ms | GC: 0.0ms)
+ +

Completed 200 OK in 2ms (Views: 1.0ms | ActiveRecord: 0.5ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_disc' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_disc@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:44.418988', NULL, NULL, NULL, NULL, 'doc_disc@unb.br', 'Doutorado', 'doc_disc', 'Docente Disc', NULL, NULL, '$2a$12$Ppfbq7jLW5.UIsrYETaDe.YNfYAVjsSUYlo65KHAAkfvL3F5jNSsS', 'Docente', '2026-06-30 17:25:44.418988')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:44.421225', 'Ciência da Computação', '2026-06-30 17:25:44.421225')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.4ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'MAT001D' LIMIT 1
+Disciplina Create (0.3ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('MAT001D', '2026-06-30 17:25:44.422345', 160, 'Álgebra Linear', '2026-06-30 17:25:44.422345')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:44 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_disc@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_disc@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/175/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started PATCH “/disciplinas/74” for 127.0.0.1 at 2026-06-30 14:25:44 -0300 Processing by DisciplinasController#update as HTML

+ +
Parameters: {"disciplina" => {"nome" => "Álgebra Linear Avançada", "codigo" => "MAT001D", "departamento_id" => "160"}, "id" => "74"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 175 LIMIT 1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`id` = 74 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Update (0.4ms)  UPDATE `disciplinas` SET `disciplinas`.`nome` = 'Álgebra Linear Avançada', `disciplinas`.`updated_at` = '2026-06-30 17:25:44.615010' WHERE `disciplinas`.`id` = 74
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/disciplinas/74 Completed 303 See Other in 4ms (ActiveRecord: 3.0ms (3 queries, 0 cached) | GC: 0.0ms)

+ +
Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`id` = 74 LIMIT 1
+TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_disc' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_disc@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:44.806804', NULL, NULL, NULL, NULL, 'doc_disc@unb.br', 'Doutorado', 'doc_disc', 'Docente Disc', NULL, NULL, '$2a$12$MT0b.8uMhdfdardGvb4cfuhTnSyLmXrj56YY8qn9/GguW7OVr9wtq', 'Docente', '2026-06-30 17:25:44.806804')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:44.809070', 'Ciência da Computação', '2026-06-30 17:25:44.809070')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.4ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'MAT001D' LIMIT 1
+Disciplina Create (0.3ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('MAT001D', '2026-06-30 17:25:44.810204', 161, 'Álgebra Linear', '2026-06-30 17:25:44.810204')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:44 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_disc@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_disc@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/176/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started PATCH “/disciplinas/75” for 127.0.0.1 at 2026-06-30 14:25:44 -0300 Processing by DisciplinasController#update as HTML

+ +
Parameters: {"disciplina" => {"nome" => "", "codigo" => "", "departamento_id" => "161"}, "id" => "75"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 176 LIMIT 1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`id` = 75 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.4ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = '' AND `disciplinas`.`id` != 75 LIMIT 1
+TRANSACTION (0.1ms)  ROLLBACK TO SAVEPOINT active_record_1
+Rendering layout layouts/application.html.erb
+Rendering disciplinas/edit.html.erb within layouts/application
+Rendered disciplinas/_form.html.erb (Duration: 1.0ms | GC: 0.0ms)
+Rendered disciplinas/edit.html.erb within layouts/application (Duration: 1.1ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.3ms | GC: 0.0ms)
+ +

Completed 422 Unprocessable Content in 4ms (Views: 1.5ms | ActiveRecord: 1.2ms (3 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_disc' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_disc@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:45.193883', NULL, NULL, NULL, NULL, 'doc_disc@unb.br', 'Doutorado', 'doc_disc', 'Docente Disc', NULL, NULL, '$2a$12$aDc7nQvDltoH/ASPBimQvOVGnKijEDfEHlN/MLYfDmYKaAnUqt7WO', 'Docente', '2026-06-30 17:25:45.193883')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:45.196061', 'Ciência da Computação', '2026-06-30 17:25:45.196061')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'MAT001D' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('MAT001D', '2026-06-30 17:25:45.197200', 162, 'Álgebra Linear', '2026-06-30 17:25:45.197200')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:45 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_disc@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_disc@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/177/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.5ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'DEL001D' LIMIT 1
+Disciplina Create (0.3ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('DEL001D', '2026-06-30 17:25:45.389252', 162, 'Para Deletar', '2026-06-30 17:25:45.389252')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Count (0.2ms)  SELECT COUNT(*) FROM `disciplinas`
+ +

Started DELETE “/disciplinas/77” for 127.0.0.1 at 2026-06-30 14:25:45 -0300 Processing by DisciplinasController#destroy as HTML

+ +
Parameters: {"id" => "77"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 177 LIMIT 1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`id` = 77 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Load (0.4ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`disciplina_id` = 77
+Disciplina Destroy (0.3ms)  DELETE FROM `disciplinas` WHERE `disciplinas`.`id` = 77
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/disciplinas Completed 303 See Other in 2ms (ActiveRecord: 1.3ms (4 queries, 0 cached) | GC: 0.0ms)

+ +
Disciplina Count (0.2ms)  SELECT COUNT(*) FROM `disciplinas`
+TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_princ' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_princ@unb.br' LIMIT 1
+Docente Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:45.583841', NULL, NULL, NULL, NULL, 'doc_princ@unb.br', 'Doutorado', 'doc_princ', 'Docente Principal', NULL, NULL, '$2a$12$LotHEyHW.ALErGFrm160H.1Rc5xmhCqMWbGMIVZMbN0NIK5kcaU0G', 'Docente', '2026-06-30 17:25:45.583841')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:45 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_princ@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_princ@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/178/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started DELETE “/logout” for 127.0.0.1 at 2026-06-30 14:25:45 -0300 Processing by SessionsController#destroy as HTML Redirected to www.example.com/ Completed 302 Found in 0ms (ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 0.0ms) Started GET “/docentes” for 127.0.0.1 at 2026-06-30 14:25:45 -0300 Processing by DocentesController#index as HTML

+ +
Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+ +

Redirected to www.example.com/ Filter chain halted as :require_login rendered or redirected Completed 302 Found in 1ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_princ' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_princ@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:45.973535', NULL, NULL, NULL, NULL, 'doc_princ@unb.br', 'Doutorado', 'doc_princ', 'Docente Principal', NULL, NULL, '$2a$12$AePPQOZ7QbDsfvg.7tfXIOZVbJxCShg2tcNR8akLoo1MnZ5wFEsCq', 'Docente', '2026-06-30 17:25:45.973535')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:45 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_princ@unb.br", "senha" => "Senha123"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_princ@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/179/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/docentes” for 127.0.0.1 at 2026-06-30 14:25:46 -0300 Processing by DocentesController#index as HTML

+ +
Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 179 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering docentes/index.html.erb within layouts/application
+Docente Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Docente'
+Rendered docentes/_docente.html.erb (Duration: 0.1ms | GC: 0.0ms)
+Rendered docentes/index.html.erb within layouts/application (Duration: 1.3ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.5ms | GC: 0.0ms)
+ +

Completed 200 OK in 6ms (Views: 1.9ms | ActiveRecord: 0.6ms (2 queries, 0 cached) | GC: 0.3ms)

+ +
TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_princ' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_princ@unb.br' LIMIT 1
+Docente Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:46.362183', NULL, NULL, NULL, NULL, 'doc_princ@unb.br', 'Doutorado', 'doc_princ', 'Docente Principal', NULL, NULL, '$2a$12$S8h9jQZe08CMCLo5rYcTNe3XukgHZwwWgP6POQ77nRf8bSoWMLOzK', 'Docente', '2026-06-30 17:25:46.362183')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:46 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_princ@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_princ@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/180/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/docentes/new” for 127.0.0.1 at 2026-06-30 14:25:46 -0300 Processing by DocentesController#new as HTML

+ +
Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 180 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering docentes/new.html.erb within layouts/application
+Rendered docentes/_form.html.erb (Duration: 0.8ms | GC: 0.0ms)
+Rendered docentes/new.html.erb within layouts/application (Duration: 1.2ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.8ms | GC: 0.3ms)
+ +

Completed 200 OK in 4ms (Views: 2.0ms | ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.3ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_princ' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_princ@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:46.748166', NULL, NULL, NULL, NULL, 'doc_princ@unb.br', 'Doutorado', 'doc_princ', 'Docente Principal', NULL, NULL, '$2a$12$cNEnroIO0.UJEnyURMcTQuQo567TYT6GVsNTIKaLC0sxJ54x2SaRG', 'Docente', '2026-06-30 17:25:46.748166')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:46 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_princ@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_princ@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/181/avaliacoes Completed 302 Found in 194ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Docente Count (0.4ms)  SELECT COUNT(*) FROM `usuarios` WHERE `usuarios`.`type` = 'Docente'
+ +

Started POST “/docentes” for 127.0.0.1 at 2026-06-30 14:25:46 -0300 Processing by DocentesController#create as HTML

+ +
Parameters: {"docente" => {"nome" => "Novo Docente", "matricula" => "doc_novo", "email" => "[FILTERED]", "formacao" => "Mestrado"}}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 181 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_novo' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_novo@unb.br' LIMIT 1
+Docente Create (0.3ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:46.947903', NULL, NULL, NULL, NULL, 'doc_novo@unb.br', 'Mestrado', 'doc_novo', 'Novo Docente', NULL, NULL, NULL, 'Docente', '2026-06-30 17:25:46.947903')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/docentes/182 Completed 302 Found in 3ms (ActiveRecord: 1.4ms (4 queries, 0 cached) | GC: 0.0ms)

+ +
Docente Count (0.2ms)  SELECT COUNT(*) FROM `usuarios` WHERE `usuarios`.`type` = 'Docente'
+Docente Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Docente' ORDER BY `usuarios`.`id` DESC LIMIT 1
+TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_princ' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_princ@unb.br' LIMIT 1
+Docente Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:47.140172', NULL, NULL, NULL, NULL, 'doc_princ@unb.br', 'Doutorado', 'doc_princ', 'Docente Principal', NULL, NULL, '$2a$12$/VbyGG4x5gEDpx8dOa60f.u4xtnKI2pSn..Cb/vWD1unhKboElreG', 'Docente', '2026-06-30 17:25:47.140172')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:47 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_princ@unb.br", "senha" => "Senha123"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_princ@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/183/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Docente Count (0.5ms)  SELECT COUNT(*) FROM `usuarios` WHERE `usuarios`.`type` = 'Docente'
+ +

Started POST “/docentes” for 127.0.0.1 at 2026-06-30 14:25:47 -0300 Processing by DocentesController#create as HTML

+ +
Parameters: {"docente" => {"nome" => "", "matricula" => "", "email" => "[FILTERED]", "formacao" => ""}}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 183 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = '' LIMIT 1
+TRANSACTION (0.1ms)  ROLLBACK TO SAVEPOINT active_record_1
+Rendering layout layouts/application.html.erb
+Rendering docentes/new.html.erb within layouts/application
+Rendered docentes/_form.html.erb (Duration: 2.3ms | GC: 0.3ms)
+Rendered docentes/new.html.erb within layouts/application (Duration: 2.4ms | GC: 0.3ms)
+Rendered layout layouts/application.html.erb (Duration: 2.9ms | GC: 0.5ms)
+ +

Completed 422 Unprocessable Content in 5ms (Views: 3.1ms | ActiveRecord: 1.2ms (3 queries, 0 cached) | GC: 0.5ms)

+ +
Docente Count (0.2ms)  SELECT COUNT(*) FROM `usuarios` WHERE `usuarios`.`type` = 'Docente'
+TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_princ' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_princ@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:47.528116', NULL, NULL, NULL, NULL, 'doc_princ@unb.br', 'Doutorado', 'doc_princ', 'Docente Principal', NULL, NULL, '$2a$12$hVLzAhmlHp7orJxNIpiSGuk3LP4Gkzk8Mq3k/dxdF.76ZlI7AmZxu', 'Docente', '2026-06-30 17:25:47.528116')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:47 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_princ@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_princ@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/184/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/docentes/184” for 127.0.0.1 at 2026-06-30 14:25:47 -0300 Processing by DocentesController#show as HTML

+ +
Parameters: {"id" => "184"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 184 LIMIT 1
+Docente Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Docente' AND `usuarios`.`id` = 184 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering docentes/show.html.erb within layouts/application
+Rendered docentes/_docente.html.erb (Duration: 0.0ms | GC: 0.0ms)
+Rendered docentes/show.html.erb within layouts/application (Duration: 0.4ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.6ms | GC: 0.0ms)
+ +

Completed 200 OK in 3ms (Views: 0.8ms | ActiveRecord: 0.6ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_princ' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_princ@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:47.911441', NULL, NULL, NULL, NULL, 'doc_princ@unb.br', 'Doutorado', 'doc_princ', 'Docente Principal', NULL, NULL, '$2a$12$OVKrmjblcSlk7NEDxOvmuOtxw/o8icwO2xgVHzQ2IJzuPg1e/li0K', 'Docente', '2026-06-30 17:25:47.911441')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:47 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_princ@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_princ@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/185/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/docentes/185/edit” for 127.0.0.1 at 2026-06-30 14:25:48 -0300 Processing by DocentesController#edit as HTML

+ +
Parameters: {"id" => "185"}
+Usuario Load (0.5ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 185 LIMIT 1
+Docente Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Docente' AND `usuarios`.`id` = 185 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering docentes/edit.html.erb within layouts/application
+Rendered docentes/_form.html.erb (Duration: 0.5ms | GC: 0.0ms)
+Rendered docentes/edit.html.erb within layouts/application (Duration: 0.8ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.0ms | GC: 0.0ms)
+ +

Completed 200 OK in 3ms (Views: 1.1ms | ActiveRecord: 0.9ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_princ' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_princ@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:48.296442', NULL, NULL, NULL, NULL, 'doc_princ@unb.br', 'Doutorado', 'doc_princ', 'Docente Principal', NULL, NULL, '$2a$12$zstIKO6GWiyrK2GdBy3zquVh13Kozm2DBXwsKkFhwWQ6aE37D.cP6', 'Docente', '2026-06-30 17:25:48.296442')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:48 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_princ@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_princ@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/186/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started PATCH “/docentes/186” for 127.0.0.1 at 2026-06-30 14:25:48 -0300 Processing by DocentesController#update as HTML

+ +
Parameters: {"docente" => {"nome" => "Nome Atualizado", "matricula" => "doc_princ", "email" => "[FILTERED]", "formacao" => "PhD"}, "id" => "186"}
+Usuario Load (0.5ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 186 LIMIT 1
+Docente Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Docente' AND `usuarios`.`id` = 186 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_princ@unb.br' AND `usuarios`.`id` != 186 LIMIT 1
+Docente Update (0.4ms)  UPDATE `usuarios` SET `usuarios`.`formacao` = 'PhD', `usuarios`.`nome` = 'Nome Atualizado', `usuarios`.`updated_at` = '2026-06-30 17:25:48.489607' WHERE `usuarios`.`id` = 186
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/docentes/186 Completed 303 See Other in 3ms (ActiveRecord: 1.8ms (4 queries, 0 cached) | GC: 0.0ms)

+ +
Docente Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Docente' AND `usuarios`.`id` = 186 LIMIT 1
+TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_princ' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_princ@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:48.680866', NULL, NULL, NULL, NULL, 'doc_princ@unb.br', 'Doutorado', 'doc_princ', 'Docente Principal', NULL, NULL, '$2a$12$9HZCAwmsSeisoT5ziXBIZO3Yl4IW/Siur8ent3AgQZWCXbeUYsOmi', 'Docente', '2026-06-30 17:25:48.680866')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:48 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_princ@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_princ@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/187/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started PATCH “/docentes/187” for 127.0.0.1 at 2026-06-30 14:25:48 -0300 Processing by DocentesController#update as HTML

+ +
Parameters: {"docente" => {"nome" => "", "matricula" => "", "email" => "[FILTERED]", "formacao" => ""}, "id" => "187"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 187 LIMIT 1
+Docente Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Docente' AND `usuarios`.`id` = 187 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '' AND `usuarios`.`id` != 187 LIMIT 1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = '' AND `usuarios`.`id` != 187 LIMIT 1
+TRANSACTION (0.1ms)  ROLLBACK TO SAVEPOINT active_record_1
+Rendering layout layouts/application.html.erb
+Rendering docentes/edit.html.erb within layouts/application
+Rendered docentes/_form.html.erb (Duration: 2.1ms | GC: 0.2ms)
+Rendered docentes/edit.html.erb within layouts/application (Duration: 2.2ms | GC: 0.2ms)
+Rendered layout layouts/application.html.erb (Duration: 2.5ms | GC: 0.2ms)
+ +

Completed 422 Unprocessable Content in 6ms (Views: 2.6ms | ActiveRecord: 1.5ms (4 queries, 0 cached) | GC: 0.2ms)

+ +
TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_princ' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_princ@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:49.067423', NULL, NULL, NULL, NULL, 'doc_princ@unb.br', 'Doutorado', 'doc_princ', 'Docente Principal', NULL, NULL, '$2a$12$zbjbPrFQxQaLlhFgx7uD9ODNIvtyTaQlE66FJptSslYQHL1DOq6ai', 'Docente', '2026-06-30 17:25:49.067423')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:49 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_princ@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_princ@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/188/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.5ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'del_doc' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'del_doc@unb.br' LIMIT 1
+Docente Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:49.258950', NULL, NULL, NULL, NULL, 'del_doc@unb.br', 'Grad', 'del_doc', 'Para Deletar', NULL, NULL, NULL, 'Docente', '2026-06-30 17:25:49.258950')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Docente Count (0.2ms)  SELECT COUNT(*) FROM `usuarios` WHERE `usuarios`.`type` = 'Docente'
+ +

Started DELETE “/docentes/189” for 127.0.0.1 at 2026-06-30 14:25:49 -0300 Processing by DocentesController#destroy as HTML

+ +
Parameters: {"id" => "189"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 188 LIMIT 1
+Docente Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Docente' AND `usuarios`.`id` = 189 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Docente::HABTM_Turmas Delete All (0.3ms)  DELETE FROM `docentes_turmas` WHERE `docentes_turmas`.`docente_id` = 189
+Docente Destroy (0.3ms)  DELETE FROM `usuarios` WHERE `usuarios`.`id` = 189
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/docentes Completed 303 See Other in 6ms (ActiveRecord: 4.1ms (4 queries, 0 cached) | GC: 0.0ms)

+ +
Docente Count (0.2ms)  SELECT COUNT(*) FROM `usuarios` WHERE `usuarios`.`type` = 'Docente'
+TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_ef' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_ef@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:49.456754', NULL, NULL, NULL, NULL, 'doc_ef@unb.br', 'Doutorado', 'doc_ef', 'Docente EF', NULL, NULL, '$2a$12$s8y63ZmfV/50q7cGV3ncSeF5VTvEJ7MNzchqbIa4.aUwM0ZNBRhyi', 'Docente', '2026-06-30 17:25:49.456754')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:49.458868', 'Ciência da Computação', '2026-06-30 17:25:49.458868')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 163 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.4ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:25:49.460463', 163, 'Engenharia de Software', '2026-06-30 17:25:49.460463')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 78 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 78 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:25:49.462108', 78, NULL, 'TA', '2026.1', '2026-06-30 17:25:49.462108')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:25:49.462737', NULL, NULL, NULL, NULL, 62, '2026-06-30 17:25:49.462737')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:25:49.463499', 'Questão EF', 41, 1, NULL, '2026-06-30 17:25:49.463499')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:49 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_ef@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_ef@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/190/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.1ms) Started DELETE “/logout” for 127.0.0.1 at 2026-06-30 14:25:49 -0300 Processing by SessionsController#destroy as HTML Redirected to www.example.com/ Completed 302 Found in 0ms (ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 0.0ms) Started GET “/elemento_forms” for 127.0.0.1 at 2026-06-30 14:25:49 -0300 Processing by ElementoFormsController#index as HTML

+ +
Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+ +

Redirected to www.example.com/ Filter chain halted as :require_login rendered or redirected Completed 302 Found in 1ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_ef' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_ef@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:49.845624', NULL, NULL, NULL, NULL, 'doc_ef@unb.br', 'Doutorado', 'doc_ef', 'Docente EF', NULL, NULL, '$2a$12$C6M5uHeqJsdBtprGDErCRupDjWUH3ABsFO/rubdbeJvTz3L5tAu/.', 'Docente', '2026-06-30 17:25:49.845624')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:49.848057', 'Ciência da Computação', '2026-06-30 17:25:49.848057')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 164 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:25:49.849595', 164, 'Engenharia de Software', '2026-06-30 17:25:49.849595')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 79 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 79 LIMIT 1
+Turma Create (0.3ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:25:49.851170', 79, NULL, 'TA', '2026.1', '2026-06-30 17:25:49.851170')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:25:49.851860', NULL, NULL, NULL, NULL, 63, '2026-06-30 17:25:49.851860')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:25:49.852689', 'Questão EF', 42, 1, NULL, '2026-06-30 17:25:49.852689')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:49 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_ef@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_ef@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/191/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.1ms) Started GET “/elemento_forms” for 127.0.0.1 at 2026-06-30 14:25:50 -0300 Processing by ElementoFormsController#index as HTML

+ +
Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 191 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering elemento_forms/index.html.erb within layouts/application
+ElementoForm Load (0.2ms)  SELECT `elemento_forms`.* FROM `elemento_forms`
+Rendered elemento_forms/_elemento_form.html.erb (Duration: 0.1ms | GC: 0.0ms)
+Rendered elemento_forms/index.html.erb within layouts/application (Duration: 1.1ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.3ms | GC: 0.0ms)
+ +

Completed 200 OK in 3ms (Views: 1.5ms | ActiveRecord: 0.5ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.6ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_ef' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_ef@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:50.236452', NULL, NULL, NULL, NULL, 'doc_ef@unb.br', 'Doutorado', 'doc_ef', 'Docente EF', NULL, NULL, '$2a$12$RN15eASsuov96Tg0ypk3CeVFESVC73tTa961eI/Z1DH5a8Vv1/vIu', 'Docente', '2026-06-30 17:25:50.236452')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:50.238888', 'Ciência da Computação', '2026-06-30 17:25:50.238888')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 165 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:25:50.240363', 165, 'Engenharia de Software', '2026-06-30 17:25:50.240363')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 80 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 80 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:25:50.242005', 80, NULL, 'TA', '2026.1', '2026-06-30 17:25:50.242005')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:25:50.242638', NULL, NULL, NULL, NULL, 64, '2026-06-30 17:25:50.242638')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:25:50.243379', 'Questão EF', 43, 1, NULL, '2026-06-30 17:25:50.243379')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:50 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_ef@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_ef@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/192/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/elemento_forms/new” for 127.0.0.1 at 2026-06-30 14:25:50 -0300 Processing by ElementoFormsController#new as HTML

+ +
Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 192 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering elemento_forms/new.html.erb within layouts/application
+Rendered elemento_forms/_form.html.erb (Duration: 0.7ms | GC: 0.1ms)
+Rendered elemento_forms/new.html.erb within layouts/application (Duration: 1.0ms | GC: 0.1ms)
+Rendered layout layouts/application.html.erb (Duration: 1.3ms | GC: 0.1ms)
+ +

Completed 200 OK in 3ms (Views: 1.4ms | ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.1ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_ef' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_ef@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:50.625707', NULL, NULL, NULL, NULL, 'doc_ef@unb.br', 'Doutorado', 'doc_ef', 'Docente EF', NULL, NULL, '$2a$12$p5OE/uxuDSBRUXVbRNxS4uZ4uSUs8QpVoBoofetN4HOV78AnFklVW', 'Docente', '2026-06-30 17:25:50.625707')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:50.627613', 'Ciência da Computação', '2026-06-30 17:25:50.627613')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 166 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:25:50.629034', 166, 'Engenharia de Software', '2026-06-30 17:25:50.629034')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 81 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 81 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:25:50.630528', 81, NULL, 'TA', '2026.1', '2026-06-30 17:25:50.630528')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:25:50.631145', NULL, NULL, NULL, NULL, 65, '2026-06-30 17:25:50.631145')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:25:50.631971', 'Questão EF', 44, 1, NULL, '2026-06-30 17:25:50.631971')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:50 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_ef@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_ef@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/193/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms)

+ +
ElementoForm Count (0.3ms)  SELECT COUNT(*) FROM `elemento_forms`
+ +

Started POST “/elemento_forms” for 127.0.0.1 at 2026-06-30 14:25:50 -0300 Processing by ElementoFormsController#create as HTML

+ +
Parameters: {"elemento_form" => {"ordem" => "99", "enunciado" => "Novo EF", "formulario_id" => "44"}}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 193 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Load (0.4ms)  SELECT `formularios`.* FROM `formularios` WHERE `formularios`.`id` = 44 LIMIT 1
+ElementoForm Create (0.3ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:25:50.825054', 'Novo EF', 44, 99, NULL, '2026-06-30 17:25:50.825054')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/elemento_forms/44 Completed 302 Found in 3ms (ActiveRecord: 1.2ms (3 queries, 0 cached) | GC: 0.0ms)

+ +
ElementoForm Count (0.2ms)  SELECT COUNT(*) FROM `elemento_forms`
+ElementoForm Load (0.2ms)  SELECT `elemento_forms`.* FROM `elemento_forms` ORDER BY `elemento_forms`.`id` DESC LIMIT 1
+TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_ef' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_ef@unb.br' LIMIT 1
+Docente Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:51.017606', NULL, NULL, NULL, NULL, 'doc_ef@unb.br', 'Doutorado', 'doc_ef', 'Docente EF', NULL, NULL, '$2a$12$GBCQADYrJesxvRui/ELJ.OOd6aEdovw433.Jif1YZTev2C7XZxXe.', 'Docente', '2026-06-30 17:25:51.017606')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:51.020067', 'Ciência da Computação', '2026-06-30 17:25:51.020067')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 167 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:25:51.021566', 167, 'Engenharia de Software', '2026-06-30 17:25:51.021566')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 82 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 82 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:25:51.023141', 82, NULL, 'TA', '2026.1', '2026-06-30 17:25:51.023141')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:25:51.023797', NULL, NULL, NULL, NULL, 66, '2026-06-30 17:25:51.023797')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:25:51.024580', 'Questão EF', 45, 1, NULL, '2026-06-30 17:25:51.024580')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:51 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_ef@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_ef@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/194/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms)

+ +
ElementoForm Count (0.3ms)  SELECT COUNT(*) FROM `elemento_forms`
+ +

Started POST “/elemento_forms” for 127.0.0.1 at 2026-06-30 14:25:51 -0300 Processing by ElementoFormsController#create as HTML

+ +
Parameters: {"elemento_form" => {"ordem" => nil, "enunciado" => "EF", "formulario_id" => "45"}}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 194 LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Formulario Load (0.4ms)  SELECT `formularios`.* FROM `formularios` WHERE `formularios`.`id` = 45 LIMIT 1
+TRANSACTION (0.1ms)  ROLLBACK TO SAVEPOINT active_record_1
+Rendering layout layouts/application.html.erb
+Rendering elemento_forms/new.html.erb within layouts/application
+Rendered elemento_forms/_form.html.erb (Duration: 0.7ms | GC: 0.0ms)
+Rendered elemento_forms/new.html.erb within layouts/application (Duration: 0.8ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.0ms | GC: 0.0ms)
+ +

Completed 422 Unprocessable Content in 3ms (Views: 1.2ms | ActiveRecord: 1.0ms (2 queries, 0 cached) | GC: 0.1ms)

+ +
ElementoForm Count (0.2ms)  SELECT COUNT(*) FROM `elemento_forms`
+TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_ef' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_ef@unb.br' LIMIT 1
+Docente Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:51.410519', NULL, NULL, NULL, NULL, 'doc_ef@unb.br', 'Doutorado', 'doc_ef', 'Docente EF', NULL, NULL, '$2a$12$m2KdEj8e65d/aRfdIsJz3um6H78cwWnLoDx9Qeih9RgEfoLjjxLD.', 'Docente', '2026-06-30 17:25:51.410519')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:51.413191', 'Ciência da Computação', '2026-06-30 17:25:51.413191')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 168 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.3ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:25:51.414753', 168, 'Engenharia de Software', '2026-06-30 17:25:51.414753')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 83 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 83 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:25:51.416390', 83, NULL, 'TA', '2026.1', '2026-06-30 17:25:51.416390')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:25:51.417040', NULL, NULL, NULL, NULL, 67, '2026-06-30 17:25:51.417040')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:25:51.417828', 'Questão EF', 46, 1, NULL, '2026-06-30 17:25:51.417828')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:51 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_ef@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_ef@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/195/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/elemento_forms/46” for 127.0.0.1 at 2026-06-30 14:25:51 -0300 Processing by ElementoFormsController#show as HTML

+ +
Parameters: {"id" => "46"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 195 LIMIT 1
+ElementoForm Load (0.2ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`id` = 46 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering elemento_forms/show.html.erb within layouts/application
+Rendered elemento_forms/_elemento_form.html.erb (Duration: 0.0ms | GC: 0.0ms)
+Rendered elemento_forms/show.html.erb within layouts/application (Duration: 0.4ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.6ms | GC: 0.0ms)
+ +

Completed 200 OK in 3ms (Views: 0.7ms | ActiveRecord: 0.5ms (2 queries, 0 cached) | GC: 0.1ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_ef' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_ef@unb.br' LIMIT 1
+Docente Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:51.822946', NULL, NULL, NULL, NULL, 'doc_ef@unb.br', 'Doutorado', 'doc_ef', 'Docente EF', NULL, NULL, '$2a$12$L/d9uCG1mV9pBIKSDgU9vup05nnLWoQrGbTdjXO8UlFaU90x9Kar2', 'Docente', '2026-06-30 17:25:51.822946')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:51.825417', 'Ciência da Computação', '2026-06-30 17:25:51.825417')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 169 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.4ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:25:51.826955', 169, 'Engenharia de Software', '2026-06-30 17:25:51.826955')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 84 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 84 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:25:51.828579', 84, NULL, 'TA', '2026.1', '2026-06-30 17:25:51.828579')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:25:51.829205', NULL, NULL, NULL, NULL, 68, '2026-06-30 17:25:51.829205')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:25:51.829963', 'Questão EF', 47, 1, NULL, '2026-06-30 17:25:51.829963')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:51 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_ef@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_ef@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/196/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/elemento_forms/47/edit” for 127.0.0.1 at 2026-06-30 14:25:52 -0300 Processing by ElementoFormsController#edit as HTML

+ +
Parameters: {"id" => "47"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 196 LIMIT 1
+ElementoForm Load (0.2ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`id` = 47 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering elemento_forms/edit.html.erb within layouts/application
+Rendered elemento_forms/_form.html.erb (Duration: 0.5ms | GC: 0.0ms)
+Rendered elemento_forms/edit.html.erb within layouts/application (Duration: 0.7ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.9ms | GC: 0.0ms)
+ +

Completed 200 OK in 3ms (Views: 1.1ms | ActiveRecord: 0.5ms (2 queries, 0 cached) | GC: 0.1ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_ef' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_ef@unb.br' LIMIT 1
+Docente Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:52.213975', NULL, NULL, NULL, NULL, 'doc_ef@unb.br', 'Doutorado', 'doc_ef', 'Docente EF', NULL, NULL, '$2a$12$XQggv/lcWPhW2wKdS4cYX.2T8pDMfj682OnUzngxTERhbPIokMl4m', 'Docente', '2026-06-30 17:25:52.213975')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:52.216620', 'Ciência da Computação', '2026-06-30 17:25:52.216620')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 170 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.3ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:25:52.218132', 170, 'Engenharia de Software', '2026-06-30 17:25:52.218132')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 85 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 85 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:25:52.219711', 85, NULL, 'TA', '2026.1', '2026-06-30 17:25:52.219711')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:25:52.220335', NULL, NULL, NULL, NULL, 69, '2026-06-30 17:25:52.220335')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:25:52.221128', 'Questão EF', 48, 1, NULL, '2026-06-30 17:25:52.221128')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:52 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_ef@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_ef@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/197/avaliacoes Completed 302 Found in 190ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.1ms) Started PATCH “/elemento_forms/48” for 127.0.0.1 at 2026-06-30 14:25:52 -0300 Processing by ElementoFormsController#update as HTML

+ +
Parameters: {"elemento_form" => {"ordem" => "1", "enunciado" => "EF Atualizado", "formulario_id" => "48"}, "id" => "48"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 197 LIMIT 1
+ElementoForm Load (0.2ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`id` = 48 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Update (0.5ms)  UPDATE `elemento_forms` SET `elemento_forms`.`enunciado` = 'EF Atualizado', `elemento_forms`.`updated_at` = '2026-06-30 17:25:52.414708' WHERE `elemento_forms`.`id` = 48
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/elemento_forms/48 Completed 303 See Other in 3ms (ActiveRecord: 1.4ms (3 queries, 0 cached) | GC: 0.0ms)

+ +
ElementoForm Load (0.2ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`id` = 48 LIMIT 1
+TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_ef' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_ef@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:52.607702', NULL, NULL, NULL, NULL, 'doc_ef@unb.br', 'Doutorado', 'doc_ef', 'Docente EF', NULL, NULL, '$2a$12$sECRhLiln8pxEZrHpd/zhuG6p8Y4U0c9SXl8E.G2R5yG1ECcLoa4W', 'Docente', '2026-06-30 17:25:52.607702')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:52.610245', 'Ciência da Computação', '2026-06-30 17:25:52.610245')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 171 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:25:52.611849', 171, 'Engenharia de Software', '2026-06-30 17:25:52.611849')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 86 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 86 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:25:52.613413', 86, NULL, 'TA', '2026.1', '2026-06-30 17:25:52.613413')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:25:52.614046', NULL, NULL, NULL, NULL, 70, '2026-06-30 17:25:52.614046')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:25:52.614829', 'Questão EF', 49, 1, NULL, '2026-06-30 17:25:52.614829')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:52 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_ef@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_ef@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/198/avaliacoes Completed 302 Found in 190ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started PATCH “/elemento_forms/49” for 127.0.0.1 at 2026-06-30 14:25:52 -0300 Processing by ElementoFormsController#update as HTML

+ +
Parameters: {"elemento_form" => {"ordem" => nil, "enunciado" => "EF", "formulario_id" => "49"}, "id" => "49"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 198 LIMIT 1
+ElementoForm Load (0.2ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`id` = 49 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering elemento_forms/edit.html.erb within layouts/application
+Rendered elemento_forms/_form.html.erb (Duration: 0.8ms | GC: 0.1ms)
+Rendered elemento_forms/edit.html.erb within layouts/application (Duration: 0.9ms | GC: 0.1ms)
+Rendered layout layouts/application.html.erb (Duration: 1.1ms | GC: 0.1ms)
+ +

Completed 422 Unprocessable Content in 3ms (Views: 1.2ms | ActiveRecord: 0.6ms (2 queries, 0 cached) | GC: 0.1ms)

+ +
TRANSACTION (1.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_ef' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_ef@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:53.002104', NULL, NULL, NULL, NULL, 'doc_ef@unb.br', 'Doutorado', 'doc_ef', 'Docente EF', NULL, NULL, '$2a$12$t/RktChB83ng9YKc2Lpd/.2h4vM26CBT4m01jNosHGjUJMCEXQrRe', 'Docente', '2026-06-30 17:25:53.002104')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:53.004473', 'Ciência da Computação', '2026-06-30 17:25:53.004473')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 172 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:25:53.005959', 172, 'Engenharia de Software', '2026-06-30 17:25:53.005959')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 87 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 87 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:25:53.007524', 87, NULL, 'TA', '2026.1', '2026-06-30 17:25:53.007524')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:25:53.008182', NULL, NULL, NULL, NULL, 71, '2026-06-30 17:25:53.008182')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:25:53.009025', 'Questão EF', 50, 1, NULL, '2026-06-30 17:25:53.009025')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:53 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_ef@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_ef@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/199/avaliacoes Completed 302 Found in 190ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.6ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:25:53.200441', NULL, 50, 50, NULL, '2026-06-30 17:25:53.200441')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ElementoForm Count (0.3ms)  SELECT COUNT(*) FROM `elemento_forms`
+ +

Started DELETE “/elemento_forms/51” for 127.0.0.1 at 2026-06-30 14:25:53 -0300 Processing by ElementoFormsController#destroy as HTML

+ +
Parameters: {"id" => "51"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 199 LIMIT 1
+ElementoForm Load (0.2ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`id` = 51 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Load (0.4ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` = 51
+ElementoForm Destroy (0.3ms)  DELETE FROM `elemento_forms` WHERE `elemento_forms`.`id` = 51
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/elemento_forms Completed 303 See Other in 3ms (ActiveRecord: 1.4ms (4 queries, 0 cached) | GC: 0.0ms)

+ +
ElementoForm Count (0.2ms)  SELECT COUNT(*) FROM `elemento_forms`
+TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:53.208170', 'Ciência da Computação', '2026-06-30 17:25:53.208170')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_elem2' LIMIT 1
+Usuario Exists? (0.1ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'adm_elem2@unb.br' LIMIT 1
+Administrador Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:53.397951', NULL, NULL, NULL, 173, 'adm_elem2@unb.br', NULL, 'adm_elem2', 'Admin Elem', NULL, NULL, '$2a$12$2GXRi2DzgrZUgIfSG.b8FerjB2OFpJvxPQj5qdpOtP/Sb9Z/WiUhe', 'Administrador', '2026-06-30 17:25:53.397951')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Administrador Load (0.6ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 200 LIMIT 1
+Template Create (0.3ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:25:53.400875', 'Template Elem', '2026-06-30 17:25:53.400875', 200)
+Elemento Create (0.3ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:25:53.401403', 'Q Setup', 1, 39, '2026-06-30 17:25:53.401403')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:53 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "adm_elem2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'adm_elem2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/200/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started DELETE “/logout” for 127.0.0.1 at 2026-06-30 14:25:53 -0300 Processing by SessionsController#destroy as HTML Redirected to www.example.com/ Completed 302 Found in 0ms (ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 0.0ms) Started GET “/elementos” for 127.0.0.1 at 2026-06-30 14:25:53 -0300 Processing by ElementosController#index as HTML

+ +
Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+ +

Redirected to www.example.com/ Filter chain halted as :require_login rendered or redirected Completed 302 Found in 1ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.5ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:53.597730', 'Ciência da Computação', '2026-06-30 17:25:53.597730')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_elem2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'adm_elem2@unb.br' LIMIT 1
+Administrador Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:53.787210', NULL, NULL, NULL, 174, 'adm_elem2@unb.br', NULL, 'adm_elem2', 'Admin Elem', NULL, NULL, '$2a$12$DRYtVAroSHLLFuhlPjpwU.NHEhrC/2oNFhdJ2KLviBpYMWwZR.HzO', 'Administrador', '2026-06-30 17:25:53.787210')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Administrador Load (0.5ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 201 LIMIT 1
+Template Create (0.3ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:25:53.789738', 'Template Elem', '2026-06-30 17:25:53.789738', 201)
+Elemento Create (0.3ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:25:53.790221', 'Q Setup', 1, 40, '2026-06-30 17:25:53.790221')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:53 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "adm_elem2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'adm_elem2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/201/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/elementos” for 127.0.0.1 at 2026-06-30 14:25:53 -0300 Processing by ElementosController#index as HTML

+ +
Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 201 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering elementos/index.html.erb within layouts/application
+Elemento Load (0.2ms)  SELECT `elementos`.* FROM `elementos`
+Rendered elementos/_elemento.html.erb (Duration: 0.2ms | GC: 0.0ms)
+Rendered elementos/index.html.erb within layouts/application (Duration: 1.3ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.6ms | GC: 0.0ms)
+ +

Completed 200 OK in 4ms (Views: 1.8ms | ActiveRecord: 0.6ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:53.986828', 'Ciência da Computação', '2026-06-30 17:25:53.986828')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_elem2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'adm_elem2@unb.br' LIMIT 1
+Administrador Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:54.175739', NULL, NULL, NULL, 175, 'adm_elem2@unb.br', NULL, 'adm_elem2', 'Admin Elem', NULL, NULL, '$2a$12$Gg/bkz3bECDLNOofDbwJpe3uLAidGw.nWtxp8TuxoF3aS.CQOqinC', 'Administrador', '2026-06-30 17:25:54.175739')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Administrador Load (0.6ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 202 LIMIT 1
+Template Create (0.3ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:25:54.178035', 'Template Elem', '2026-06-30 17:25:54.178035', 202)
+Elemento Create (0.3ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:25:54.178543', 'Q Setup', 1, 41, '2026-06-30 17:25:54.178543')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:54 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "adm_elem2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'adm_elem2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/202/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/elementos/new” for 127.0.0.1 at 2026-06-30 14:25:54 -0300 Processing by ElementosController#new as HTML

+ +
Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 202 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering elementos/new.html.erb within layouts/application
+Rendered elementos/_form.html.erb (Duration: 0.6ms | GC: 0.0ms)
+Rendered elementos/new.html.erb within layouts/application (Duration: 1.0ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.3ms | GC: 0.0ms)
+ +

Completed 200 OK in 3ms (Views: 1.4ms | ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:54.373575', 'Ciência da Computação', '2026-06-30 17:25:54.373575')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_elem2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'adm_elem2@unb.br' LIMIT 1
+Administrador Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:54.562230', NULL, NULL, NULL, 176, 'adm_elem2@unb.br', NULL, 'adm_elem2', 'Admin Elem', NULL, NULL, '$2a$12$mzhtkAYj9cdtBmuVG5RpDei/UbbcJCwUeS0.1RJ5ycikoX91gj/GG', 'Administrador', '2026-06-30 17:25:54.562230')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Administrador Load (0.6ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 203 LIMIT 1
+Template Create (0.3ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:25:54.564598', 'Template Elem', '2026-06-30 17:25:54.564598', 203)
+Elemento Create (0.2ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:25:54.565043', 'Q Setup', 1, 42, '2026-06-30 17:25:54.565043')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:54 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "adm_elem2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'adm_elem2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/203/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Elemento Count (0.3ms)  SELECT COUNT(*) FROM `elementos`
+ +

Started POST “/elementos” for 127.0.0.1 at 2026-06-30 14:25:54 -0300 Processing by ElementosController#create as HTML

+ +
Parameters: {"elemento" => {"enunciado" => "Nova Questão", "ordem" => "99", "template_id" => "42"}}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 203 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Template Load (0.4ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`id` = 42 LIMIT 1
+Elemento Create (0.3ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:25:54.757712', 'Nova Questão', 99, 42, '2026-06-30 17:25:54.757712')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/elementos/57 Completed 302 Found in 3ms (ActiveRecord: 1.3ms (3 queries, 0 cached) | GC: 0.0ms)

+ +
Elemento Count (0.2ms)  SELECT COUNT(*) FROM `elementos`
+Elemento Load (0.2ms)  SELECT `elementos`.* FROM `elementos` ORDER BY `elementos`.`id` DESC LIMIT 1
+TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:54.762019', 'Ciência da Computação', '2026-06-30 17:25:54.762019')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_elem2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'adm_elem2@unb.br' LIMIT 1
+Administrador Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:54.950871', NULL, NULL, NULL, 177, 'adm_elem2@unb.br', NULL, 'adm_elem2', 'Admin Elem', NULL, NULL, '$2a$12$5etW8IajGacV7hlYTDOwNeBZlxPRyn1Vw.HTDNSxJGPrYbaLRFmtq', 'Administrador', '2026-06-30 17:25:54.950871')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Administrador Load (0.5ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 204 LIMIT 1
+Template Create (0.3ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:25:54.953154', 'Template Elem', '2026-06-30 17:25:54.953154', 204)
+Elemento Create (0.2ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:25:54.953619', 'Q Setup', 1, 43, '2026-06-30 17:25:54.953619')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:54 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "adm_elem2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'adm_elem2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/204/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Elemento Count (0.3ms)  SELECT COUNT(*) FROM `elementos`
+ +

Started POST “/elementos” for 127.0.0.1 at 2026-06-30 14:25:55 -0300 Processing by ElementosController#create as HTML

+ +
Parameters: {"elemento" => {"enunciado" => "Questão", "ordem" => "1", "template_id" => nil}}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 204 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering elementos/new.html.erb within layouts/application
+Rendered elementos/_form.html.erb (Duration: 0.6ms | GC: 0.0ms)
+Rendered elementos/new.html.erb within layouts/application (Duration: 0.7ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.0ms | GC: 0.0ms)
+ +

Completed 422 Unprocessable Content in 2ms (Views: 1.1ms | ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Elemento Count (0.2ms)  SELECT COUNT(*) FROM `elementos`
+TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:55.148964', 'Ciência da Computação', '2026-06-30 17:25:55.148964')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_elem2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'adm_elem2@unb.br' LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:55.339075', NULL, NULL, NULL, 178, 'adm_elem2@unb.br', NULL, 'adm_elem2', 'Admin Elem', NULL, NULL, '$2a$12$QQ5uz//RbevCSRo6u6FpBuZZ/1cKgjDOw3PB6jBskn82EtG3rF1rC', 'Administrador', '2026-06-30 17:25:55.339075')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Administrador Load (0.5ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 205 LIMIT 1
+Template Create (0.3ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:25:55.341541', 'Template Elem', '2026-06-30 17:25:55.341541', 205)
+Elemento Create (0.2ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:25:55.342025', 'Q Setup', 1, 44, '2026-06-30 17:25:55.342025')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:55 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "adm_elem2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'adm_elem2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/205/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/elementos/59” for 127.0.0.1 at 2026-06-30 14:25:55 -0300 Processing by ElementosController#show as HTML

+ +
Parameters: {"id" => "59"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 205 LIMIT 1
+Elemento Load (0.2ms)  SELECT `elementos`.* FROM `elementos` WHERE `elementos`.`id` = 59 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering elementos/show.html.erb within layouts/application
+Rendered elementos/_elemento.html.erb (Duration: 0.0ms | GC: 0.0ms)
+Rendered elementos/show.html.erb within layouts/application (Duration: 0.4ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.6ms | GC: 0.0ms)
+ +

Completed 200 OK in 3ms (Views: 0.8ms | ActiveRecord: 0.6ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:55.537022', 'Ciência da Computação', '2026-06-30 17:25:55.537022')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_elem2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'adm_elem2@unb.br' LIMIT 1
+Administrador Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:55.725957', NULL, NULL, NULL, 179, 'adm_elem2@unb.br', NULL, 'adm_elem2', 'Admin Elem', NULL, NULL, '$2a$12$21.QjOckKP4tO3Ev3QR.4.v6XuX.V6nVM4ZpNbogkqIsiSAbJZutW', 'Administrador', '2026-06-30 17:25:55.725957')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Administrador Load (0.5ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 206 LIMIT 1
+Template Create (0.3ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:25:55.728148', 'Template Elem', '2026-06-30 17:25:55.728148', 206)
+Elemento Create (0.3ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:25:55.728609', 'Q Setup', 1, 45, '2026-06-30 17:25:55.728609')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:55 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "adm_elem2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'adm_elem2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/206/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/elementos/60/edit” for 127.0.0.1 at 2026-06-30 14:25:55 -0300 Processing by ElementosController#edit as HTML

+ +
Parameters: {"id" => "60"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 206 LIMIT 1
+Elemento Load (0.3ms)  SELECT `elementos`.* FROM `elementos` WHERE `elementos`.`id` = 60 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering elementos/edit.html.erb within layouts/application
+Rendered elementos/_form.html.erb (Duration: 0.4ms | GC: 0.0ms)
+Rendered elementos/edit.html.erb within layouts/application (Duration: 0.6ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.9ms | GC: 0.0ms)
+ +

Completed 200 OK in 3ms (Views: 1.0ms | ActiveRecord: 0.6ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:55.924898', 'Ciência da Computação', '2026-06-30 17:25:55.924898')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_elem2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'adm_elem2@unb.br' LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:56.114496', NULL, NULL, NULL, 180, 'adm_elem2@unb.br', NULL, 'adm_elem2', 'Admin Elem', NULL, NULL, '$2a$12$aOJtcNDkEH2gq48UH6ergu7B3x1jNB0QlJfCZ42oUL6qso1XlAsbW', 'Administrador', '2026-06-30 17:25:56.114496')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Administrador Load (0.5ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 207 LIMIT 1
+Template Create (0.3ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:25:56.116871', 'Template Elem', '2026-06-30 17:25:56.116871', 207)
+Elemento Create (0.2ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:25:56.117385', 'Q Setup', 1, 46, '2026-06-30 17:25:56.117385')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:56 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "adm_elem2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'adm_elem2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/207/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started PATCH “/elementos/61” for 127.0.0.1 at 2026-06-30 14:25:56 -0300 Processing by ElementosController#update as HTML

+ +
Parameters: {"elemento" => {"enunciado" => "Questão Atualizada", "ordem" => "1", "template_id" => "46"}, "id" => "61"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 207 LIMIT 1
+Elemento Load (0.2ms)  SELECT `elementos`.* FROM `elementos` WHERE `elementos`.`id` = 61 LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Elemento Update (0.6ms)  UPDATE `elementos` SET `elementos`.`enunciado` = 'Questão Atualizada', `elementos`.`updated_at` = '2026-06-30 17:25:56.309808' WHERE `elementos`.`id` = 61
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/elementos/61 Completed 303 See Other in 3ms (ActiveRecord: 1.5ms (3 queries, 0 cached) | GC: 0.0ms)

+ +
Elemento Load (0.2ms)  SELECT `elementos`.* FROM `elementos` WHERE `elementos`.`id` = 61 LIMIT 1
+TRANSACTION (0.9ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:56.314528', 'Ciência da Computação', '2026-06-30 17:25:56.314528')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_elem2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'adm_elem2@unb.br' LIMIT 1
+Administrador Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:56.503808', NULL, NULL, NULL, 181, 'adm_elem2@unb.br', NULL, 'adm_elem2', 'Admin Elem', NULL, NULL, '$2a$12$QIxH9OuVFEd6GmoFKwl0R.RFWeS3JzPw5dy7gm987ErbZxP8Du/XW', 'Administrador', '2026-06-30 17:25:56.503808')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Administrador Load (0.5ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 208 LIMIT 1
+Template Create (0.2ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:25:56.506320', 'Template Elem', '2026-06-30 17:25:56.506320', 208)
+Elemento Create (0.2ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:25:56.506764', 'Q Setup', 1, 47, '2026-06-30 17:25:56.506764')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:56 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "adm_elem2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'adm_elem2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/208/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started PATCH “/elementos/62” for 127.0.0.1 at 2026-06-30 14:25:56 -0300 Processing by ElementosController#update as HTML

+ +
Parameters: {"elemento" => {"enunciado" => "Q", "ordem" => "1", "template_id" => nil}, "id" => "62"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 208 LIMIT 1
+Elemento Load (0.2ms)  SELECT `elementos`.* FROM `elementos` WHERE `elementos`.`id` = 62 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering elementos/edit.html.erb within layouts/application
+Rendered elementos/_form.html.erb (Duration: 0.6ms | GC: 0.0ms)
+Rendered elementos/edit.html.erb within layouts/application (Duration: 0.7ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.0ms | GC: 0.0ms)
+ +

Completed 422 Unprocessable Content in 3ms (Views: 1.2ms | ActiveRecord: 0.6ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:56.702672', 'Ciência da Computação', '2026-06-30 17:25:56.702672')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_elem2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'adm_elem2@unb.br' LIMIT 1
+Administrador Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:56.892170', NULL, NULL, NULL, 182, 'adm_elem2@unb.br', NULL, 'adm_elem2', 'Admin Elem', NULL, NULL, '$2a$12$PcJdt2ZToakrt5cgXm7.jeWKPiwcjWtvnZxkWoMjKALcH0wbqHxb2', 'Administrador', '2026-06-30 17:25:56.892170')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Administrador Load (0.5ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 209 LIMIT 1
+Template Create (0.3ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:25:56.894854', 'Template Elem', '2026-06-30 17:25:56.894854', 209)
+Elemento Create (0.2ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:25:56.895328', 'Q Setup', 1, 48, '2026-06-30 17:25:56.895328')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:56 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "adm_elem2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'adm_elem2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/209/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Elemento Create (0.5ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:25:57.085103', 'Para Deletar', 50, 48, '2026-06-30 17:25:57.085103')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Elemento Count (0.2ms)  SELECT COUNT(*) FROM `elementos`
+ +

Started DELETE “/elementos/64” for 127.0.0.1 at 2026-06-30 14:25:57 -0300 Processing by ElementosController#destroy as HTML

+ +
Parameters: {"id" => "64"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 209 LIMIT 1
+Elemento Load (0.2ms)  SELECT `elementos`.* FROM `elementos` WHERE `elementos`.`id` = 64 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Campo Load (0.4ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` = 64
+Elemento Destroy (0.3ms)  DELETE FROM `elementos` WHERE `elementos`.`id` = 64
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/elementos Completed 303 See Other in 2ms (ActiveRecord: 1.4ms (4 queries, 0 cached) | GC: 0.0ms)

+ +
Elemento Count (0.2ms)  SELECT COUNT(*) FROM `elementos`
+TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:57.092464', 'Ciência da Computação', '2026-06-30 17:25:57.092464')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '123' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:57.281544', NULL, NULL, NULL, 183, 'admin@unb.br', NULL, '123', 'Admin', NULL, NULL, '$2a$12$dOppYN9JbvLHrrFtFOhDJeQgayOSMUVbnru5Xx3jLBZr9EthZ8RXq', 'Administrador', '2026-06-30 17:25:57.281544')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:57 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/210/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Formulario Count (0.3ms)  SELECT COUNT(*) FROM `formularios`
+Disciplina Load (0.3ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 183 LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.4ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.3ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:25:57.473636', 183, 'Engenharia de Software', '2026-06-30 17:25:57.473636')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 88 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 88 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:25:57.475601', 88, NULL, 'TA', '2026.1', '2026-06-30 17:25:57.475601')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/formularios” for 127.0.0.1 at 2026-06-30 14:25:57 -0300 Processing by FormulariosController#create as HTML

+ +
Parameters: {"formulario" => {"turma_id" => "72"}}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 210 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`id` = 72 LIMIT 1
+Formulario Create (0.2ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:25:57.479334', NULL, NULL, NULL, NULL, 72, '2026-06-30 17:25:57.479334')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/formularios/51 Completed 302 Found in 2ms (ActiveRecord: 1.0ms (3 queries, 0 cached) | GC: 0.0ms)

+ +
Formulario Count (0.2ms)  SELECT COUNT(*) FROM `formularios`
+TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:57.482651', 'Ciência da Computação', '2026-06-30 17:25:57.482651')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 184 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:25:57.484000', 184, 'Engenharia de Software', '2026-06-30 17:25:57.484000')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 89 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 89 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:25:57.485499', 89, NULL, 'TA', '2026.1', '2026-06-30 17:25:57.485499')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:25:57.486126', NULL, NULL, NULL, NULL, 73, '2026-06-30 17:25:57.486126')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Curso Load (0.2ms)  SELECT `cursos`.* FROM `cursos` WHERE `cursos`.`nome` = 'Ciência da Computação' AND `cursos`.`codigo` = 'CIC' AND `cursos`.`departamento_id` = 184 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Curso Exists? (0.3ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`codigo` = 'CIC' LIMIT 1
+Curso Create (0.2ms)  INSERT INTO `cursos` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:57.487698', 184, 'Ciência da Computação', '2026-06-30 17:25:57.487698')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '241000' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'aluno@unb.br' LIMIT 1
+Discente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:57.676223', 29, NULL, NULL, NULL, 'aluno@unb.br', NULL, '241000', 'Aluno Teste', NULL, NULL, '$2a$12$njfk1LM6iHk0OIG0k1txveki7xjNdUtwcOkhqr1wWMbQ3cWYzmjN.', 'Discente', '2026-06-30 17:25:57.676223')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:57 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "aluno@unb.br", "senha" => "Senha123"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'aluno@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/211/avaliacoes Completed 302 Found in 190ms (ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/formularios” for 127.0.0.1 at 2026-06-30 14:25:57 -0300 Processing by FormulariosController#index as HTML

+ +
Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 211 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering formularios/index.html.erb within layouts/application
+Formulario Load (0.2ms)  SELECT `formularios`.* FROM `formularios`
+Rendered formularios/_formulario.html.erb (Duration: 0.1ms | GC: 0.0ms)
+Rendered formularios/index.html.erb within layouts/application (Duration: 1.1ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.3ms | GC: 0.0ms)
+ +

Completed 200 OK in 3ms (Views: 1.5ms | ActiveRecord: 0.5ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:57.873744', 'Ciência da Computação', '2026-06-30 17:25:57.873744')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 185 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.3ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:25:57.875249', 185, 'Engenharia de Software', '2026-06-30 17:25:57.875249')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TB' AND `turmas`.`disciplina_id` = 90 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TB' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 90 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:25:57.876861', 90, NULL, 'TB', '2026.1', '2026-06-30 17:25:57.876861')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 90 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 90 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:25:57.878357', 90, NULL, 'TA', '2026.1', '2026-06-30 17:25:57.878357')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:25:57.878965', NULL, NULL, NULL, NULL, 75, '2026-06-30 17:25:57.878965')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '123' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:58.068574', NULL, NULL, NULL, 185, 'admin@unb.br', NULL, '123', 'Admin', NULL, NULL, '$2a$12$BqmV8eQrHI.VktG8dIwfOOjXseRZhEe9WAD4Wf5i0xmPjS/i5YHi2', 'Administrador', '2026-06-30 17:25:58.068574')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:58 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/212/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/formularios/53” for 127.0.0.1 at 2026-06-30 14:25:58 -0300 Processing by FormulariosController#show as HTML

+ +
Parameters: {"id" => "53"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 212 LIMIT 1
+Formulario Load (0.3ms)  SELECT `formularios`.* FROM `formularios` WHERE `formularios`.`id` = 53 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering formularios/show.html.erb within layouts/application
+Rendered formularios/_formulario.html.erb (Duration: 0.0ms | GC: 0.0ms)
+Rendered formularios/show.html.erb within layouts/application (Duration: 0.4ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.6ms | GC: 0.0ms)
+ +

Completed 200 OK in 3ms (Views: 0.8ms | ActiveRecord: 0.6ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.9ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.2ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:58.266333', 'Ciência da Computação', '2026-06-30 17:25:58.266333')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 186 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:25:58.267709', 186, 'Engenharia de Software', '2026-06-30 17:25:58.267709')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TB' AND `turmas`.`disciplina_id` = 91 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.2ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TB' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 91 LIMIT 1
+Turma Create (0.1ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:25:58.268942', 91, NULL, 'TB', '2026.1', '2026-06-30 17:25:58.268942')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.1ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 91 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.2ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 91 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:25:58.270075', 91, NULL, 'TA', '2026.1', '2026-06-30 17:25:58.270075')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.3ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:25:58.270679', NULL, NULL, NULL, NULL, 77, '2026-06-30 17:25:58.270679')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '123' LIMIT 1
+Usuario Exists? (0.1ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:58.459475', NULL, NULL, NULL, 186, 'admin@unb.br', NULL, '123', 'Admin', NULL, NULL, '$2a$12$WxlPpPLdLVMvlrLYHzrCA.eJYoI2TC8fNy1wG6VPeQeVwd7Y.RPFq', 'Administrador', '2026-06-30 17:25:58.459475')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:58 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin@unb.br", "senha" => "Senha123"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/213/avaliacoes Completed 302 Found in 192ms (ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/formularios/new” for 127.0.0.1 at 2026-06-30 14:25:58 -0300 Processing by FormulariosController#new as HTML

+ +
Usuario Load (0.5ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 213 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering formularios/new.html.erb within layouts/application
+Rendered formularios/_form.html.erb (Duration: 0.5ms | GC: 0.0ms)
+Rendered formularios/new.html.erb within layouts/application (Duration: 0.9ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.2ms | GC: 0.0ms)
+ +

Completed 200 OK in 3ms (Views: 1.3ms | ActiveRecord: 0.5ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:58.660056', 'Ciência da Computação', '2026-06-30 17:25:58.660056')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 187 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:25:58.661617', 187, 'Engenharia de Software', '2026-06-30 17:25:58.661617')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TB' AND `turmas`.`disciplina_id` = 92 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TB' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 92 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:25:58.663158', 92, NULL, 'TB', '2026.1', '2026-06-30 17:25:58.663158')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 92 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 92 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:25:58.664665', 92, NULL, 'TA', '2026.1', '2026-06-30 17:25:58.664665')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:25:58.665313', NULL, NULL, NULL, NULL, 79, '2026-06-30 17:25:58.665313')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '123' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:58.857262', NULL, NULL, NULL, 187, 'admin@unb.br', NULL, '123', 'Admin', NULL, NULL, '$2a$12$IbJkk/IMlFwfZDQSvDRs0eWaWhVSJ7.TTaT4ESfkLP92FZ3EfWLzi', 'Administrador', '2026-06-30 17:25:58.857262')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:58 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin@unb.br", "senha" => "Senha123"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/214/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/formularios/55/edit” for 127.0.0.1 at 2026-06-30 14:25:59 -0300 Processing by FormulariosController#edit as HTML

+ +
Parameters: {"id" => "55"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 214 LIMIT 1
+Formulario Load (0.3ms)  SELECT `formularios`.* FROM `formularios` WHERE `formularios`.`id` = 55 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering formularios/edit.html.erb within layouts/application
+Rendered formularios/_form.html.erb (Duration: 0.3ms | GC: 0.0ms)
+Rendered formularios/edit.html.erb within layouts/application (Duration: 0.5ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.8ms | GC: 0.0ms)
+ +

Completed 200 OK in 3ms (Views: 0.9ms | ActiveRecord: 0.7ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:59.054636', 'Ciência da Computação', '2026-06-30 17:25:59.054636')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 188 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.3ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:25:59.056228', 188, 'Engenharia de Software', '2026-06-30 17:25:59.056228')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TB' AND `turmas`.`disciplina_id` = 93 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TB' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 93 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:25:59.057852', 93, NULL, 'TB', '2026.1', '2026-06-30 17:25:59.057852')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 93 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.2ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 93 LIMIT 1
+Turma Create (0.1ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:25:59.059286', 93, NULL, 'TA', '2026.1', '2026-06-30 17:25:59.059286')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:25:59.059795', NULL, NULL, NULL, NULL, 81, '2026-06-30 17:25:59.059795')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '123' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:59.250050', NULL, NULL, NULL, 188, 'admin@unb.br', NULL, '123', 'Admin', NULL, NULL, '$2a$12$iaKCM5v9WIDkq0mIYkDgxuQfcEmv3sikiZX0y6HsVMYVQxIQ3BPYm', 'Administrador', '2026-06-30 17:25:59.250050')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:59 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/215/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Formulario Count (0.2ms)  SELECT COUNT(*) FROM `formularios`
+ +

Started POST “/formularios” for 127.0.0.1 at 2026-06-30 14:25:59 -0300 Processing by FormulariosController#create as HTML

+ +
Parameters: {"formulario" => {"turma_id" => nil}}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 215 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering formularios/new.html.erb within layouts/application
+Rendered formularios/_form.html.erb (Duration: 0.4ms | GC: 0.0ms)
+Rendered formularios/new.html.erb within layouts/application (Duration: 0.5ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.7ms | GC: 0.0ms)
+ +

Completed 422 Unprocessable Content in 2ms (Views: 0.9ms | ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Formulario Count (0.2ms)  SELECT COUNT(*) FROM `formularios`
+TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:59.447135', 'Ciência da Computação', '2026-06-30 17:25:59.447135')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 189 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:25:59.448609', 189, 'Engenharia de Software', '2026-06-30 17:25:59.448609')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TB' AND `turmas`.`disciplina_id` = 94 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.3ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TB' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 94 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:25:59.450062', 94, NULL, 'TB', '2026.1', '2026-06-30 17:25:59.450062')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 94 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 94 LIMIT 1
+Turma Create (0.1ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:25:59.451514', 94, NULL, 'TA', '2026.1', '2026-06-30 17:25:59.451514')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.2ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:25:59.452005', NULL, NULL, NULL, NULL, 83, '2026-06-30 17:25:59.452005')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '123' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:25:59.640631', NULL, NULL, NULL, 189, 'admin@unb.br', NULL, '123', 'Admin', NULL, NULL, '$2a$12$M2zCJ1B1S0RyPzPfLKJ/De6Q.s60Sth7.QX1lwLigb/B/9Zz10UEq', 'Administrador', '2026-06-30 17:25:59.640631')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:25:59 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin@unb.br", "senha" => "Senha123"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/216/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms) Started PATCH “/formularios/57” for 127.0.0.1 at 2026-06-30 14:25:59 -0300 Processing by FormulariosController#update as HTML

+ +
Parameters: {"formulario" => {"turma_id" => "82"}, "id" => "57"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 216 LIMIT 1
+Formulario Load (0.3ms)  SELECT `formularios`.* FROM `formularios` WHERE `formularios`.`id` = 57 LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Turma Load (0.4ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`id` = 82 LIMIT 1
+Formulario Update (0.4ms)  UPDATE `formularios` SET `formularios`.`turma_id` = 82, `formularios`.`updated_at` = '2026-06-30 17:25:59.834116' WHERE `formularios`.`id` = 57
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/formularios/57 Completed 303 See Other in 3ms (ActiveRecord: 1.7ms (4 queries, 0 cached) | GC: 0.0ms)

+ +
Formulario Load (0.3ms)  SELECT `formularios`.* FROM `formularios` WHERE `formularios`.`id` = 57 LIMIT 1
+TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:25:59.838474', 'Ciência da Computação', '2026-06-30 17:25:59.838474')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 190 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.4ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.3ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:25:59.844552', 190, 'Engenharia de Software', '2026-06-30 17:25:59.844552')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TB' AND `turmas`.`disciplina_id` = 95 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TB' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 95 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:25:59.846200', 95, NULL, 'TB', '2026.1', '2026-06-30 17:25:59.846200')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 95 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 95 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:25:59.847712', 95, NULL, 'TA', '2026.1', '2026-06-30 17:25:59.847712')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:25:59.848325', NULL, NULL, NULL, NULL, 85, '2026-06-30 17:25:59.848325')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '123' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:00.040067', NULL, NULL, NULL, 190, 'admin@unb.br', NULL, '123', 'Admin', NULL, NULL, '$2a$12$fEV1HnTzPfpygRC/j7yKD.g7TTp5yX6R9Qy4nfAteI4rQku/a3S5u', 'Administrador', '2026-06-30 17:26:00.040067')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:26:00 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin@unb.br", "senha" => "Senha123"}
+Usuario Load (0.7ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/217/avaliacoes Completed 302 Found in 190ms (ActiveRecord: 0.7ms (1 query, 0 cached) | GC: 0.3ms) Started PATCH “/formularios/58” for 127.0.0.1 at 2026-06-30 14:26:00 -0300 Processing by FormulariosController#update as HTML

+ +
Parameters: {"formulario" => {"turma_id" => nil}, "id" => "58"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 217 LIMIT 1
+Formulario Load (0.2ms)  SELECT `formularios`.* FROM `formularios` WHERE `formularios`.`id` = 58 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering formularios/edit.html.erb within layouts/application
+Rendered formularios/_form.html.erb (Duration: 0.5ms | GC: 0.0ms)
+Rendered formularios/edit.html.erb within layouts/application (Duration: 0.6ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.8ms | GC: 0.0ms)
+ +

Completed 422 Unprocessable Content in 3ms (Views: 1.0ms | ActiveRecord: 0.6ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:26:00.238586', 'Ciência da Computação', '2026-06-30 17:26:00.238586')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 191 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.3ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:26:00.240231', 191, 'Engenharia de Software', '2026-06-30 17:26:00.240231')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TB' AND `turmas`.`disciplina_id` = 96 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TB' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 96 LIMIT 1
+Turma Create (0.1ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:26:00.241859', 96, NULL, 'TB', '2026.1', '2026-06-30 17:26:00.241859')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.1ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 96 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 96 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:26:00.243206', 96, NULL, 'TA', '2026.1', '2026-06-30 17:26:00.243206')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:26:00.243834', NULL, NULL, NULL, NULL, 87, '2026-06-30 17:26:00.243834')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.6ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '123' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:00.433158', NULL, NULL, NULL, 191, 'admin@unb.br', NULL, '123', 'Admin', NULL, NULL, '$2a$12$8Ugo1/OeqbBAFY3C7FId1ORydFJibFTbrOqRKzvc6gUoFfaAlIezK', 'Administrador', '2026-06-30 17:26:00.433158')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:26:00 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin@unb.br", "senha" => "Senha123"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/218/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Formulario Count (0.4ms)  SELECT COUNT(*) FROM `formularios`
+ +

Started DELETE “/formularios/59” for 127.0.0.1 at 2026-06-30 14:26:00 -0300 Processing by FormulariosController#destroy as HTML

+ +
Parameters: {"id" => "59"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 218 LIMIT 1
+Formulario Load (0.2ms)  SELECT `formularios`.* FROM `formularios` WHERE `formularios`.`id` = 59 LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+ElementoForm Load (0.5ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`formulario_id` = 59
+RespostaForm Load (0.1ms)  SELECT `resposta_forms`.* FROM `resposta_forms` WHERE `resposta_forms`.`formulario_id` = 59
+Formulario Destroy (0.3ms)  DELETE FROM `formularios` WHERE `formularios`.`id` = 59
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/formularios Completed 303 See Other in 4ms (ActiveRecord: 1.7ms (5 queries, 0 cached) | GC: 0.3ms)

+ +
Formulario Count (0.2ms)  SELECT COUNT(*) FROM `formularios`
+TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_home' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_home@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:00.819898', NULL, NULL, NULL, NULL, 'doc_home@unb.br', 'Doutorado', 'doc_home', 'Docente Home', NULL, NULL, '$2a$12$uVDY0zqZ4amwQMeald458.fnzK/HsZu7rSUyZDYajl3mE88Q/F2d2', 'Docente', '2026-06-30 17:26:00.819898')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/inicio” for 127.0.0.1 at 2026-06-30 14:26:00 -0300 Processing by HomeController#index as HTML

+ +
Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+ +

Redirected to www.example.com/ Filter chain halted as :require_login rendered or redirected Completed 302 Found in 1ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_home' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_home@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:01.014409', NULL, NULL, NULL, NULL, 'doc_home@unb.br', 'Doutorado', 'doc_home', 'Docente Home', NULL, NULL, '$2a$12$4R48bINwVLsqOgB7dfJqC.fVLHVi5Q0lSD833ZGJQmjDa/lpkaDL6', 'Docente', '2026-06-30 17:26:01.014409')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:26:01 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_home@unb.br", "senha" => "Senha123"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_home@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/220/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/inicio” for 127.0.0.1 at 2026-06-30 14:26:01 -0300 Processing by HomeController#index as HTML

+ +
Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 220 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering home/index.html.erb within layouts/application
+Rendered home/index.html.erb within layouts/application (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 2ms (Views: 0.8ms | ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.2ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:26:01.210305', 'Ciência da Computação', '2026-06-30 17:26:01.210305')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '123' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:01.399529', NULL, NULL, NULL, 192, 'admin@unb.br', NULL, '123', 'Admin', NULL, NULL, '$2a$12$siFBUB2DImni2.DcwiVP1OT0Jr.WlMOCcyNv898cOkEEF2X09IlWC', 'Administrador', '2026-06-30 17:26:01.399529')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:26:01 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin@unb.br", "senha" => "Senha123"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/221/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms) Started POST “/admin/221/sincronizar_sigaa” for 127.0.0.1 at 2026-06-30 14:26:01 -0300 Processing by AdminController#sincronizar_sigaa as HTML

+ +
Parameters: {"acao" => "importar", "arquivo_classes" => #<ActionDispatch::Http::UploadedFile:0x000000012a56c7c0 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-98961-dwzqgi.json>, @content_type="application/json", @original_filename="class_members.json", @headers="content-disposition: form-data; name=\"arquivo_classes\"; filename=\"class_members.json\"\r\ncontent-type: application/json\r\ncontent-length: 16065\r\n">, "arquivo_membros" => #<ActionDispatch::Http::UploadedFile:0x000000012a56c770 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-98961-snlbob.json>, @content_type="application/json", @original_filename="class_members.json", @headers="content-disposition: form-data; name=\"arquivo_membros\"; filename=\"class_members.json\"\r\ncontent-type: application/json\r\ncontent-length: 16065\r\n">, "admin_id" => "221"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 221 LIMIT 1
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 221 LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Load (0.4ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`codigo` = 'NAO_ESP' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_2
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'NAO_ESP' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('NAO_ESP', '2026-06-30 17:26:01.593795', 'Não especificado', '2026-06-30 17:26:01.593795')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_2
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_2
+Disciplina Exists? (0.4ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+TRANSACTION (0.1ms)  ROLLBACK TO SAVEPOINT active_record_2
+TRANSACTION (0.2ms)  ROLLBACK TO SAVEPOINT active_record_1
+ +

Redirected to www.example.com/admin/221/gerenciamento Completed 302 Found in 6ms (ActiveRecord: 3.4ms (7 queries, 0 cached) | GC: 0.3ms)

+ +
TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_re2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_re2@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:01.787050', NULL, NULL, NULL, NULL, 'doc_re2@unb.br', 'Doutorado', 'doc_re2', 'Docente RE2', NULL, NULL, '$2a$12$YELQKn27CyhjO086VO2a0eln.54XuvFO8GoWBkjBjZs7h/okHT0ii', 'Docente', '2026-06-30 17:26:01.787050')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:26:01.789402', 'Ciência da Computação', '2026-06-30 17:26:01.789402')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 194 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.3ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:26:01.790971', 194, 'Engenharia de Software', '2026-06-30 17:26:01.790971')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 97 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 97 LIMIT 1
+Turma Create (0.3ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:26:01.792825', 97, NULL, 'TA', '2026.1', '2026-06-30 17:26:01.792825')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Formulario Create (0.5ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:26:01.793527', NULL, NULL, NULL, NULL, 88, '2026-06-30 17:26:01.793527')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaForm Exists? (0.4ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 222 AND `resposta_forms`.`formulario_id` = 60 LIMIT 1
+RespostaForm Create (0.3ms)  INSERT INTO `resposta_forms` (`created_at`, `data_submissao`, `formulario_id`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:26:01.794947', '2026-06-30', 60, '2026-06-30 17:26:01.794947', 222)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:26:01.795642', NULL, 60, 1, 'Texto', '2026-06-30 17:26:01.795642')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+RespostaElem Create (0.5ms)  INSERT INTO `resposta_elems` (`campo_form_id`, `created_at`, `elemento_form_id`, `resposta_form_id`, `texto_resposta`, `updated_at`) VALUES (NULL, '2026-06-30 17:26:01.796504', 52, 11, 'Resposta inicial', '2026-06-30 17:26:01.796504')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:26:01 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_re2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_re2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/222/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started DELETE “/logout” for 127.0.0.1 at 2026-06-30 14:26:01 -0300 Processing by SessionsController#destroy as HTML Redirected to www.example.com/ Completed 302 Found in 0ms (ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 0.0ms) Started GET “/resposta_elems” for 127.0.0.1 at 2026-06-30 14:26:01 -0300 Processing by RespostaElemsController#index as HTML

+ +
Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+ +

Redirected to www.example.com/ Filter chain halted as :require_login rendered or redirected Completed 302 Found in 1ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_re2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_re2@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:02.181362', NULL, NULL, NULL, NULL, 'doc_re2@unb.br', 'Doutorado', 'doc_re2', 'Docente RE2', NULL, NULL, '$2a$12$2vhC.DgZVe16xfGOe2Aj8.USjoxOz75jifckW/hM8NxIUg.3Rexbi', 'Docente', '2026-06-30 17:26:02.181362')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:26:02.184080', 'Ciência da Computação', '2026-06-30 17:26:02.184080')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.3ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 195 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:26:02.185639', 195, 'Engenharia de Software', '2026-06-30 17:26:02.185639')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 98 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 98 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:26:02.187194', 98, NULL, 'TA', '2026.1', '2026-06-30 17:26:02.187194')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:26:02.187808', NULL, NULL, NULL, NULL, 89, '2026-06-30 17:26:02.187808')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaForm Exists? (0.4ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 223 AND `resposta_forms`.`formulario_id` = 61 LIMIT 1
+RespostaForm Create (0.2ms)  INSERT INTO `resposta_forms` (`created_at`, `data_submissao`, `formulario_id`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:26:02.189050', '2026-06-30', 61, '2026-06-30 17:26:02.189050', 223)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:26:02.189655', NULL, 61, 1, 'Texto', '2026-06-30 17:26:02.189655')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaElem Create (0.4ms)  INSERT INTO `resposta_elems` (`campo_form_id`, `created_at`, `elemento_form_id`, `resposta_form_id`, `texto_resposta`, `updated_at`) VALUES (NULL, '2026-06-30 17:26:02.190410', 53, 12, 'Resposta inicial', '2026-06-30 17:26:02.190410')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:26:02 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_re2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_re2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/223/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/resposta_elems” for 127.0.0.1 at 2026-06-30 14:26:02 -0300 Processing by RespostaElemsController#index as HTML

+ +
Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 223 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering resposta_elems/index.html.erb within layouts/application
+RespostaElem Load (0.2ms)  SELECT `resposta_elems`.* FROM `resposta_elems`
+Rendered resposta_elems/_resposta_elem.html.erb (Duration: 0.1ms | GC: 0.0ms)
+Rendered resposta_elems/index.html.erb within layouts/application (Duration: 1.1ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.3ms | GC: 0.0ms)
+ +

Completed 200 OK in 3ms (Views: 1.5ms | ActiveRecord: 0.6ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.6ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_re2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_re2@unb.br' LIMIT 1
+Docente Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:02.575042', NULL, NULL, NULL, NULL, 'doc_re2@unb.br', 'Doutorado', 'doc_re2', 'Docente RE2', NULL, NULL, '$2a$12$jwxpIjbNBYA/hCfnwI3WKOmgy1rnLXELV291VaCmLj.1GGHzsduDe', 'Docente', '2026-06-30 17:26:02.575042')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.4ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:26:02.577663', 'Ciência da Computação', '2026-06-30 17:26:02.577663')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.3ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 196 LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.4ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.3ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:26:02.579365', 196, 'Engenharia de Software', '2026-06-30 17:26:02.579365')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 99 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 99 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:26:02.580916', 99, NULL, 'TA', '2026.1', '2026-06-30 17:26:02.580916')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:26:02.581517', NULL, NULL, NULL, NULL, 90, '2026-06-30 17:26:02.581517')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaForm Exists? (0.4ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 224 AND `resposta_forms`.`formulario_id` = 62 LIMIT 1
+RespostaForm Create (0.2ms)  INSERT INTO `resposta_forms` (`created_at`, `data_submissao`, `formulario_id`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:26:02.582768', '2026-06-30', 62, '2026-06-30 17:26:02.582768', 224)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:26:02.583404', NULL, 62, 1, 'Texto', '2026-06-30 17:26:02.583404')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaElem Create (0.4ms)  INSERT INTO `resposta_elems` (`campo_form_id`, `created_at`, `elemento_form_id`, `resposta_form_id`, `texto_resposta`, `updated_at`) VALUES (NULL, '2026-06-30 17:26:02.584184', 54, 13, 'Resposta inicial', '2026-06-30 17:26:02.584184')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:26:02 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_re2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_re2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/224/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/resposta_elems/new” for 127.0.0.1 at 2026-06-30 14:26:02 -0300 Processing by RespostaElemsController#new as HTML

+ +
Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 224 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering resposta_elems/new.html.erb within layouts/application
+Rendered resposta_elems/_form.html.erb (Duration: 1.1ms | GC: 0.0ms)
+Rendered resposta_elems/new.html.erb within layouts/application (Duration: 1.5ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.7ms | GC: 0.0ms)
+ +

Completed 200 OK in 3ms (Views: 1.9ms | ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.6ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_re2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_re2@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:02.968440', NULL, NULL, NULL, NULL, 'doc_re2@unb.br', 'Doutorado', 'doc_re2', 'Docente RE2', NULL, NULL, '$2a$12$VyuM9XOaV0mn8iULJ1JR8uYuxVreFFNloRyCXA4CZ8jWGScAmYZTa', 'Docente', '2026-06-30 17:26:02.968440')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:26:02.970483', 'Ciência da Computação', '2026-06-30 17:26:02.970483')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 197 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.4ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:26:02.972028', 197, 'Engenharia de Software', '2026-06-30 17:26:02.972028')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 100 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 100 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:26:02.973601', 100, NULL, 'TA', '2026.1', '2026-06-30 17:26:02.973601')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.5ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:26:02.974232', NULL, NULL, NULL, NULL, 91, '2026-06-30 17:26:02.974232')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaForm Exists? (0.4ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 225 AND `resposta_forms`.`formulario_id` = 63 LIMIT 1
+RespostaForm Create (0.2ms)  INSERT INTO `resposta_forms` (`created_at`, `data_submissao`, `formulario_id`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:26:02.975692', '2026-06-30', 63, '2026-06-30 17:26:02.975692', 225)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:26:02.976333', NULL, 63, 1, 'Texto', '2026-06-30 17:26:02.976333')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaElem Create (0.4ms)  INSERT INTO `resposta_elems` (`campo_form_id`, `created_at`, `elemento_form_id`, `resposta_form_id`, `texto_resposta`, `updated_at`) VALUES (NULL, '2026-06-30 17:26:02.977109', 55, 14, 'Resposta inicial', '2026-06-30 17:26:02.977109')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:26:02 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_re2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_re2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/225/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms)

+ +
RespostaElem Count (0.3ms)  SELECT COUNT(*) FROM `resposta_elems`
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.5ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:26:03.167373', NULL, 63, 2, NULL, '2026-06-30 17:26:03.167373')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/resposta_elems” for 127.0.0.1 at 2026-06-30 14:26:03 -0300 Processing by RespostaElemsController#create as HTML

+ +
Parameters: {"resposta_elem" => {"texto_resposta" => "Nova Resposta", "resposta_form_id" => "14", "elemento_form_id" => "56"}}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 225 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaForm Load (0.2ms)  SELECT `resposta_forms`.* FROM `resposta_forms` WHERE `resposta_forms`.`id` = 14 LIMIT 1
+ElementoForm Load (0.2ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`id` = 56 LIMIT 1
+RespostaElem Create (0.3ms)  INSERT INTO `resposta_elems` (`campo_form_id`, `created_at`, `elemento_form_id`, `resposta_form_id`, `texto_resposta`, `updated_at`) VALUES (NULL, '2026-06-30 17:26:03.170509', 56, 14, 'Nova Resposta', '2026-06-30 17:26:03.170509')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/resposta_elems/11 Completed 302 Found in 3ms (ActiveRecord: 1.1ms (4 queries, 0 cached) | GC: 0.1ms)

+ +
RespostaElem Count (0.2ms)  SELECT COUNT(*) FROM `resposta_elems`
+RespostaElem Load (0.2ms)  SELECT `resposta_elems`.* FROM `resposta_elems` ORDER BY `resposta_elems`.`id` DESC LIMIT 1
+TRANSACTION (0.6ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_re2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_re2@unb.br' LIMIT 1
+Docente Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:03.361849', NULL, NULL, NULL, NULL, 'doc_re2@unb.br', 'Doutorado', 'doc_re2', 'Docente RE2', NULL, NULL, '$2a$12$Rs4T2tfzAt28DOhRSAId.eSmkFlmroWmBbLBFqn4IvChuRRDNIAk6', 'Docente', '2026-06-30 17:26:03.361849')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:26:03.364169', 'Ciência da Computação', '2026-06-30 17:26:03.364169')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 198 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:26:03.365652', 198, 'Engenharia de Software', '2026-06-30 17:26:03.365652')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 101 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 101 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:26:03.367187', 101, NULL, 'TA', '2026.1', '2026-06-30 17:26:03.367187')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.5ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:26:03.368813', NULL, NULL, NULL, NULL, 92, '2026-06-30 17:26:03.368813')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaForm Exists? (2.8ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 226 AND `resposta_forms`.`formulario_id` = 64 LIMIT 1
+RespostaForm Create (0.3ms)  INSERT INTO `resposta_forms` (`created_at`, `data_submissao`, `formulario_id`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:26:03.372711', '2026-06-30', 64, '2026-06-30 17:26:03.372711', 226)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:26:03.373360', NULL, 64, 1, 'Texto', '2026-06-30 17:26:03.373360')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaElem Create (0.4ms)  INSERT INTO `resposta_elems` (`campo_form_id`, `created_at`, `elemento_form_id`, `resposta_form_id`, `texto_resposta`, `updated_at`) VALUES (NULL, '2026-06-30 17:26:03.374106', 57, 15, 'Resposta inicial', '2026-06-30 17:26:03.374106')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:26:03 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_re2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_re2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/226/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
RespostaElem Count (0.2ms)  SELECT COUNT(*) FROM `resposta_elems`
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:26:03.566126', NULL, 64, 2, NULL, '2026-06-30 17:26:03.566126')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/resposta_elems” for 127.0.0.1 at 2026-06-30 14:26:03 -0300 Processing by RespostaElemsController#create as HTML

+ +
Parameters: {"resposta_elem" => {"texto_resposta" => "", "resposta_form_id" => "15", "elemento_form_id" => "58"}}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 226 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaForm Load (0.3ms)  SELECT `resposta_forms`.* FROM `resposta_forms` WHERE `resposta_forms`.`id` = 15 LIMIT 1
+ElementoForm Load (0.2ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`id` = 58 LIMIT 1
+TRANSACTION (0.1ms)  ROLLBACK TO SAVEPOINT active_record_1
+Rendering layout layouts/application.html.erb
+Rendering resposta_elems/new.html.erb within layouts/application
+Rendered resposta_elems/_form.html.erb (Duration: 0.7ms | GC: 0.0ms)
+Rendered resposta_elems/new.html.erb within layouts/application (Duration: 0.8ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.0ms | GC: 0.0ms)
+ +

Completed 422 Unprocessable Content in 3ms (Views: 1.2ms | ActiveRecord: 1.0ms (3 queries, 0 cached) | GC: 0.0ms)

+ +
RespostaElem Count (0.2ms)  SELECT COUNT(*) FROM `resposta_elems`
+TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_re2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_re2@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:03.761366', NULL, NULL, NULL, NULL, 'doc_re2@unb.br', 'Doutorado', 'doc_re2', 'Docente RE2', NULL, NULL, '$2a$12$Wasp73Qs8Rw7nP.kTusedO6ov.iFs7wNaHOnCjzk8s2Ic3cSiCh7O', 'Docente', '2026-06-30 17:26:03.761366')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:26:03.763595', 'Ciência da Computação', '2026-06-30 17:26:03.763595')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 199 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:26:03.765055', 199, 'Engenharia de Software', '2026-06-30 17:26:03.765055')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 102 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 102 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:26:03.766584', 102, NULL, 'TA', '2026.1', '2026-06-30 17:26:03.766584')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:26:03.767196', NULL, NULL, NULL, NULL, 93, '2026-06-30 17:26:03.767196')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaForm Exists? (0.4ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 227 AND `resposta_forms`.`formulario_id` = 65 LIMIT 1
+RespostaForm Create (0.2ms)  INSERT INTO `resposta_forms` (`created_at`, `data_submissao`, `formulario_id`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:26:03.768446', '2026-06-30', 65, '2026-06-30 17:26:03.768446', 227)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:26:03.769050', NULL, 65, 1, 'Texto', '2026-06-30 17:26:03.769050')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaElem Create (0.4ms)  INSERT INTO `resposta_elems` (`campo_form_id`, `created_at`, `elemento_form_id`, `resposta_form_id`, `texto_resposta`, `updated_at`) VALUES (NULL, '2026-06-30 17:26:03.769851', 59, 16, 'Resposta inicial', '2026-06-30 17:26:03.769851')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:26:03 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_re2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_re2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/227/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/resposta_elems/13” for 127.0.0.1 at 2026-06-30 14:26:03 -0300 Processing by RespostaElemsController#show as HTML

+ +
Parameters: {"id" => "13"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 227 LIMIT 1
+RespostaElem Load (0.2ms)  SELECT `resposta_elems`.* FROM `resposta_elems` WHERE `resposta_elems`.`id` = 13 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering resposta_elems/show.html.erb within layouts/application
+Rendered resposta_elems/_resposta_elem.html.erb (Duration: 0.0ms | GC: 0.0ms)
+Rendered resposta_elems/show.html.erb within layouts/application (Duration: 0.3ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.6ms | GC: 0.0ms)
+ +

Completed 200 OK in 3ms (Views: 0.7ms | ActiveRecord: 0.6ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_re2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_re2@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:04.152368', NULL, NULL, NULL, NULL, 'doc_re2@unb.br', 'Doutorado', 'doc_re2', 'Docente RE2', NULL, NULL, '$2a$12$G7xFjhUw4C05Gqsq6AYqOelp2DaWmvBwqhZ32quflYEEusKGkGfka', 'Docente', '2026-06-30 17:26:04.152368')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:26:04.154445', 'Ciência da Computação', '2026-06-30 17:26:04.154445')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 200 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:26:04.155918', 200, 'Engenharia de Software', '2026-06-30 17:26:04.155918')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 103 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.2ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 103 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:26:04.157425', 103, NULL, 'TA', '2026.1', '2026-06-30 17:26:04.157425')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:26:04.158077', NULL, NULL, NULL, NULL, 94, '2026-06-30 17:26:04.158077')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaForm Exists? (0.4ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 228 AND `resposta_forms`.`formulario_id` = 66 LIMIT 1
+RespostaForm Create (0.2ms)  INSERT INTO `resposta_forms` (`created_at`, `data_submissao`, `formulario_id`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:26:04.159357', '2026-06-30', 66, '2026-06-30 17:26:04.159357', 228)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:26:04.159964', NULL, 66, 1, 'Texto', '2026-06-30 17:26:04.159964')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaElem Create (0.4ms)  INSERT INTO `resposta_elems` (`campo_form_id`, `created_at`, `elemento_form_id`, `resposta_form_id`, `texto_resposta`, `updated_at`) VALUES (NULL, '2026-06-30 17:26:04.160713', 60, 17, 'Resposta inicial', '2026-06-30 17:26:04.160713')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:26:04 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_re2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_re2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/228/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/resposta_elems/14/edit” for 127.0.0.1 at 2026-06-30 14:26:04 -0300 Processing by RespostaElemsController#edit as HTML

+ +
Parameters: {"id" => "14"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 228 LIMIT 1
+RespostaElem Load (0.2ms)  SELECT `resposta_elems`.* FROM `resposta_elems` WHERE `resposta_elems`.`id` = 14 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering resposta_elems/edit.html.erb within layouts/application
+Rendered resposta_elems/_form.html.erb (Duration: 0.6ms | GC: 0.1ms)
+Rendered resposta_elems/edit.html.erb within layouts/application (Duration: 0.9ms | GC: 0.1ms)
+Rendered layout layouts/application.html.erb (Duration: 1.1ms | GC: 0.1ms)
+ +

Completed 200 OK in 3ms (Views: 1.3ms | ActiveRecord: 0.5ms (2 queries, 0 cached) | GC: 0.1ms)

+ +
TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_re2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_re2@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:04.543804', NULL, NULL, NULL, NULL, 'doc_re2@unb.br', 'Doutorado', 'doc_re2', 'Docente RE2', NULL, NULL, '$2a$12$0oOBkkWvdheRtg2zVk/RF.9QX8dDAhrJguosyilpHtQkaOFAF1mti', 'Docente', '2026-06-30 17:26:04.543804')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:26:04.545832', 'Ciência da Computação', '2026-06-30 17:26:04.545832')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 201 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:26:04.547273', 201, 'Engenharia de Software', '2026-06-30 17:26:04.547273')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 104 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 104 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:26:04.548791', 104, NULL, 'TA', '2026.1', '2026-06-30 17:26:04.548791')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:26:04.549427', NULL, NULL, NULL, NULL, 95, '2026-06-30 17:26:04.549427')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaForm Exists? (0.4ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 229 AND `resposta_forms`.`formulario_id` = 67 LIMIT 1
+RespostaForm Create (0.2ms)  INSERT INTO `resposta_forms` (`created_at`, `data_submissao`, `formulario_id`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:26:04.550773', '2026-06-30', 67, '2026-06-30 17:26:04.550773', 229)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:26:04.551386', NULL, 67, 1, 'Texto', '2026-06-30 17:26:04.551386')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaElem Create (0.4ms)  INSERT INTO `resposta_elems` (`campo_form_id`, `created_at`, `elemento_form_id`, `resposta_form_id`, `texto_resposta`, `updated_at`) VALUES (NULL, '2026-06-30 17:26:04.552160', 61, 18, 'Resposta inicial', '2026-06-30 17:26:04.552160')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:26:04 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_re2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_re2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/229/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started PATCH “/resposta_elems/15” for 127.0.0.1 at 2026-06-30 14:26:04 -0300 Processing by RespostaElemsController#update as HTML

+ +
Parameters: {"resposta_elem" => {"texto_resposta" => "Texto Atualizado", "resposta_form_id" => "18", "elemento_form_id" => "61"}, "id" => "15"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 229 LIMIT 1
+RespostaElem Load (0.2ms)  SELECT `resposta_elems`.* FROM `resposta_elems` WHERE `resposta_elems`.`id` = 15 LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+RespostaElem Update (0.5ms)  UPDATE `resposta_elems` SET `resposta_elems`.`texto_resposta` = 'Texto Atualizado', `resposta_elems`.`updated_at` = '2026-06-30 17:26:04.743319' WHERE `resposta_elems`.`id` = 15
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/resposta_elems/15 Completed 303 See Other in 3ms (ActiveRecord: 1.3ms (3 queries, 0 cached) | GC: 0.0ms)

+ +
RespostaElem Load (0.1ms)  SELECT `resposta_elems`.* FROM `resposta_elems` WHERE `resposta_elems`.`id` = 15 LIMIT 1
+TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_re2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_re2@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:04.934793', NULL, NULL, NULL, NULL, 'doc_re2@unb.br', 'Doutorado', 'doc_re2', 'Docente RE2', NULL, NULL, '$2a$12$gbjrJcfpDkBX7DiqIYU7h.6Tg7dlrA1s22yv.Zds.mYsiT/7Ha84G', 'Docente', '2026-06-30 17:26:04.934793')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:26:04.937023', 'Ciência da Computação', '2026-06-30 17:26:04.937023')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 202 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:26:04.938527', 202, 'Engenharia de Software', '2026-06-30 17:26:04.938527')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 105 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 105 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:26:04.940045', 105, NULL, 'TA', '2026.1', '2026-06-30 17:26:04.940045')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:26:04.940669', NULL, NULL, NULL, NULL, 96, '2026-06-30 17:26:04.940669')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaForm Exists? (0.4ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 230 AND `resposta_forms`.`formulario_id` = 68 LIMIT 1
+RespostaForm Create (0.2ms)  INSERT INTO `resposta_forms` (`created_at`, `data_submissao`, `formulario_id`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:26:04.941949', '2026-06-30', 68, '2026-06-30 17:26:04.941949', 230)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:26:04.942574', NULL, 68, 1, 'Texto', '2026-06-30 17:26:04.942574')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaElem Create (0.4ms)  INSERT INTO `resposta_elems` (`campo_form_id`, `created_at`, `elemento_form_id`, `resposta_form_id`, `texto_resposta`, `updated_at`) VALUES (NULL, '2026-06-30 17:26:04.943432', 62, 19, 'Resposta inicial', '2026-06-30 17:26:04.943432')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:26:04 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_re2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_re2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/230/avaliacoes Completed 302 Found in 190ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started PATCH “/resposta_elems/16” for 127.0.0.1 at 2026-06-30 14:26:05 -0300 Processing by RespostaElemsController#update as HTML

+ +
Parameters: {"resposta_elem" => {"texto_resposta" => "", "resposta_form_id" => "19", "elemento_form_id" => "62"}, "id" => "16"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 230 LIMIT 1
+RespostaElem Load (0.2ms)  SELECT `resposta_elems`.* FROM `resposta_elems` WHERE `resposta_elems`.`id` = 16 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering resposta_elems/edit.html.erb within layouts/application
+Rendered resposta_elems/_form.html.erb (Duration: 0.8ms | GC: 0.0ms)
+Rendered resposta_elems/edit.html.erb within layouts/application (Duration: 0.9ms | GC: 0.1ms)
+Rendered layout layouts/application.html.erb (Duration: 1.2ms | GC: 0.1ms)
+ +

Completed 422 Unprocessable Content in 3ms (Views: 1.3ms | ActiveRecord: 0.6ms (2 queries, 0 cached) | GC: 0.1ms)

+ +
TRANSACTION (0.9ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_re2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_re2@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:05.330281', NULL, NULL, NULL, NULL, 'doc_re2@unb.br', 'Doutorado', 'doc_re2', 'Docente RE2', NULL, NULL, '$2a$12$k1vnCcvC.EMAtAnvLp.d4.20BE1pWf5W3Hb0scma1aOJJ1DSpdGMG', 'Docente', '2026-06-30 17:26:05.330281')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:26:05.332561', 'Ciência da Computação', '2026-06-30 17:26:05.332561')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 203 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:26:05.334038', 203, 'Engenharia de Software', '2026-06-30 17:26:05.334038')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 106 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 106 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:26:05.335580', 106, NULL, 'TA', '2026.1', '2026-06-30 17:26:05.335580')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:26:05.336209', NULL, NULL, NULL, NULL, 97, '2026-06-30 17:26:05.336209')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaForm Exists? (0.4ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 231 AND `resposta_forms`.`formulario_id` = 69 LIMIT 1
+RespostaForm Create (0.2ms)  INSERT INTO `resposta_forms` (`created_at`, `data_submissao`, `formulario_id`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:26:05.337496', '2026-06-30', 69, '2026-06-30 17:26:05.337496', 231)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:26:05.338211', NULL, 69, 1, 'Texto', '2026-06-30 17:26:05.338211')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaElem Create (0.4ms)  INSERT INTO `resposta_elems` (`campo_form_id`, `created_at`, `elemento_form_id`, `resposta_form_id`, `texto_resposta`, `updated_at`) VALUES (NULL, '2026-06-30 17:26:05.338994', 63, 20, 'Resposta inicial', '2026-06-30 17:26:05.338994')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:26:05 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_re2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_re2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/231/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'del_re' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'del_re@unb.br' LIMIT 1
+Docente Create (0.3ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:05.529455', NULL, NULL, NULL, NULL, 'del_re@unb.br', 'Grad', 'del_re', 'Del RE', NULL, NULL, NULL, 'Docente', '2026-06-30 17:26:05.529455')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:26:05.530355', NULL, NULL, NULL, NULL, 97, '2026-06-30 17:26:05.530355')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:26:05.531241', NULL, 70, 1, NULL, '2026-06-30 17:26:05.531241')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaForm Exists? (0.4ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 232 AND `resposta_forms`.`formulario_id` = 70 LIMIT 1
+RespostaForm Create (0.2ms)  INSERT INTO `resposta_forms` (`created_at`, `data_submissao`, `formulario_id`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:26:05.532607', '2026-06-30', 70, '2026-06-30 17:26:05.532607', 232)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaElem Create (0.4ms)  INSERT INTO `resposta_elems` (`campo_form_id`, `created_at`, `elemento_form_id`, `resposta_form_id`, `texto_resposta`, `updated_at`) VALUES (NULL, '2026-06-30 17:26:05.533309', 64, 21, 'Para Deletar', '2026-06-30 17:26:05.533309')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+RespostaElem Count (0.2ms)  SELECT COUNT(*) FROM `resposta_elems`
+ +

Started DELETE “/resposta_elems/18” for 127.0.0.1 at 2026-06-30 14:26:05 -0300 Processing by RespostaElemsController#destroy as HTML

+ +
Parameters: {"id" => "18"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 231 LIMIT 1
+RespostaElem Load (0.2ms)  SELECT `resposta_elems`.* FROM `resposta_elems` WHERE `resposta_elems`.`id` = 18 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaElem Destroy (0.4ms)  DELETE FROM `resposta_elems` WHERE `resposta_elems`.`id` = 18
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/resposta_elems Completed 303 See Other in 2ms (ActiveRecord: 1.0ms (3 queries, 0 cached) | GC: 0.1ms)

+ +
RespostaElem Count (0.2ms)  SELECT COUNT(*) FROM `resposta_elems`
+TRANSACTION (0.9ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_rf2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_rf2@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:05.727003', NULL, NULL, NULL, NULL, 'doc_rf2@unb.br', 'Doutorado', 'doc_rf2', 'Docente RF2', NULL, NULL, '$2a$12$xNZWlEjhzSRh8cRJBFuE3O2R8lE8uZasm5Q3BLq4sKQzZa7.RJ5IS', 'Docente', '2026-06-30 17:26:05.727003')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:26:05.729120', 'Ciência da Computação', '2026-06-30 17:26:05.729120')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.3ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 204 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.3ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:26:05.730723', 204, 'Engenharia de Software', '2026-06-30 17:26:05.730723')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 107 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 107 LIMIT 1
+Turma Create (0.3ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:26:05.732252', 107, NULL, 'TA', '2026.1', '2026-06-30 17:26:05.732252')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:26:05.732970', NULL, NULL, NULL, NULL, 98, '2026-06-30 17:26:05.732970')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaForm Exists? (0.4ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 233 AND `resposta_forms`.`formulario_id` = 71 LIMIT 1
+RespostaForm Create (0.2ms)  INSERT INTO `resposta_forms` (`created_at`, `data_submissao`, `formulario_id`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:26:05.734260', '2026-06-30', 71, '2026-06-30 17:26:05.734260', 233)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:26:05 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_rf2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_rf2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/233/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started DELETE “/logout” for 127.0.0.1 at 2026-06-30 14:26:05 -0300 Processing by SessionsController#destroy as HTML Redirected to www.example.com/ Completed 302 Found in 0ms (ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 0.0ms) Started GET “/resposta_forms” for 127.0.0.1 at 2026-06-30 14:26:05 -0300 Processing by RespostaFormsController#index as HTML

+ +
Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+ +

Redirected to www.example.com/ Filter chain halted as :require_login rendered or redirected Completed 302 Found in 1ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_rf2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_rf2@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:06.117146', NULL, NULL, NULL, NULL, 'doc_rf2@unb.br', 'Doutorado', 'doc_rf2', 'Docente RF2', NULL, NULL, '$2a$12$bwFmtBv8XA4ytbPkZ8TnKuy85kr7sLxg3Jw9ifVxY3lZhEvSmw70O', 'Docente', '2026-06-30 17:26:06.117146')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:26:06.119107', 'Ciência da Computação', '2026-06-30 17:26:06.119107')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 205 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:26:06.120599', 205, 'Engenharia de Software', '2026-06-30 17:26:06.120599')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 108 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 108 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:26:06.122206', 108, NULL, 'TA', '2026.1', '2026-06-30 17:26:06.122206')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:26:06.122834', NULL, NULL, NULL, NULL, 99, '2026-06-30 17:26:06.122834')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaForm Exists? (0.4ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 234 AND `resposta_forms`.`formulario_id` = 72 LIMIT 1
+RespostaForm Create (0.2ms)  INSERT INTO `resposta_forms` (`created_at`, `data_submissao`, `formulario_id`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:26:06.124110', '2026-06-30', 72, '2026-06-30 17:26:06.124110', 234)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:26:06 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_rf2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_rf2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/234/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/resposta_forms” for 127.0.0.1 at 2026-06-30 14:26:06 -0300 Processing by RespostaFormsController#index as HTML

+ +
Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 234 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering resposta_forms/index.html.erb within layouts/application
+RespostaForm Load (0.2ms)  SELECT `resposta_forms`.* FROM `resposta_forms`
+Rendered resposta_forms/_resposta_form.html.erb (Duration: 0.1ms | GC: 0.0ms)
+Rendered resposta_forms/index.html.erb within layouts/application (Duration: 1.1ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.3ms | GC: 0.0ms)
+ +

Completed 200 OK in 3ms (Views: 1.5ms | ActiveRecord: 0.5ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_rf2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_rf2@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:06.506794', NULL, NULL, NULL, NULL, 'doc_rf2@unb.br', 'Doutorado', 'doc_rf2', 'Docente RF2', NULL, NULL, '$2a$12$/mPNdJSC.9UdMZMJaAxDMuE6ZhHagZFdgUf6cZvuWewCaCi2z1Jo2', 'Docente', '2026-06-30 17:26:06.506794')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:26:06.508857', 'Ciência da Computação', '2026-06-30 17:26:06.508857')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 206 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:26:06.510352', 206, 'Engenharia de Software', '2026-06-30 17:26:06.510352')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 109 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 109 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:26:06.511898', 109, NULL, 'TA', '2026.1', '2026-06-30 17:26:06.511898')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:26:06.512529', NULL, NULL, NULL, NULL, 100, '2026-06-30 17:26:06.512529')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaForm Exists? (0.4ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 235 AND `resposta_forms`.`formulario_id` = 73 LIMIT 1
+RespostaForm Create (0.2ms)  INSERT INTO `resposta_forms` (`created_at`, `data_submissao`, `formulario_id`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:26:06.513798', '2026-06-30', 73, '2026-06-30 17:26:06.513798', 235)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:26:06 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_rf2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_rf2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/235/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/resposta_forms/new” for 127.0.0.1 at 2026-06-30 14:26:06 -0300 Processing by RespostaFormsController#new as HTML

+ +
Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 235 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering resposta_forms/new.html.erb within layouts/application
+Rendered resposta_forms/_form.html.erb (Duration: 1.3ms | GC: 0.1ms)
+Rendered resposta_forms/new.html.erb within layouts/application (Duration: 1.7ms | GC: 0.1ms)
+Rendered layout layouts/application.html.erb (Duration: 1.9ms | GC: 0.1ms)
+ +

Completed 200 OK in 3ms (Views: 2.1ms | ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.1ms)

+ +
TRANSACTION (0.6ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_rf2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_rf2@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:06.897224', NULL, NULL, NULL, NULL, 'doc_rf2@unb.br', 'Doutorado', 'doc_rf2', 'Docente RF2', NULL, NULL, '$2a$12$sEQzFr0XxWLPrxUqFUq2qOAu7EFOqK0BH.TPtYP54xRHb2BabHPAW', 'Docente', '2026-06-30 17:26:06.897224')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:26:06.899423', 'Ciência da Computação', '2026-06-30 17:26:06.899423')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 207 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.4ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:26:06.900973', 207, 'Engenharia de Software', '2026-06-30 17:26:06.900973')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 110 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 110 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:26:06.902655', 110, NULL, 'TA', '2026.1', '2026-06-30 17:26:06.902655')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.2ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:26:06.903453', NULL, NULL, NULL, NULL, 101, '2026-06-30 17:26:06.903453')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaForm Exists? (0.4ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 236 AND `resposta_forms`.`formulario_id` = 74 LIMIT 1
+RespostaForm Create (0.2ms)  INSERT INTO `resposta_forms` (`created_at`, `data_submissao`, `formulario_id`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:26:06.904624', '2026-06-30', 74, '2026-06-30 17:26:06.904624', 236)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:26:06 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_rf2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_rf2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/236/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms)

+ +
RespostaForm Count (0.3ms)  SELECT COUNT(*) FROM `resposta_forms`
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Formulario Create (0.5ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:26:07.095414', NULL, NULL, NULL, NULL, 101, '2026-06-30 17:26:07.095414')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/resposta_forms” for 127.0.0.1 at 2026-06-30 14:26:07 -0300 Processing by RespostaFormsController#create as HTML

+ +
Parameters: {"resposta_form" => {"data_submissao" => "2026-06-30", "formulario_id" => "75", "usuario_id" => "236"}}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 236 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Load (0.4ms)  SELECT `formularios`.* FROM `formularios` WHERE `formularios`.`id` = 75 LIMIT 1
+CACHE Usuario Load (0.0ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 236 LIMIT 1
+RespostaForm Exists? (0.3ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 236 AND `resposta_forms`.`formulario_id` = 75 LIMIT 1
+RespostaForm Create (0.3ms)  INSERT INTO `resposta_forms` (`created_at`, `data_submissao`, `formulario_id`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:26:07.099131', '2026-06-30', 75, '2026-06-30 17:26:07.099131', 236)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/resposta_forms/26 Completed 302 Found in 3ms (ActiveRecord: 1.4ms (5 queries, 1 cached) | GC: 0.1ms)

+ +
RespostaForm Count (0.2ms)  SELECT COUNT(*) FROM `resposta_forms`
+RespostaForm Load (0.2ms)  SELECT `resposta_forms`.* FROM `resposta_forms` ORDER BY `resposta_forms`.`id` DESC LIMIT 1
+TRANSACTION (1.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_rf2' LIMIT 1
+Usuario Exists? (0.1ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_rf2@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:07.292060', NULL, NULL, NULL, NULL, 'doc_rf2@unb.br', 'Doutorado', 'doc_rf2', 'Docente RF2', NULL, NULL, '$2a$12$u0OPAgBPssBxX8SFKwVloujbeXjx5RL8wFH2iaJUQmurtGAi/fACC', 'Docente', '2026-06-30 17:26:07.292060')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.5ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.5ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:26:07.294428', 'Ciência da Computação', '2026-06-30 17:26:07.294428')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.3ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 208 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.3ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:26:07.296199', 208, 'Engenharia de Software', '2026-06-30 17:26:07.296199')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 111 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.3ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 111 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:26:07.297730', 111, NULL, 'TA', '2026.1', '2026-06-30 17:26:07.297730')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:26:07.298334', NULL, NULL, NULL, NULL, 102, '2026-06-30 17:26:07.298334')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaForm Exists? (0.4ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 237 AND `resposta_forms`.`formulario_id` = 76 LIMIT 1
+RespostaForm Create (0.2ms)  INSERT INTO `resposta_forms` (`created_at`, `data_submissao`, `formulario_id`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:26:07.299600', '2026-06-30', 76, '2026-06-30 17:26:07.299600', 237)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:26:07 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_rf2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_rf2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/237/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms)

+ +
RespostaForm Count (0.3ms)  SELECT COUNT(*) FROM `resposta_forms`
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_rf3' LIMIT 1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_rf3@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:07.678791', NULL, NULL, NULL, NULL, 'doc_rf3@unb.br', 'Mestrado', 'doc_rf3', 'Docente RF3', NULL, NULL, '$2a$12$PS1RuQWE4rOElhpbPr3GQu8UN.pMlSB46O66ZeoS9al/a4JWzR1D2', 'Docente', '2026-06-30 17:26:07.678791')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/resposta_forms” for 127.0.0.1 at 2026-06-30 14:26:07 -0300 Processing by RespostaFormsController#create as HTML

+ +
Parameters: {"resposta_form" => {"data_submissao" => nil, "formulario_id" => "76", "usuario_id" => "238"}}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 237 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Load (0.4ms)  SELECT `formularios`.* FROM `formularios` WHERE `formularios`.`id` = 76 LIMIT 1
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 238 LIMIT 1
+RespostaForm Exists? (0.3ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 238 AND `resposta_forms`.`formulario_id` = 76 LIMIT 1
+TRANSACTION (0.1ms)  ROLLBACK TO SAVEPOINT active_record_1
+Rendering layout layouts/application.html.erb
+Rendering resposta_forms/new.html.erb within layouts/application
+Rendered resposta_forms/_form.html.erb (Duration: 0.7ms | GC: 0.0ms)
+Rendered resposta_forms/new.html.erb within layouts/application (Duration: 0.8ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.0ms | GC: 0.0ms)
+ +

Completed 422 Unprocessable Content in 4ms (Views: 1.2ms | ActiveRecord: 1.4ms (4 queries, 0 cached) | GC: 0.0ms)

+ +
RespostaForm Count (0.2ms)  SELECT COUNT(*) FROM `resposta_forms`
+TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_rf2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_rf2@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:07.877017', NULL, NULL, NULL, NULL, 'doc_rf2@unb.br', 'Doutorado', 'doc_rf2', 'Docente RF2', NULL, NULL, '$2a$12$/ahJczzpYlJL9NWxErHgEO6TsdnIjxLliBkuhudqQy6nGXk0zzb7G', 'Docente', '2026-06-30 17:26:07.877017')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:26:07.879377', 'Ciência da Computação', '2026-06-30 17:26:07.879377')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 209 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:26:07.880983', 209, 'Engenharia de Software', '2026-06-30 17:26:07.880983')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 112 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 112 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:26:07.882599', 112, NULL, 'TA', '2026.1', '2026-06-30 17:26:07.882599')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:26:07.883245', NULL, NULL, NULL, NULL, 103, '2026-06-30 17:26:07.883245')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaForm Exists? (0.4ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 239 AND `resposta_forms`.`formulario_id` = 77 LIMIT 1
+RespostaForm Create (0.3ms)  INSERT INTO `resposta_forms` (`created_at`, `data_submissao`, `formulario_id`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:26:07.884630', '2026-06-30', 77, '2026-06-30 17:26:07.884630', 239)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:26:07 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_rf2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_rf2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/239/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/resposta_forms/28” for 127.0.0.1 at 2026-06-30 14:26:08 -0300 Processing by RespostaFormsController#show as HTML

+ +
Parameters: {"id" => "28"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 239 LIMIT 1
+RespostaForm Load (0.2ms)  SELECT `resposta_forms`.* FROM `resposta_forms` WHERE `resposta_forms`.`id` = 28 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering resposta_forms/show.html.erb within layouts/application
+Rendered resposta_forms/_resposta_form.html.erb (Duration: 0.0ms | GC: 0.0ms)
+Rendered resposta_forms/show.html.erb within layouts/application (Duration: 0.4ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.6ms | GC: 0.0ms)
+ +

Completed 200 OK in 3ms (Views: 0.7ms | ActiveRecord: 0.5ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_rf2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_rf2@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:08.268059', NULL, NULL, NULL, NULL, 'doc_rf2@unb.br', 'Doutorado', 'doc_rf2', 'Docente RF2', NULL, NULL, '$2a$12$J/qEcCd70G9DLvYQQXrSVud.36j/K3iNeZTRiVuxQSrvr6MrLfuTC', 'Docente', '2026-06-30 17:26:08.268059')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:26:08.270579', 'Ciência da Computação', '2026-06-30 17:26:08.270579')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 210 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:26:08.272143', 210, 'Engenharia de Software', '2026-06-30 17:26:08.272143')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 113 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 113 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:26:08.273716', 113, NULL, 'TA', '2026.1', '2026-06-30 17:26:08.273716')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:26:08.274332', NULL, NULL, NULL, NULL, 104, '2026-06-30 17:26:08.274332')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaForm Exists? (0.4ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 240 AND `resposta_forms`.`formulario_id` = 78 LIMIT 1
+RespostaForm Create (0.2ms)  INSERT INTO `resposta_forms` (`created_at`, `data_submissao`, `formulario_id`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:26:08.275594', '2026-06-30', 78, '2026-06-30 17:26:08.275594', 240)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:26:08 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_rf2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_rf2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/240/avaliacoes Completed 302 Found in 203ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/resposta_forms/29/edit” for 127.0.0.1 at 2026-06-30 14:26:08 -0300 Processing by RespostaFormsController#edit as HTML

+ +
Parameters: {"id" => "29"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 240 LIMIT 1
+RespostaForm Load (0.2ms)  SELECT `resposta_forms`.* FROM `resposta_forms` WHERE `resposta_forms`.`id` = 29 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering resposta_forms/edit.html.erb within layouts/application
+Rendered resposta_forms/_form.html.erb (Duration: 0.5ms | GC: 0.0ms)
+Rendered resposta_forms/edit.html.erb within layouts/application (Duration: 0.7ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.0ms | GC: 0.0ms)
+ +

Completed 200 OK in 3ms (Views: 1.1ms | ActiveRecord: 0.6ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.6ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_rf2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_rf2@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:08.679652', NULL, NULL, NULL, NULL, 'doc_rf2@unb.br', 'Doutorado', 'doc_rf2', 'Docente RF2', NULL, NULL, '$2a$12$qd/.q8beFUBAZqE1WxBX0eMK24ON.eLPTO4g5pe2BGUYtRTOXk5q2', 'Docente', '2026-06-30 17:26:08.679652')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:26:08.681865', 'Ciência da Computação', '2026-06-30 17:26:08.681865')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 211 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:26:08.683340', 211, 'Engenharia de Software', '2026-06-30 17:26:08.683340')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 114 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 114 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:26:08.684902', 114, NULL, 'TA', '2026.1', '2026-06-30 17:26:08.684902')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:26:08.685534', NULL, NULL, NULL, NULL, 105, '2026-06-30 17:26:08.685534')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaForm Exists? (0.4ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 241 AND `resposta_forms`.`formulario_id` = 79 LIMIT 1
+RespostaForm Create (0.2ms)  INSERT INTO `resposta_forms` (`created_at`, `data_submissao`, `formulario_id`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:26:08.686840', '2026-06-30', 79, '2026-06-30 17:26:08.686840', 241)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:26:08 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_rf2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_rf2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/241/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started PATCH “/resposta_forms/30” for 127.0.0.1 at 2026-06-30 14:26:08 -0300 Processing by RespostaFormsController#update as HTML

+ +
Parameters: {"resposta_form" => {"data_submissao" => "2026-06-29", "formulario_id" => "79", "usuario_id" => "241"}, "id" => "30"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 241 LIMIT 1
+RespostaForm Load (0.2ms)  SELECT `resposta_forms`.* FROM `resposta_forms` WHERE `resposta_forms`.`id` = 30 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaForm Exists? (0.3ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 241 AND `resposta_forms`.`id` != 30 AND `resposta_forms`.`formulario_id` = 79 LIMIT 1
+RespostaForm Update (0.4ms)  UPDATE `resposta_forms` SET `resposta_forms`.`data_submissao` = '2026-06-29', `resposta_forms`.`updated_at` = '2026-06-30 17:26:08.881460' WHERE `resposta_forms`.`id` = 30
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/resposta_forms/30 Completed 303 See Other in 5ms (ActiveRecord: 3.3ms (4 queries, 0 cached) | GC: 0.0ms)

+ +
RespostaForm Load (0.2ms)  SELECT `resposta_forms`.* FROM `resposta_forms` WHERE `resposta_forms`.`id` = 30 LIMIT 1
+TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_rf2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_rf2@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:09.072634', NULL, NULL, NULL, NULL, 'doc_rf2@unb.br', 'Doutorado', 'doc_rf2', 'Docente RF2', NULL, NULL, '$2a$12$TJGziFLpKPBpmyLCd1xpEOd.vYeRi974zjz4.wSxNZHidgYUMVmTG', 'Docente', '2026-06-30 17:26:09.072634')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:26:09.074725', 'Ciência da Computação', '2026-06-30 17:26:09.074725')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 212 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:26:09.076284', 212, 'Engenharia de Software', '2026-06-30 17:26:09.076284')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 115 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 115 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:26:09.077852', 115, NULL, 'TA', '2026.1', '2026-06-30 17:26:09.077852')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:26:09.078470', NULL, NULL, NULL, NULL, 106, '2026-06-30 17:26:09.078470')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaForm Exists? (0.4ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 242 AND `resposta_forms`.`formulario_id` = 80 LIMIT 1
+RespostaForm Create (0.2ms)  INSERT INTO `resposta_forms` (`created_at`, `data_submissao`, `formulario_id`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:26:09.079708', '2026-06-30', 80, '2026-06-30 17:26:09.079708', 242)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:26:09 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_rf2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_rf2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/242/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started PATCH “/resposta_forms/31” for 127.0.0.1 at 2026-06-30 14:26:09 -0300 Processing by RespostaFormsController#update as HTML

+ +
Parameters: {"resposta_form" => {"data_submissao" => nil, "formulario_id" => "80", "usuario_id" => "242"}, "id" => "31"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 242 LIMIT 1
+RespostaForm Load (0.2ms)  SELECT `resposta_forms`.* FROM `resposta_forms` WHERE `resposta_forms`.`id` = 31 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaForm Exists? (0.5ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 242 AND `resposta_forms`.`id` != 31 AND `resposta_forms`.`formulario_id` = 80 LIMIT 1
+TRANSACTION (0.1ms)  ROLLBACK TO SAVEPOINT active_record_1
+Rendering layout layouts/application.html.erb
+Rendering resposta_forms/edit.html.erb within layouts/application
+Rendered resposta_forms/_form.html.erb (Duration: 0.7ms | GC: 0.0ms)
+Rendered resposta_forms/edit.html.erb within layouts/application (Duration: 0.8ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.0ms | GC: 0.0ms)
+ +

Completed 422 Unprocessable Content in 4ms (Views: 1.2ms | ActiveRecord: 1.3ms (3 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_rf2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_rf2@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:09.463245', NULL, NULL, NULL, NULL, 'doc_rf2@unb.br', 'Doutorado', 'doc_rf2', 'Docente RF2', NULL, NULL, '$2a$12$5xlAnhsqIHa17YGEpbY27ONxS4xvTcSwna1YA4I7Qd.UdhyDPvFwK', 'Docente', '2026-06-30 17:26:09.463245')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:26:09.465300', 'Ciência da Computação', '2026-06-30 17:26:09.465300')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 213 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.5ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (1.1ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:26:09.466935', 213, 'Engenharia de Software', '2026-06-30 17:26:09.466935')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 116 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Turma Exists? (0.5ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 116 LIMIT 1
+Turma Create (0.3ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:26:09.469500', 116, NULL, 'TA', '2026.1', '2026-06-30 17:26:09.469500')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:26:09.470148', NULL, NULL, NULL, NULL, 107, '2026-06-30 17:26:09.470148')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaForm Exists? (0.4ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 243 AND `resposta_forms`.`formulario_id` = 81 LIMIT 1
+RespostaForm Create (0.2ms)  INSERT INTO `resposta_forms` (`created_at`, `data_submissao`, `formulario_id`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:26:09.471401', '2026-06-30', 81, '2026-06-30 17:26:09.471401', 243)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:26:09 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_rf2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_rf2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/243/avaliacoes Completed 302 Found in 192ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.5ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'del_rf' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'del_rf@unb.br' LIMIT 1
+Docente Create (0.3ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:09.665769', NULL, NULL, NULL, NULL, 'del_rf@unb.br', 'Grad', 'del_rf', 'Del RF', NULL, NULL, NULL, 'Docente', '2026-06-30 17:26:09.665769')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:26:09.666792', NULL, NULL, NULL, NULL, 107, '2026-06-30 17:26:09.666792')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaForm Exists? (0.4ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 244 AND `resposta_forms`.`formulario_id` = 82 LIMIT 1
+RespostaForm Create (0.2ms)  INSERT INTO `resposta_forms` (`created_at`, `data_submissao`, `formulario_id`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:26:09.668260', '2026-06-30', 82, '2026-06-30 17:26:09.668260', 244)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+RespostaForm Count (0.2ms)  SELECT COUNT(*) FROM `resposta_forms`
+ +

Started DELETE “/resposta_forms/33” for 127.0.0.1 at 2026-06-30 14:26:09 -0300 Processing by RespostaFormsController#destroy as HTML

+ +
Parameters: {"id" => "33"}
+Usuario Load (0.1ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 243 LIMIT 1
+RespostaForm Load (0.1ms)  SELECT `resposta_forms`.* FROM `resposta_forms` WHERE `resposta_forms`.`id` = 33 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaElem Load (0.3ms)  SELECT `resposta_elems`.* FROM `resposta_elems` WHERE `resposta_elems`.`resposta_form_id` = 33
+RespostaForm Destroy (0.2ms)  DELETE FROM `resposta_forms` WHERE `resposta_forms`.`id` = 33
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/resposta_forms Completed 303 See Other in 2ms (ActiveRecord: 1.0ms (4 queries, 0 cached) | GC: 0.0ms)

+ +
RespostaForm Count (0.2ms)  SELECT COUNT(*) FROM `resposta_forms`
+TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc002' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'novo@unb.br' LIMIT 1
+Docente Create (0.3ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:09.674659', NULL, NULL, 'token_definicao_123', NULL, 'novo@unb.br', 'Mestrado', 'doc002', 'Novo Professor', NULL, NULL, NULL, 'Docente', '2026-06-30 17:26:09.674659')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/definir_senha/token_definicao_123” for 127.0.0.1 at 2026-06-30 14:26:09 -0300 Processing by DefinicaoSenhasController#edit as HTML

+ +
Parameters: {"token" => "[FILTERED]"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`definicao_senha_token` = 'token_definicao_123' LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering definicao_senhas/edit.html.erb within layouts/application
+Rendered definicao_senhas/edit.html.erb within layouts/application (Duration: 0.3ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.5ms | GC: 0.0ms)
+ +

Completed 200 OK in 2ms (Views: 0.9ms | ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+ +

Started GET “/definir_senha/token_inexistente” for 127.0.0.1 at 2026-06-30 14:26:09 -0300 Processing by DefinicaoSenhasController#edit as HTML

+ +
Parameters: {"token" => "[FILTERED]"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`definicao_senha_token` = 'token_inexistente' LIMIT 1
+ +

Redirected to www.example.com/ Completed 302 Found in 0ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc002' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'novo@unb.br' LIMIT 1
+Docente Create (0.3ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:09.681943', NULL, NULL, 'token_definicao_123', NULL, 'novo@unb.br', 'Mestrado', 'doc002', 'Novo Professor', NULL, NULL, NULL, 'Docente', '2026-06-30 17:26:09.681943')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started PATCH “/definir_senha/token_definicao_123” for 127.0.0.1 at 2026-06-30 14:26:09 -0300 Processing by DefinicaoSenhasController#update as HTML

+ +
Parameters: {"senha" => "NovaSenhaSegura123", "senha_confirmation" => "NovaSenhaSegura123", "token" => "[FILTERED]"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`definicao_senha_token` = 'token_definicao_123' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'novo@unb.br' AND `usuarios`.`id` != 246 LIMIT 1
+Docente Update (0.8ms)  UPDATE `usuarios` SET `usuarios`.`definicao_senha_token` = NULL, `usuarios`.`senha_hash` = '$2a$12$MO.aUXOCFT/JRaKkw9V7..dpz7/NKBvUvJyTWjJYp/hcPGD03t82m', `usuarios`.`updated_at` = '2026-06-30 17:26:09.871844' WHERE `usuarios`.`id` = 246
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/ Completed 302 Found in 191ms (ActiveRecord: 1.6ms (3 queries, 0 cached) | GC: 0.0ms)

+ +
Docente Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Docente' AND `usuarios`.`id` = 246 LIMIT 1
+TRANSACTION (1.3ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+ +

Started PATCH “/definir_senha/token_inexistente” for 127.0.0.1 at 2026-06-30 14:26:09 -0300 Processing by DefinicaoSenhasController#update as HTML

+ +
Parameters: {"senha" => "NovaSenhaSegura123", "senha_confirmation" => "NovaSenhaSegura123", "token" => "[FILTERED]"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`definicao_senha_token` = 'token_inexistente' LIMIT 1
+ +

Redirected to www.example.com/ Completed 302 Found in 0ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc002' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'novo@unb.br' LIMIT 1
+Docente Create (0.3ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:09.879736', NULL, NULL, 'token_definicao_123', NULL, 'novo@unb.br', 'Mestrado', 'doc002', 'Novo Professor', NULL, NULL, NULL, 'Docente', '2026-06-30 17:26:09.879736')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started PATCH “/definir_senha/token_definicao_123” for 127.0.0.1 at 2026-06-30 14:26:09 -0300 Processing by DefinicaoSenhasController#update as HTML

+ +
Parameters: {"senha" => "NovaSenha123", "senha_confirmation" => "SenhaDiferente456", "token" => "[FILTERED]"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`definicao_senha_token` = 'token_definicao_123' LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering definicao_senhas/edit.html.erb within layouts/application
+Rendered definicao_senhas/edit.html.erb within layouts/application (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.4ms | GC: 0.0ms)
+ +

Completed 422 Unprocessable Content in 1ms (Views: 0.5ms | ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.2ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc002' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'novo@unb.br' LIMIT 1
+Docente Create (0.3ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:09.883327', NULL, NULL, 'token_definicao_123', NULL, 'novo@unb.br', 'Mestrado', 'doc002', 'Novo Professor', NULL, NULL, NULL, 'Docente', '2026-06-30 17:26:09.883327')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started PATCH “/definir_senha/token_definicao_123” for 127.0.0.1 at 2026-06-30 14:26:09 -0300 Processing by DefinicaoSenhasController#update as HTML

+ +
Parameters: {"senha" => "abc", "senha_confirmation" => "abc", "token" => "[FILTERED]"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`definicao_senha_token` = 'token_definicao_123' LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering definicao_senhas/edit.html.erb within layouts/application
+Rendered definicao_senhas/edit.html.erb within layouts/application (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.3ms | GC: 0.0ms)
+ +

Completed 422 Unprocessable Content in 1ms (Views: 0.4ms | ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.3ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc002' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'novo@unb.br' LIMIT 1
+Docente Create (0.3ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:09.887670', NULL, NULL, 'token_definicao_123', NULL, 'novo@unb.br', 'Mestrado', 'doc002', 'Novo Professor', NULL, NULL, NULL, 'Docente', '2026-06-30 17:26:09.887670')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started PATCH “/definir_senha/token_definicao_123” for 127.0.0.1 at 2026-06-30 14:26:09 -0300 Processing by DefinicaoSenhasController#update as HTML

+ +
Parameters: {"senha" => "NovaSenhaSegura123", "senha_confirmation" => "NovaSenhaSegura123", "token" => "[FILTERED]"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`definicao_senha_token` = 'token_definicao_123' LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering definicao_senhas/edit.html.erb within layouts/application
+Rendered definicao_senhas/edit.html.erb within layouts/application (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.3ms | GC: 0.0ms)
+ +

Completed 422 Unprocessable Content in 1ms (Views: 0.4ms | ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.3ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+ +

Started GET “/redefinir_senha” for 127.0.0.1 at 2026-06-30 14:26:09 -0300 Processing by RedefinicaoSenhasController#new as HTML

+ +
Rendering layout layouts/application.html.erb
+Rendering redefinicao_senhas/new.html.erb within layouts/application
+Rendered redefinicao_senhas/new.html.erb within layouts/application (Duration: 0.2ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.7ms | ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+ +

Started POST “/redefinir_senha” for 127.0.0.1 at 2026-06-30 14:26:09 -0300 Processing by RedefinicaoSenhasController#create as HTML

+ +
Parameters: {"email" => "[FILTERED]"}
+ +

Redirected to www.example.com/redefinir_senha Completed 302 Found in 0ms (ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+ +

Started POST “/redefinir_senha” for 127.0.0.1 at 2026-06-30 14:26:09 -0300 Processing by RedefinicaoSenhasController#create as HTML

+ +
Parameters: {"email" => "[FILTERED]"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'naoexiste@unb.br' LIMIT 1
+ +

Redirected to www.example.com/redefinir_senha Completed 302 Found in 0ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc003' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'esquecido@unb.br' LIMIT 1
+Docente Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:10.084482', NULL, NULL, NULL, NULL, 'esquecido@unb.br', 'Doutorado', 'doc003', 'Professor Esquecido', NULL, 'token_redefinicao_456', '$2a$12$zVtBsmieDcZvo7K7bglzx.m0qshy0o2O77xmhT5vBhIcOozj6Wn0W', 'Docente', '2026-06-30 17:26:10.084482')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/redefinir_senha” for 127.0.0.1 at 2026-06-30 14:26:10 -0300 Processing by RedefinicaoSenhasController#create as HTML

+ +
Parameters: {"email" => "[FILTERED]"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'esquecido@unb.br' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'esquecido@unb.br' AND `usuarios`.`id` != 250 LIMIT 1
+Docente Update (0.4ms)  UPDATE `usuarios` SET `usuarios`.`redefinicao_senha_sent_at` = '2026-06-30 17:26:10.086247', `usuarios`.`redefinicao_senha_token` = 'QLrOZvVoY7yToqNoW9zE8wLpH-SUO-2h5G_zPJJ1iZk', `usuarios`.`updated_at` = '2026-06-30 17:26:10.086945' WHERE `usuarios`.`id` = 250
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Rendering layout layouts/mailer.html.erb
+Rendering usuario_mailer/redefinicao_senha.html.erb within layouts/mailer
+Rendered usuario_mailer/redefinicao_senha.html.erb within layouts/mailer (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/mailer.html.erb (Duration: 0.2ms | GC: 0.0ms)
+Rendering layout layouts/mailer.text.erb
+Rendering usuario_mailer/redefinicao_senha.text.erb within layouts/mailer
+Rendered usuario_mailer/redefinicao_senha.text.erb within layouts/mailer (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/mailer.text.erb (Duration: 0.1ms | GC: 0.0ms)
+ +

UsuarioMailer#redefinicao_senha: processed outbound mail in 7.7ms Delivered mail 6a43fc3218621_18291d18620dd@MacBook-Air-de-Elvis.local.mail (6.6ms) Date: Tue, 30 Jun 2026 14:26:10 -0300 From: camaar@gmail.com To: esquecido@unb.br Message-ID: <6a43fc3218621_18291d18620dd@MacBook-Air-de-Elvis.local.mail> Subject: =?UTF-8?Q?Redefini=C3=A7=C3=A3o_de_senha?= MIME-Version: 1.0 Content-Type: multipart/alternative;

+ +
boundary="--==_mimepart_6a43fc3217a4a_18291d186194c";
+charset=UTF-8
+
+ +

Content-Transfer-Encoding: 7bit

+ +

—-==_mimepart_6a43fc3217a4a_18291d186194c Content-Type: text/plain;

+ +
charset=UTF-8
+
+ +

Content-Transfer-Encoding: quoted-printable

+ +

Ol=C3=A1, Professor Esquecido.

+ +

Voc=C3=AA solicitou a redefini=C3=A7=C3=A3o da sua senha. Acesse o link a= baixo:

+ +

example.com/redefinir_senha/QLrOZvVoY7yToqNoW9zE8wLpH-SUO-2h5G_zPJ= J1iZk

+ +

—-==_mimepart_6a43fc3217a4a_18291d186194c Content-Type: text/html;

+ +
charset=UTF-8
+
+ +

Content-Transfer-Encoding: quoted-printable

+ +

<!DOCTYPE html> <html>

+ +
<head>
+  <meta http-equiv=3D"Content-Type" content=3D"text/html; charset=3Dutf=
+ +

-8“>

+ +
  <style>
+    /* Email styles need to be inline */
+  </style>
+</head>
+
+<body>
+  <p>Ol=C3=A1, Professor Esquecido.</p>
+ +

<p>Voc=C3=AA solicitou a redefini=C3=A7=C3=A3o da sua senha. Acesse o lin= k abaixo:</p>

+ +

<p><a href=3D“example.com/redefinir_senha/QLrOZvVoY7yToqNoW9zE8wLp= H-SUO-2h5G_zPJJ1iZk”>example.com/redefinir_senha/QLrOZvVoY7yToqNoW= 9zE8wLpH-SUO-2h5G_zPJJ1iZk</a></p>

+ +
</body>
+ +

</html>

+ +

—-==_mimepart_6a43fc3217a4a_18291d186194c–

+ +

Redirected to www.example.com/ Completed 302 Found in 18ms (ActiveRecord: 1.3ms (3 queries, 0 cached) | GC: 0.0ms)

+ +
Docente Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Docente' AND `usuarios`.`id` = 250 LIMIT 1
+TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+ +

Started GET “/redefinir_senha/token_inexistente” for 127.0.0.1 at 2026-06-30 14:26:10 -0300 Processing by RedefinicaoSenhasController#edit as HTML

+ +
Parameters: {"token" => "[FILTERED]"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`redefinicao_senha_token` = 'token_inexistente' LIMIT 1
+ +

Redirected to www.example.com/ Completed 302 Found in 0ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc003' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'esquecido@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:10.297449', NULL, NULL, NULL, NULL, 'esquecido@unb.br', 'Doutorado', 'doc003', 'Professor Esquecido', NULL, 'token_redefinicao_456', '$2a$12$YnfsBHqJSLU6.45Fx0EXa.IenUXBSTKW0zElYirE3PKIw5WS.g/qW', 'Docente', '2026-06-30 17:26:10.297449')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started PATCH “/redefinir_senha/token_redefinicao_456” for 127.0.0.1 at 2026-06-30 14:26:10 -0300 Processing by RedefinicaoSenhasController#update as HTML

+ +
Parameters: {"senha" => "SenhaTotalmenteNova1", "senha_confirmation" => "SenhaTotalmenteNova1", "token" => "[FILTERED]"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`redefinicao_senha_token` = 'token_redefinicao_456' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'esquecido@unb.br' AND `usuarios`.`id` != 251 LIMIT 1
+Docente Update (0.6ms)  UPDATE `usuarios` SET `usuarios`.`redefinicao_senha_token` = NULL, `usuarios`.`senha_hash` = '$2a$12$5wgAZltgeTVfzag7eH/6keO73zHCe2FZVny.mg2KGY/2LhHHsDbRy', `usuarios`.`updated_at` = '2026-06-30 17:26:10.487906' WHERE `usuarios`.`id` = 251
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/ Completed 302 Found in 190ms (ActiveRecord: 1.7ms (3 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+ +

Started PATCH “/redefinir_senha/token_inexistente” for 127.0.0.1 at 2026-06-30 14:26:10 -0300 Processing by RedefinicaoSenhasController#update as HTML

+ +
Parameters: {"senha" => "SenhaTotalmenteNova1", "senha_confirmation" => "SenhaTotalmenteNova1", "token" => "[FILTERED]"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`redefinicao_senha_token` = 'token_inexistente' LIMIT 1
+ +

Redirected to www.example.com/ Completed 302 Found in 1ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc003' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'esquecido@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:10.683151', NULL, NULL, NULL, NULL, 'esquecido@unb.br', 'Doutorado', 'doc003', 'Professor Esquecido', NULL, 'token_redefinicao_456', '$2a$12$cZlunaVYy59iQpOg3BIN4e1JF7vaiNXLyq9WaGReQ5bB.oN.TrNAO', 'Docente', '2026-06-30 17:26:10.683151')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started PATCH “/redefinir_senha/token_redefinicao_456” for 127.0.0.1 at 2026-06-30 14:26:10 -0300 Processing by RedefinicaoSenhasController#update as HTML

+ +
Parameters: {"senha" => "SenhaNova123", "senha_confirmation" => "SenhaDiferente456", "token" => "[FILTERED]"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`redefinicao_senha_token` = 'token_redefinicao_456' LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering redefinicao_senhas/edit.html.erb within layouts/application
+Rendered redefinicao_senhas/edit.html.erb within layouts/application (Duration: 0.3ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.6ms | GC: 0.0ms)
+ +

Completed 422 Unprocessable Content in 2ms (Views: 1.6ms | ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc003' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'esquecido@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:10.877299', NULL, NULL, NULL, NULL, 'esquecido@unb.br', 'Doutorado', 'doc003', 'Professor Esquecido', NULL, 'token_redefinicao_456', '$2a$12$unPLr4tt8iRJ1Eaptm8LNeqOnhURaE0SrcLPCzPy9ctruxJ4XPYym', 'Docente', '2026-06-30 17:26:10.877299')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started PATCH “/redefinir_senha/token_redefinicao_456” for 127.0.0.1 at 2026-06-30 14:26:10 -0300 Processing by RedefinicaoSenhasController#update as HTML

+ +
Parameters: {"senha" => "abc", "senha_confirmation" => "abc", "token" => "[FILTERED]"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`redefinicao_senha_token` = 'token_redefinicao_456' LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering redefinicao_senhas/edit.html.erb within layouts/application
+Rendered redefinicao_senhas/edit.html.erb within layouts/application (Duration: 0.2ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.4ms | GC: 0.0ms)
+ +

Completed 422 Unprocessable Content in 1ms (Views: 0.6ms | ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc003' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'esquecido@unb.br' LIMIT 1
+Docente Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:11.075998', NULL, NULL, NULL, NULL, 'esquecido@unb.br', 'Doutorado', 'doc003', 'Professor Esquecido', NULL, 'token_redefinicao_456', '$2a$12$wfeO7YBXhWFEwdN1rUBi8ekJG1OPViubdH8f46WKBlbuaqVRX9YYS', 'Docente', '2026-06-30 17:26:11.075998')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started PATCH “/redefinir_senha/token_redefinicao_456” for 127.0.0.1 at 2026-06-30 14:26:11 -0300 Processing by RedefinicaoSenhasController#update as HTML

+ +
Parameters: {"senha" => "SenhaTotalmenteNova1", "senha_confirmation" => "SenhaTotalmenteNova1", "token" => "[FILTERED]"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`redefinicao_senha_token` = 'token_redefinicao_456' LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering redefinicao_senhas/edit.html.erb within layouts/application
+Rendered redefinicao_senhas/edit.html.erb within layouts/application (Duration: 0.4ms | GC: 0.3ms)
+Rendered layout layouts/application.html.erb (Duration: 0.7ms | GC: 0.3ms)
+ +

Completed 422 Unprocessable Content in 2ms (Views: 0.9ms | ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.3ms)

+ +
TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:26:11.082016', 'Ciência da Computação', '2026-06-30 17:26:11.082016')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:11.270873', NULL, NULL, NULL, 214, 'admin@unb.br', NULL, 'adm001', 'Admin Teste', NULL, NULL, '$2a$12$45I5gqS0Sm7tsqiq7YxfCuTyb/yhINfgJgVrj7nkeAXVOVu0anLlO', 'Administrador', '2026-06-30 17:26:11.270873')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:11.460757', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Prof Teste', NULL, NULL, '$2a$12$/UAPVzqImKlpjiPRWDBWeef7M8lovTaU7p7Gh8wZ.k5LgfA8zpyQC', 'Docente', '2026-06-30 17:26:11.460757')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/” for 127.0.0.1 at 2026-06-30 14:26:11 -0300 Processing by SessionsController#new as HTML

+ +
Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering sessions/new.html.erb within layouts/application
+Rendered sessions/new.html.erb within layouts/application (Duration: 0.4ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.7ms | GC: 0.0ms)
+ +

Completed 200 OK in 3ms (Views: 1.1ms | ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.6ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:26:11.468001', 'Ciência da Computação', '2026-06-30 17:26:11.468001')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:11.656729', NULL, NULL, NULL, 215, 'admin@unb.br', NULL, 'adm001', 'Admin Teste', NULL, NULL, '$2a$12$PaLLXvtTpYOP83RUelNIK.cm5.RgQCHlVPDF8qgRCUQ6CndNXAi5O', 'Administrador', '2026-06-30 17:26:11.656729')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:11.846749', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Prof Teste', NULL, NULL, '$2a$12$ZIMWGbrlacEn7xFtsEkLwOaj6GuY/HwnHvNE4OEUBvf3sdHVntq3y', 'Docente', '2026-06-30 17:26:11.846749')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:26:11 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/257/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/” for 127.0.0.1 at 2026-06-30 14:26:12 -0300 Processing by SessionsController#new as HTML

+ +
Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 257 LIMIT 1
+ +

Redirected to www.example.com/admin/257/avaliacoes Completed 302 Found in 1ms (ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:26:12.042537', 'Ciência da Computação', '2026-06-30 17:26:12.042537')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:12.232323', NULL, NULL, NULL, 216, 'admin@unb.br', NULL, 'adm001', 'Admin Teste', NULL, NULL, '$2a$12$X56S49kSr2kY0x4x7GksBOfOH4Q4TbesrF8f3lEkwbCkmu2ShCipi', 'Administrador', '2026-06-30 17:26:12.232323')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.5ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:12.422537', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Prof Teste', NULL, NULL, '$2a$12$MZLlJd/l69T9CEF6Y.xm8e4WeO6Yabkdt7H28pDsKY9jkq5f7vBR2', 'Docente', '2026-06-30 17:26:12.422537')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:26:12 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "prof@unb.br", "senha" => "Senha123"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/260/avaliacoes Completed 302 Found in 191ms (ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/” for 127.0.0.1 at 2026-06-30 14:26:12 -0300 Processing by SessionsController#new as HTML

+ +
Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 260 LIMIT 1
+ +

Redirected to www.example.com/usuarios/260/avaliacoes Completed 302 Found in 1ms (ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:26:12.620247', 'Ciência da Computação', '2026-06-30 17:26:12.620247')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:12.809803', NULL, NULL, NULL, 217, 'admin@unb.br', NULL, 'adm001', 'Admin Teste', NULL, NULL, '$2a$12$yhzCHmG2xY7DK3U0QC252OPNAmj1SeQY9MPD52rkchRYGjax2wZq.', 'Administrador', '2026-06-30 17:26:12.809803')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Docente Create (0.9ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:12.999280', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Prof Teste', NULL, NULL, '$2a$12$4G2ze/vp46LFsN78qTJRzuKYnCjRPtJKaB.jsO1JAfmTsJmO9tkRS', 'Docente', '2026-06-30 17:26:12.999280')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:26:13 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "", "senha" => "Senha123"}
+ +

Redirected to www.example.com/ Completed 302 Found in 0ms (ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 0.0ms) Started GET “/” for 127.0.0.1 at 2026-06-30 14:26:13 -0300 Processing by SessionsController#new as HTML

+ +
Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering sessions/new.html.erb within layouts/application
+Rendered sessions/new.html.erb within layouts/application (Duration: 0.2ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.5ms | GC: 0.0ms)
+ +

Completed 200 OK in 2ms (Views: 0.6ms | ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (1.0ms)  ROLLBACK
+TRANSACTION (0.2ms)  BEGIN
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:26:13.007908', 'Ciência da Computação', '2026-06-30 17:26:13.007908')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:13.197957', NULL, NULL, NULL, 218, 'admin@unb.br', NULL, 'adm001', 'Admin Teste', NULL, NULL, '$2a$12$syCgTHwURjm.QteRNvE9S.vAjr4ZVQWB.bQSiNBIb/ZRn1jLnBZu.', 'Administrador', '2026-06-30 17:26:13.197957')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.5ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:13.390494', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Prof Teste', NULL, NULL, '$2a$12$wBQcC/ivMbv7krCKhvWcheFHTLH8jQ8bXG6mtpi7Da8oNxUZCWUNC', 'Docente', '2026-06-30 17:26:13.390494')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:26:13 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "prof@unb.br", "senha" => ""}
+ +

Redirected to www.example.com/ Completed 302 Found in 0ms (ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 0.0ms) Started GET “/” for 127.0.0.1 at 2026-06-30 14:26:13 -0300 Processing by SessionsController#new as HTML

+ +
Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering sessions/new.html.erb within layouts/application
+Rendered sessions/new.html.erb within layouts/application (Duration: 0.2ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.7ms | GC: 0.3ms)
+ +

Completed 200 OK in 2ms (Views: 0.8ms | ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.3ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.2ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:26:13.397464', 'Ciência da Computação', '2026-06-30 17:26:13.397464')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.8ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:13.586363', NULL, NULL, NULL, 219, 'admin@unb.br', NULL, 'adm001', 'Admin Teste', NULL, NULL, '$2a$12$mBBta5jx.tnQQuGLAIsQi.bNz7/reqfMXQ0k8jThteJtuyTIb0XeS', 'Administrador', '2026-06-30 17:26:13.586363')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.6ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:13.776403', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Prof Teste', NULL, NULL, '$2a$12$axXSe6.MdEKaWedIdkRTXOlmJW7u5aJNC6w61xUHXGkl71TEwRKmi', 'Docente', '2026-06-30 17:26:13.776403')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:26:13 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "naoexiste@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'naoexiste@unb.br' LIMIT 1
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`matricula` = 'naoexiste@unb.br' LIMIT 1
+ +

Redirected to www.example.com/ Completed 302 Found in 1ms (ActiveRecord: 0.5ms (2 queries, 0 cached) | GC: 0.2ms) Started GET “/” for 127.0.0.1 at 2026-06-30 14:26:13 -0300 Processing by SessionsController#new as HTML

+ +
Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering sessions/new.html.erb within layouts/application
+Rendered sessions/new.html.erb within layouts/application (Duration: 0.2ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.5ms | ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:26:13.783423', 'Ciência da Computação', '2026-06-30 17:26:13.783423')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:13.972170', NULL, NULL, NULL, 220, 'admin@unb.br', NULL, 'adm001', 'Admin Teste', NULL, NULL, '$2a$12$rZodgpyqh9WxEoznVVT0n.LBiQ7BCwwA6w4XoahiEGDKI/E6tZvcC', 'Administrador', '2026-06-30 17:26:13.972170')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:14.161841', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Prof Teste', NULL, NULL, '$2a$12$QW9HtwacyzLZ/hlFC7zK8eG8vktquICBBrqRjMm.r7htqPWEmVeB.', 'Docente', '2026-06-30 17:26:14.161841')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:26:14 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "prof@unb.br", "senha" => "errada"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+ +

Redirected to www.example.com/ Completed 302 Found in 188ms (ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/” for 127.0.0.1 at 2026-06-30 14:26:14 -0300 Processing by SessionsController#new as HTML

+ +
Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering sessions/new.html.erb within layouts/application
+Rendered sessions/new.html.erb within layouts/application (Duration: 0.2ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 2ms (Views: 0.6ms | ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:26:14.357017', 'Ciência da Computação', '2026-06-30 17:26:14.357017')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:14.545792', NULL, NULL, NULL, 221, 'admin@unb.br', NULL, 'adm001', 'Admin Teste', NULL, NULL, '$2a$12$hGVuXqa8pmWhZXJZ3Ktk4uEm/DRhWIEd.hZiutCgUR5ygBiheXviq', 'Administrador', '2026-06-30 17:26:14.545792')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:14.735502', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Prof Teste', NULL, NULL, '$2a$12$UibtFXVmaXtUmn48KUOsve2ObDtty/Cm8prGad0pSUZ6/FdMEBR1i', 'Docente', '2026-06-30 17:26:14.735502')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:26:14 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/269/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (1.2ms)  ROLLBACK
+TRANSACTION (0.2ms)  BEGIN
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.5ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:26:14.929832', 'Ciência da Computação', '2026-06-30 17:26:14.929832')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.5ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:15.118990', NULL, NULL, NULL, 222, 'admin@unb.br', NULL, 'adm001', 'Admin Teste', NULL, NULL, '$2a$12$hkGcQqQ/knfn0dLWvHBL7uPsYpHU3y3K1DpKAL41O4tzkFWduSi.i', 'Administrador', '2026-06-30 17:26:15.118990')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.5ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:15.310486', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Prof Teste', NULL, NULL, '$2a$12$z0A62SB6KZ8enGhZsHDWwugu1iumYm2UKyzodF9PljDXdIgpFlNWq', 'Docente', '2026-06-30 17:26:15.310486')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:26:15 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "adm001", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'adm001' LIMIT 1
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm001' LIMIT 1
+ +

Redirected to www.example.com/admin/271/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.6ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (1.0ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:26:15.504244', 'Ciência da Computação', '2026-06-30 17:26:15.504244')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:15.693280', NULL, NULL, NULL, 223, 'admin@unb.br', NULL, 'adm001', 'Admin Teste', NULL, NULL, '$2a$12$A8i6tyXvMxIjGJcic9clSuyeRZfYhkziIitvEKDYVElx8nZE5SZ0.', 'Administrador', '2026-06-30 17:26:15.693280')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.5ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:15.883072', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Prof Teste', NULL, NULL, '$2a$12$TFUND//U3sD/PPJ7muWJLejfz4fnktz9Upt/KzFt19eYhqRZCCxNq', 'Docente', '2026-06-30 17:26:15.883072')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:26:15 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "prof@unb.br", "senha" => "Senha123"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/274/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (1.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:26:16.076989', 'Ciência da Computação', '2026-06-30 17:26:16.076989')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:16.266216', NULL, NULL, NULL, 224, 'admin@unb.br', NULL, 'adm001', 'Admin Teste', NULL, NULL, '$2a$12$dJ7FqKP4GP214QPmUAtYu.iImbgVEALB91mycWolR5pAr8tEPHmxy', 'Administrador', '2026-06-30 17:26:16.266216')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:16.455672', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Prof Teste', NULL, NULL, '$2a$12$GUWl1ubqp04ksFWjUfzY8umgTydpKx4pd20XVDM9vxGgVipYzkKle', 'Docente', '2026-06-30 17:26:16.455672')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:26:16 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc001", "senha" => "Senha123"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc001' LIMIT 1
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+ +

Redirected to www.example.com/usuarios/276/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.7ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (1.1ms)  ROLLBACK
+TRANSACTION (0.2ms)  BEGIN
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:26:16.649674', 'Ciência da Computação', '2026-06-30 17:26:16.649674')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:16.840632', NULL, NULL, NULL, 225, 'admin@unb.br', NULL, 'adm001', 'Admin Teste', NULL, NULL, '$2a$12$roqoXChsl7CfWammePpii.ynJQqWfFPNEIQ9eLDoKd.9CQvAF5CB6', 'Administrador', '2026-06-30 17:26:16.840632')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:17.031660', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Prof Teste', NULL, NULL, '$2a$12$OQWqjCem4ApPo7UWbKNRLujuOdTQzPlEww5NdD7ECNvFdtAxhoTba', 'Docente', '2026-06-30 17:26:17.031660')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:26:17 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "prof@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/278/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started DELETE “/logout” for 127.0.0.1 at 2026-06-30 14:26:17 -0300 Processing by SessionsController#destroy as HTML Redirected to www.example.com/ Completed 302 Found in 0ms (ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 0.1ms)

+ +
TRANSACTION (0.9ms)  ROLLBACK
+TRANSACTION (0.2ms)  BEGIN
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:26:17.226111', 'Ciência da Computação', '2026-06-30 17:26:17.226111')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:17.416140', NULL, NULL, NULL, 226, 'admin@unb.br', NULL, 'adm001', 'Admin Teste', NULL, NULL, '$2a$12$OMGDf54etkSQZwjgGVAohOwGkQlXPld7PtnRNIgkGwZYxITclQWU6', 'Administrador', '2026-06-30 17:26:17.416140')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.6ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Docente Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:17.607420', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Prof Teste', NULL, NULL, '$2a$12$vf7Rds6YEDG65JpiN6KmwuaglWG3BtKAi7FofDmkD9nSAV71GjdbO', 'Docente', '2026-06-30 17:26:17.607420')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:26:17 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "prof@unb.br", "senha" => "Senha123"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/280/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms) Started DELETE “/logout” for 127.0.0.1 at 2026-06-30 14:26:17 -0300 Processing by SessionsController#destroy as HTML Redirected to www.example.com/ Completed 302 Found in 0ms (ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 0.0ms) Started GET “/inicio” for 127.0.0.1 at 2026-06-30 14:26:17 -0300 Processing by HomeController#index as HTML

+ +
Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+ +

Redirected to www.example.com/ Filter chain halted as :require_login rendered or redirected Completed 302 Found in 1ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:26:17.803767', 'Ciência da Computação', '2026-06-30 17:26:17.803767')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '123' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:17.994580', NULL, NULL, NULL, 227, 'admin@unb.br', NULL, '123', 'Admin', NULL, NULL, '$2a$12$50g8SII0/vZnmJa5dZOo8e7kzjLbHLpvpOF57LvJAiZRt3DBQ.qUq', 'Administrador', '2026-06-30 17:26:17.994580')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Template Create (0.5ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:26:17.996477', 'Template Base', '2026-06-30 17:26:17.996477', 281)
+Elemento Create (0.2ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:26:17.997171', 'Questão 1', 1, 49, '2026-06-30 17:26:17.997171')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:26:17 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/281/avaliacoes Completed 302 Found in 190ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/admin/281/templates” for 127.0.0.1 at 2026-06-30 14:26:18 -0300 Processing by TemplatesController#index as HTML

+ +
Parameters: {"admin_id" => "281"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 281 LIMIT 1
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 281 LIMIT 1
+Rendering layout layouts/gerenciamento.html.erb
+Rendering templates/index.html.erb within layouts/gerenciamento
+Template Exists? (0.3ms)  SELECT 1 AS one FROM `templates` WHERE `templates`.`usuario_id` = 281 LIMIT 1
+Template Load (0.2ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`usuario_id` = 281
+Elemento Load (0.2ms)  SELECT `elementos`.* FROM `elementos` WHERE `elementos`.`template_id` = 49
+Campo Load (0.2ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` = 65
+Rendered templates/_grid.html.erb (Duration: 2.9ms | GC: 0.1ms)
+Rendered templates/index.html.erb within layouts/gerenciamento (Duration: 3.3ms | GC: 0.1ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 3.5ms | GC: 0.1ms)
+ +

Completed 200 OK in 6ms (Views: 2.7ms | ActiveRecord: 1.7ms (6 queries, 0 cached) | GC: 0.1ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:26:18.198445', 'Ciência da Computação', '2026-06-30 17:26:18.198445')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '123' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:18.388475', NULL, NULL, NULL, 228, 'admin@unb.br', NULL, '123', 'Admin', NULL, NULL, '$2a$12$/8ixUNW2lciz.7ZRoyMwn.1zlqhLgpfwgNGQijFUmxt3/0k8t/hJe', 'Administrador', '2026-06-30 17:26:18.388475')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Template Create (0.5ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:26:18.390201', 'Template Base', '2026-06-30 17:26:18.390201', 282)
+Elemento Create (0.2ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:26:18.390878', 'Questão 1', 1, 50, '2026-06-30 17:26:18.390878')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:26:18 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/282/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Template Count (0.4ms)  SELECT COUNT(*) FROM `templates`
+ +

Started POST “/admin/282/templates” for 127.0.0.1 at 2026-06-30 14:26:18 -0300 Processing by TemplatesController#create as HTML

+ +
Parameters: {"template" => {"nome" => "Avaliação Nova", "administrador_id" => "282", "elementos_attributes" => [{"enunciado" => "Questão 1", "ordem" => "1"}]}, "admin_id" => "282"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 282 LIMIT 1
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 282 LIMIT 1
+ +

Unpermitted parameter: :administrador_id. Context: { controller: TemplatesController, action: create, request: + +

CACHE Administrador Load (0.0ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 282 LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Template Create (0.5ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:26:18.584792', 'Avaliação Nova', '2026-06-30 17:26:18.584792', 282)
+Elemento Create (0.3ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:26:18.585492', 'Questão 1', 1, 51, '2026-06-30 17:26:18.585492')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/admin/282/templates Completed 302 Found in 4ms (ActiveRecord: 1.6ms (5 queries, 1 cached) | GC: 0.0ms)

+ +
Template Count (0.2ms)  SELECT COUNT(*) FROM `templates`
+TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:26:18.589395', 'Ciência da Computação', '2026-06-30 17:26:18.589395')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '123' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:18.778763', NULL, NULL, NULL, 229, 'admin@unb.br', NULL, '123', 'Admin', NULL, NULL, '$2a$12$spAJl..AeJrb.m/5q18EPuKb2SXP5v5O6XPC3d/INc5YSf.L9DQ0K', 'Administrador', '2026-06-30 17:26:18.778763')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Template Create (0.4ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:26:18.780506', 'Template Base', '2026-06-30 17:26:18.780506', 283)
+Elemento Create (0.2ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:26:18.781151', 'Questão 1', 1, 52, '2026-06-30 17:26:18.781151')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:26:18 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/283/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started PATCH “/admin/283/templates/52” for 127.0.0.1 at 2026-06-30 14:26:18 -0300 Processing by TemplatesController#update as HTML

+ +
Parameters: {"template" => {"nome" => "Nome Atualizado"}, "admin_id" => "283", "id" => "52"}
+Usuario Load (0.5ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 283 LIMIT 1
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 283 LIMIT 1
+Template Load (0.2ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`usuario_id` = 283 AND `templates`.`id` = 52 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Elemento Load (0.4ms)  SELECT `elementos`.* FROM `elementos` WHERE `elementos`.`template_id` = 52
+Campo Load (0.2ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` = 68
+Template Update (0.3ms)  UPDATE `templates` SET `templates`.`nome` = 'Nome Atualizado', `templates`.`updated_at` = '2026-06-30 17:26:18.975264' WHERE `templates`.`id` = 52
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/admin/283/templates Completed 302 Found in 5ms (ActiveRecord: 2.2ms (6 queries, 0 cached) | GC: 0.1ms)

+ +
Template Load (0.2ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`id` = 52 LIMIT 1
+TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:26:18.979293', 'Ciência da Computação', '2026-06-30 17:26:18.979293')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '123' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:19.168169', NULL, NULL, NULL, 230, 'admin@unb.br', NULL, '123', 'Admin', NULL, NULL, '$2a$12$6EwB8PMCuQf1y9XStNAhSOt8r4HL5ISiLSanYVWArY35EFTwJ1KdW', 'Administrador', '2026-06-30 17:26:19.168169')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Template Create (0.3ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:26:19.169622', 'Template Base', '2026-06-30 17:26:19.169622', 284)
+Elemento Create (0.1ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:26:19.170138', 'Questão 1', 1, 53, '2026-06-30 17:26:19.170138')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:26:19 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/284/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.1ms)

+ +
Template Count (0.4ms)  SELECT COUNT(*) FROM `templates`
+ +

Started DELETE “/admin/284/templates/53” for 127.0.0.1 at 2026-06-30 14:26:19 -0300 Processing by TemplatesController#destroy as HTML

+ +
Parameters: {"admin_id" => "284", "id" => "53"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 284 LIMIT 1
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 284 LIMIT 1
+Template Load (0.2ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`usuario_id` = 284 AND `templates`.`id` = 53 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Elemento Load (0.4ms)  SELECT `elementos`.* FROM `elementos` WHERE `elementos`.`template_id` = 53
+Campo Load (0.2ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` = 69
+Elemento Destroy (0.3ms)  DELETE FROM `elementos` WHERE `elementos`.`id` = 69
+Template Destroy (0.2ms)  DELETE FROM `templates` WHERE `templates`.`id` = 53
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/admin/284/templates Completed 303 See Other in 4ms (ActiveRecord: 2.3ms (7 queries, 0 cached) | GC: 0.0ms)

+ +
Template Count (0.2ms)  SELECT COUNT(*) FROM `templates`
+TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_turma' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_turma@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:19.555125', NULL, NULL, NULL, NULL, 'doc_turma@unb.br', 'Doutorado', 'doc_turma', 'Docente Turma', NULL, NULL, '$2a$12$iqNXFAJM4ekBLCwmzrtuWOfZO9.NofCgM71yghJXirjAeriLd2rXC', 'Docente', '2026-06-30 17:26:19.555125')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:26:19.557418', 'Ciência da Computação', '2026-06-30 17:26:19.557418')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 231 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:26:19.558990', 231, 'Engenharia de Software', '2026-06-30 17:26:19.558990')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 117 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:26:19.560227', 117, NULL, 'TA', '2026.1', '2026-06-30 17:26:19.560227')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:26:19 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_turma@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_turma@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/285/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started DELETE “/logout” for 127.0.0.1 at 2026-06-30 14:26:19 -0300 Processing by SessionsController#destroy as HTML Redirected to www.example.com/ Completed 302 Found in 0ms (ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 0.0ms) Started GET “/turmas” for 127.0.0.1 at 2026-06-30 14:26:19 -0300 Processing by TurmasController#index as HTML

+ +
Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+ +

Redirected to www.example.com/ Filter chain halted as :require_login rendered or redirected Completed 302 Found in 1ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_turma' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_turma@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:19.942035', NULL, NULL, NULL, NULL, 'doc_turma@unb.br', 'Doutorado', 'doc_turma', 'Docente Turma', NULL, NULL, '$2a$12$JBIIeZQ9xNhP3k7kcZ4aFuRAkwtQdLpyc5dks.zstgaW.hMYzRy5S', 'Docente', '2026-06-30 17:26:19.942035')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:26:19.944493', 'Ciência da Computação', '2026-06-30 17:26:19.944493')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 232 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.4ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.3ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:26:19.946021', 232, 'Engenharia de Software', '2026-06-30 17:26:19.946021')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Turma Exists? (0.5ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 118 LIMIT 1
+Turma Create (0.3ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:26:19.947406', 118, NULL, 'TA', '2026.1', '2026-06-30 17:26:19.947406')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:26:19 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_turma@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_turma@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/286/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/turmas” for 127.0.0.1 at 2026-06-30 14:26:20 -0300 Processing by TurmasController#index as HTML

+ +
Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 286 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering turmas/index.html.erb within layouts/application
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas`
+Rendered turmas/_turma.html.erb (Duration: 0.1ms | GC: 0.0ms)
+Rendered turmas/index.html.erb within layouts/application (Duration: 1.0ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.3ms | GC: 0.0ms)
+ +

Completed 200 OK in 3ms (Views: 1.4ms | ActiveRecord: 0.5ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_turma' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_turma@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:20.331582', NULL, NULL, NULL, NULL, 'doc_turma@unb.br', 'Doutorado', 'doc_turma', 'Docente Turma', NULL, NULL, '$2a$12$SxZ8gjWgLM6x3QAaOH9ECOG97ev4e6lJF8O3APkhlhmaWT7U7.6ga', 'Docente', '2026-06-30 17:26:20.331582')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:26:20.333975', 'Ciência da Computação', '2026-06-30 17:26:20.333975')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 233 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.4ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.3ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:26:20.335494', 233, 'Engenharia de Software', '2026-06-30 17:26:20.335494')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 119 LIMIT 1
+Turma Create (0.3ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:26:20.336707', 119, NULL, 'TA', '2026.1', '2026-06-30 17:26:20.336707')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:26:20 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_turma@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_turma@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/287/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/turmas/new” for 127.0.0.1 at 2026-06-30 14:26:20 -0300 Processing by TurmasController#new as HTML

+ +
Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 287 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering turmas/new.html.erb within layouts/application
+Rendered turmas/_form.html.erb (Duration: 0.7ms | GC: 0.0ms)
+Rendered turmas/new.html.erb within layouts/application (Duration: 1.1ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.3ms | GC: 0.0ms)
+ +

Completed 200 OK in 3ms (Views: 1.5ms | ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.1ms)

+ +
TRANSACTION (0.6ms)  ROLLBACK
+TRANSACTION (0.2ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_turma' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_turma@unb.br' LIMIT 1
+Docente Create (0.9ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:20.719527', NULL, NULL, NULL, NULL, 'doc_turma@unb.br', 'Doutorado', 'doc_turma', 'Docente Turma', NULL, NULL, '$2a$12$wdcpb/E2l4naPp5b7ZGSwuCO9CLBqBaSceMIWnCqr7F2pczRSpMmq', 'Docente', '2026-06-30 17:26:20.719527')
+TRANSACTION (0.3ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:26:20.722097', 'Ciência da Computação', '2026-06-30 17:26:20.722097')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 234 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:26:20.723614', 234, 'Engenharia de Software', '2026-06-30 17:26:20.723614')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.5ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 120 LIMIT 1
+Turma Create (0.3ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:26:20.724891', 120, NULL, 'TA', '2026.1', '2026-06-30 17:26:20.724891')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:26:20 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_turma@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_turma@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/288/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Turma Count (0.3ms)  SELECT COUNT(*) FROM `turmas`
+ +

Started POST “/turmas” for 127.0.0.1 at 2026-06-30 14:26:20 -0300 Processing by TurmasController#create as HTML

+ +
Parameters: {"turma" => {"numero_da_turma" => "TC", "semestre" => "2026.2", "disciplina_id" => "120"}}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 288 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Load (0.4ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`id` = 120 LIMIT 1
+Turma Exists? (0.3ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TC' AND `turmas`.`semestre` = '2026.2' AND `turmas`.`disciplina_id` = 120 LIMIT 1
+Turma Create (0.3ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:26:20.918416', 120, NULL, 'TC', '2026.2', '2026-06-30 17:26:20.918416')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/turmas/112 Completed 302 Found in 3ms (ActiveRecord: 1.5ms (4 queries, 0 cached) | GC: 0.0ms)

+ +
Turma Count (0.2ms)  SELECT COUNT(*) FROM `turmas`
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` ORDER BY `turmas`.`id` DESC LIMIT 1
+TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_turma' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_turma@unb.br' LIMIT 1
+Docente Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:21.109957', NULL, NULL, NULL, NULL, 'doc_turma@unb.br', 'Doutorado', 'doc_turma', 'Docente Turma', NULL, NULL, '$2a$12$uaSzvmbTVqxR7gF1rCNqj.ioK9krNqz08jmcqDK/glSYyiaTyBDuq', 'Docente', '2026-06-30 17:26:21.109957')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:26:21.112362', 'Ciência da Computação', '2026-06-30 17:26:21.112362')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.3ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 235 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.3ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:26:21.113909', 235, 'Engenharia de Software', '2026-06-30 17:26:21.113909')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 121 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:26:21.115211', 121, NULL, 'TA', '2026.1', '2026-06-30 17:26:21.115211')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:26:21 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_turma@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_turma@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/289/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Turma Count (0.3ms)  SELECT COUNT(*) FROM `turmas`
+ +

Started POST “/turmas” for 127.0.0.1 at 2026-06-30 14:26:21 -0300 Processing by TurmasController#create as HTML

+ +
Parameters: {"turma" => {"numero_da_turma" => "", "semestre" => "", "disciplina_id" => "121"}}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 289 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Load (0.4ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`id` = 121 LIMIT 1
+Turma Exists? (0.3ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = '' AND `turmas`.`semestre` = '' AND `turmas`.`disciplina_id` = 121 LIMIT 1
+TRANSACTION (0.1ms)  ROLLBACK TO SAVEPOINT active_record_1
+Rendering layout layouts/application.html.erb
+Rendering turmas/new.html.erb within layouts/application
+Rendered turmas/_form.html.erb (Duration: 1.1ms | GC: 0.0ms)
+Rendered turmas/new.html.erb within layouts/application (Duration: 1.2ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.5ms | GC: 0.0ms)
+ +

Completed 422 Unprocessable Content in 4ms (Views: 1.6ms | ActiveRecord: 1.2ms (3 queries, 0 cached) | GC: 0.0ms)

+ +
Turma Count (0.2ms)  SELECT COUNT(*) FROM `turmas`
+TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_turma' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_turma@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:21.504775', NULL, NULL, NULL, NULL, 'doc_turma@unb.br', 'Doutorado', 'doc_turma', 'Docente Turma', NULL, NULL, '$2a$12$9HDCrESz.R64ueO7rxCZJe2mIUxC0NfECpCd4JeDaQhRTH5k/v03C', 'Docente', '2026-06-30 17:26:21.504775')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:26:21.507252', 'Ciência da Computação', '2026-06-30 17:26:21.507252')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 236 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:26:21.508748', 236, 'Engenharia de Software', '2026-06-30 17:26:21.508748')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 122 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:26:21.509941', 122, NULL, 'TA', '2026.1', '2026-06-30 17:26:21.509941')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:26:21 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_turma@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_turma@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/290/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/turmas/114” for 127.0.0.1 at 2026-06-30 14:26:21 -0300 Processing by TurmasController#show as HTML

+ +
Parameters: {"id" => "114"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 290 LIMIT 1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`id` = 114 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering turmas/show.html.erb within layouts/application
+Rendered turmas/_turma.html.erb (Duration: 0.0ms | GC: 0.0ms)
+Rendered turmas/show.html.erb within layouts/application (Duration: 0.4ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.6ms | GC: 0.0ms)
+ +

Completed 200 OK in 3ms (Views: 0.8ms | ActiveRecord: 0.7ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_turma' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_turma@unb.br' LIMIT 1
+Docente Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:21.893195', NULL, NULL, NULL, NULL, 'doc_turma@unb.br', 'Doutorado', 'doc_turma', 'Docente Turma', NULL, NULL, '$2a$12$5cUokCOsGfy7o2pZ9YqoFus4aoTHumKvnjMUR21OO4mAbDm.A2KJ6', 'Docente', '2026-06-30 17:26:21.893195')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:26:21.895931', 'Ciência da Computação', '2026-06-30 17:26:21.895931')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 237 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.3ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:26:21.897467', 237, 'Engenharia de Software', '2026-06-30 17:26:21.897467')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 123 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:26:21.898761', 123, NULL, 'TA', '2026.1', '2026-06-30 17:26:21.898761')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:26:21 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_turma@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_turma@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/291/avaliacoes Completed 302 Found in 190ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/turmas/115/edit” for 127.0.0.1 at 2026-06-30 14:26:22 -0300 Processing by TurmasController#edit as HTML

+ +
Parameters: {"id" => "115"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 291 LIMIT 1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`id` = 115 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering turmas/edit.html.erb within layouts/application
+Rendered turmas/_form.html.erb (Duration: 0.5ms | GC: 0.0ms)
+Rendered turmas/edit.html.erb within layouts/application (Duration: 0.8ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.1ms | GC: 0.0ms)
+ +

Completed 200 OK in 5ms (Views: 1.2ms | ActiveRecord: 0.6ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_turma' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_turma@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:22.287840', NULL, NULL, NULL, NULL, 'doc_turma@unb.br', 'Doutorado', 'doc_turma', 'Docente Turma', NULL, NULL, '$2a$12$7toLtE4am02iLaAfE69vNeSe.Cnd2fe438xew1w9TLLdkSmSft1Wi', 'Docente', '2026-06-30 17:26:22.287840')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:26:22.290152', 'Ciência da Computação', '2026-06-30 17:26:22.290152')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 238 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:26:22.291645', 238, 'Engenharia de Software', '2026-06-30 17:26:22.291645')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 124 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:26:22.292823', 124, NULL, 'TA', '2026.1', '2026-06-30 17:26:22.292823')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:26:22 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_turma@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_turma@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/292/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started PATCH “/turmas/116” for 127.0.0.1 at 2026-06-30 14:26:22 -0300 Processing by TurmasController#update as HTML

+ +
Parameters: {"turma" => {"numero_da_turma" => "TA", "semestre" => "2027.1", "disciplina_id" => "124"}, "id" => "116"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 292 LIMIT 1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`id` = 116 LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Turma Exists? (0.6ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`id` != 116 AND `turmas`.`semestre` = '2027.1' AND `turmas`.`disciplina_id` = 124 LIMIT 1
+Turma Update (0.3ms)  UPDATE `turmas` SET `turmas`.`semestre` = '2027.1', `turmas`.`updated_at` = '2026-06-30 17:26:22.485141' WHERE `turmas`.`id` = 116
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/turmas/116 Completed 303 See Other in 4ms (ActiveRecord: 1.9ms (4 queries, 0 cached) | GC: 0.1ms)

+ +
Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`id` = 116 LIMIT 1
+TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_turma' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_turma@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:22.676809', NULL, NULL, NULL, NULL, 'doc_turma@unb.br', 'Doutorado', 'doc_turma', 'Docente Turma', NULL, NULL, '$2a$12$LDEDL4bIxuF8JHxPn1kJgeFar8cyHsDIpSP0f.hSWrhdNtGggyGyu', 'Docente', '2026-06-30 17:26:22.676809')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:26:22.678679', 'Ciência da Computação', '2026-06-30 17:26:22.678679')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 239 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:26:22.680070', 239, 'Engenharia de Software', '2026-06-30 17:26:22.680070')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 125 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:26:22.681200', 125, NULL, 'TA', '2026.1', '2026-06-30 17:26:22.681200')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:26:22 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_turma@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_turma@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/293/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.1ms) Started PATCH “/turmas/117” for 127.0.0.1 at 2026-06-30 14:26:22 -0300 Processing by TurmasController#update as HTML

+ +
Parameters: {"turma" => {"numero_da_turma" => "", "semestre" => "", "disciplina_id" => "125"}, "id" => "117"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 293 LIMIT 1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`id` = 117 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.5ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = '' AND `turmas`.`id` != 117 AND `turmas`.`semestre` = '' AND `turmas`.`disciplina_id` = 125 LIMIT 1
+TRANSACTION (0.1ms)  ROLLBACK TO SAVEPOINT active_record_1
+Rendering layout layouts/application.html.erb
+Rendering turmas/edit.html.erb within layouts/application
+Rendered turmas/_form.html.erb (Duration: 1.1ms | GC: 0.0ms)
+Rendered turmas/edit.html.erb within layouts/application (Duration: 1.1ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.4ms | GC: 0.0ms)
+ +

Completed 422 Unprocessable Content in 4ms (Views: 1.5ms | ActiveRecord: 1.3ms (3 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_turma' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_turma@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:23.067056', NULL, NULL, NULL, NULL, 'doc_turma@unb.br', 'Doutorado', 'doc_turma', 'Docente Turma', NULL, NULL, '$2a$12$bNUPapg9oRVUccFg1VjF8OA.xG5KjTYf1UO7f9q6cTvtnmGxXV1uS', 'Docente', '2026-06-30 17:26:23.067056')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:26:23.069527', 'Ciência da Computação', '2026-06-30 17:26:23.069527')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 240 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:26:23.071072', 240, 'Engenharia de Software', '2026-06-30 17:26:23.071072')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 126 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:26:23.072258', 126, NULL, 'TA', '2026.1', '2026-06-30 17:26:23.072258')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:26:23 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_turma@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_turma@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/294/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Turma Exists? (0.6ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TZ' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 126 LIMIT 1
+Turma Create (0.3ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:26:23.263864', 126, NULL, 'TZ', '2026.1', '2026-06-30 17:26:23.263864')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Count (0.2ms)  SELECT COUNT(*) FROM `turmas`
+ +

Started DELETE “/turmas/119” for 127.0.0.1 at 2026-06-30 14:26:23 -0300 Processing by TurmasController#destroy as HTML

+ +
Parameters: {"id" => "119"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 294 LIMIT 1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`id` = 119 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Load (0.4ms)  SELECT `formularios`.* FROM `formularios` WHERE `formularios`.`turma_id` = 119
+Turma::HABTM_Docentes Delete All (0.2ms)  DELETE FROM `docentes_turmas` WHERE `docentes_turmas`.`turma_id` = 119
+Turma::HABTM_Discentes Delete All (0.2ms)  DELETE FROM `discentes_turmas` WHERE `discentes_turmas`.`turma_id` = 119
+Turma Destroy (0.3ms)  DELETE FROM `turmas` WHERE `turmas`.`id` = 119
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/turmas Completed 303 See Other in 3ms (ActiveRecord: 1.7ms (6 queries, 0 cached) | GC: 0.0ms)

+ +
Turma Count (0.2ms)  SELECT COUNT(*) FROM `turmas`
+TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:26:23.272117', 'Ciência da Computação', '2026-06-30 17:26:23.272117')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.8ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:23.461601', NULL, NULL, NULL, 241, 'admin@unb.br', NULL, 'adm001', 'Admin Teste', NULL, NULL, '$2a$12$mjIrfHuq2nxrZLNizk8VoeJan/IxOtkeilt/2Dn9WHkX8//5JjmWq', 'Administrador', '2026-06-30 17:26:23.461601')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.5ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:23.651929', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Prof Teste', NULL, NULL, '$2a$12$T7Rc.V14Y4WZVtJFnLbr5.qZchro5VjU66J.EBv5MpamFosZBoHdG', 'Docente', '2026-06-30 17:26:23.651929')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/usuarios” for 127.0.0.1 at 2026-06-30 14:26:23 -0300 Processing by UsuariosController#index as HTML

+ +
Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+ +

Redirected to www.example.com/ Filter chain halted as :require_login rendered or redirected Completed 302 Found in 1ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/” for 127.0.0.1 at 2026-06-30 14:26:23 -0300 Processing by SessionsController#new as HTML

+ +
Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering sessions/new.html.erb within layouts/application
+Rendered sessions/new.html.erb within layouts/application (Duration: 0.2ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.5ms | ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:26:23.659898', 'Ciência da Computação', '2026-06-30 17:26:23.659898')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:23.849288', NULL, NULL, NULL, 242, 'admin@unb.br', NULL, 'adm001', 'Admin Teste', NULL, NULL, '$2a$12$C48ZWLXsYkeFKMqafhlTWOx9LjTnt1bo9LDqIkOT8JUqW/KhaN2B6', 'Administrador', '2026-06-30 17:26:23.849288')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.5ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Docente Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:24.039124', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Prof Teste', NULL, NULL, '$2a$12$/zRBrqMtzY3ts.FBMWFsSuQueFaGL5OvcmK.vKSEc7G8YJrubw2b6', 'Docente', '2026-06-30 17:26:24.039124')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:26:24 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "prof@unb.br", "senha" => "Senha123"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/298/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/usuarios” for 127.0.0.1 at 2026-06-30 14:26:24 -0300 Processing by UsuariosController#index as HTML

+ +
Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 298 LIMIT 1
+ +

Redirected to www.example.com/inicio Filter chain halted as :require_admin rendered or redirected Completed 302 Found in 1ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/inicio” for 127.0.0.1 at 2026-06-30 14:26:24 -0300 Processing by HomeController#index as HTML

+ +
Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 298 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering home/index.html.erb within layouts/application
+Rendered home/index.html.erb within layouts/application (Duration: 0.0ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.3ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.4ms | ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:26:24.235295', 'Ciência da Computação', '2026-06-30 17:26:24.235295')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:24.424197', NULL, NULL, NULL, 243, 'admin@unb.br', NULL, 'adm001', 'Admin Teste', NULL, NULL, '$2a$12$/dTiRsL.Lv9tq41fe96/W.pXc849TOJc/wMgHfJyQ/XkL3OAP2t92', 'Administrador', '2026-06-30 17:26:24.424197')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:24.613464', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Prof Teste', NULL, NULL, '$2a$12$rYerqA3fRC7JQtvEg2/ifOhVSdsPMX25h8aSOUJlz/qyzNOG7OtAC', 'Docente', '2026-06-30 17:26:24.613464')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:26:24 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin@unb.br", "senha" => "Senha123"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/299/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/usuarios” for 127.0.0.1 at 2026-06-30 14:26:24 -0300 Processing by UsuariosController#index as HTML

+ +
Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 299 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering usuarios/index.html.erb within layouts/application
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios`
+Rendered usuarios/_usuario.html.erb (Duration: 0.2ms | GC: 0.0ms)
+Rendered usuarios/_usuario.html.erb (Duration: 0.0ms | GC: 0.0ms)
+Rendered usuarios/index.html.erb within layouts/application (Duration: 1.2ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.5ms | GC: 0.0ms)
+ +

Completed 200 OK in 3ms (Views: 1.6ms | ActiveRecord: 0.6ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:26:24.810060', 'Ciência da Computação', '2026-06-30 17:26:24.810060')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:24.999275', NULL, NULL, NULL, 244, 'admin@unb.br', NULL, 'adm001', 'Admin Teste', NULL, NULL, '$2a$12$xX5NfexR1hln42/7304nHOe0dQYyzB.5kgV2ilHwpR3wW1E1ndcv2', 'Administrador', '2026-06-30 17:26:24.999275')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Docente Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:25.188929', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Prof Teste', NULL, NULL, '$2a$12$dthotgh9ozqXo0.SLHPw/eqX2R2WDRCbD7e6ph5BAXmv5/eBSSE9W', 'Docente', '2026-06-30 17:26:25.188929')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/usuarios/302” for 127.0.0.1 at 2026-06-30 14:26:25 -0300 Processing by UsuariosController#show as HTML

+ +
Parameters: {"id" => "302"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+ +

Redirected to www.example.com/ Filter chain halted as :require_login rendered or redirected Completed 302 Found in 1ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (1.3ms)  ROLLBACK
+TRANSACTION (0.2ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:26:25.194712', 'Ciência da Computação', '2026-06-30 17:26:25.194712')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:25.384786', NULL, NULL, NULL, 245, 'admin@unb.br', NULL, 'adm001', 'Admin Teste', NULL, NULL, '$2a$12$/DEhMRWIgLLJtyJg0VnKMe4ErJBECokeXnyw/G7ExN8iOo9wQPNRy', 'Administrador', '2026-06-30 17:26:25.384786')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:25.574475', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Prof Teste', NULL, NULL, '$2a$12$TIW1m21/ZiMz6EQ2E2yHae3CJu.u26T1T7H.wqqocXx0sfdQI/eBK', 'Docente', '2026-06-30 17:26:25.574475')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:26:25 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "prof@unb.br", "senha" => "Senha123"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/304/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/usuarios/304” for 127.0.0.1 at 2026-06-30 14:26:25 -0300 Processing by UsuariosController#show as HTML

+ +
Parameters: {"id" => "304"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 304 LIMIT 1
+ +

Redirected to www.example.com/inicio Filter chain halted as :require_admin rendered or redirected Completed 302 Found in 1ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:26:25.769200', 'Ciência da Computação', '2026-06-30 17:26:25.769200')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:25.958190', NULL, NULL, NULL, 246, 'admin@unb.br', NULL, 'adm001', 'Admin Teste', NULL, NULL, '$2a$12$KEchYwULT7kH80N1X772Su6fKf3Gcm6p5hqvDr/.v0XTxdmsoPkOC', 'Administrador', '2026-06-30 17:26:25.958190')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Docente Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:26.147626', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Prof Teste', NULL, NULL, '$2a$12$proYNXgkZlDwpvGkFk1Yn.uVxHXShndFF5T7L9ELFpwEguix46A.G', 'Docente', '2026-06-30 17:26:26.147626')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:26:26 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/305/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/usuarios/306” for 127.0.0.1 at 2026-06-30 14:26:26 -0300 Processing by UsuariosController#show as HTML

+ +
Parameters: {"id" => "306"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 305 LIMIT 1
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 306 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering usuarios/show.html.erb within layouts/application
+Rendered docentes/_docente.html.erb (Duration: 0.0ms | GC: 0.0ms)
+Rendered usuarios/show.html.erb within layouts/application (Duration: 0.4ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.6ms | GC: 0.0ms)
+ +

Completed 200 OK in 2ms (Views: 0.7ms | ActiveRecord: 0.5ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:26:26.343428', 'Ciência da Computação', '2026-06-30 17:26:26.343428')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:26.532087', NULL, NULL, NULL, 247, 'admin@unb.br', NULL, 'adm001', 'Admin Teste', NULL, NULL, '$2a$12$.UlRS.0SiVOs61g9N28xp...MfrJDVKoz7nqAMqqomxEQB6mZZ2Ce', 'Administrador', '2026-06-30 17:26:26.532087')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Docente Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:26.721275', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Prof Teste', NULL, NULL, '$2a$12$m/3Zct2rf1vGeQ7JEk9BDeIK931NjHY4Lne17CCivQKDb.HD8zaKG', 'Docente', '2026-06-30 17:26:26.721275')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started DELETE “/usuarios/308” for 127.0.0.1 at 2026-06-30 14:26:26 -0300 Processing by UsuariosController#destroy as HTML

+ +
Parameters: {"id" => "308"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+ +

Redirected to www.example.com/ Filter chain halted as :require_login rendered or redirected Completed 302 Found in 1ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:26:26.725710', 'Ciência da Computação', '2026-06-30 17:26:26.725710')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:26.914787', NULL, NULL, NULL, 248, 'admin@unb.br', NULL, 'adm001', 'Admin Teste', NULL, NULL, '$2a$12$LpqaXwQIoW3lQ7Q5g2crX.bdvmrQxwI9W0Hkkj0UotRvQVAEGiBh6', 'Administrador', '2026-06-30 17:26:26.914787')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:27.106540', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Prof Teste', NULL, NULL, '$2a$12$XAhjteAuIPj3pblGe/PDpuO2HtC1YbV2BxFix7NXGkqsYznvM.45u', 'Docente', '2026-06-30 17:26:27.106540')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:26:27 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "prof@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/310/avaliacoes Completed 302 Found in 190ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started DELETE “/usuarios/310” for 127.0.0.1 at 2026-06-30 14:26:27 -0300 Processing by UsuariosController#destroy as HTML

+ +
Parameters: {"id" => "310"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 310 LIMIT 1
+ +

Redirected to www.example.com/inicio Filter chain halted as :require_admin rendered or redirected Completed 302 Found in 1ms (ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:26:27.302503', 'Ciência da Computação', '2026-06-30 17:26:27.302503')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:27.491357', NULL, NULL, NULL, 249, 'admin@unb.br', NULL, 'adm001', 'Admin Teste', NULL, NULL, '$2a$12$hbF/x1AgvVlNhHpjehhec.wAtN79k28D5XEqF3zEhpgXX2HsHR9ta', 'Administrador', '2026-06-30 17:26:27.491357')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:27.680958', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Prof Teste', NULL, NULL, '$2a$12$hJAkPy6tr1WFTek/8sO3o.GSS/be7pL.XD9NJSy7qERQInltwxfpW', 'Docente', '2026-06-30 17:26:27.680958')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:26:27 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin@unb.br", "senha" => "Senha123"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/311/avaliacoes Completed 302 Found in 190ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started DELETE “/usuarios/312” for 127.0.0.1 at 2026-06-30 14:26:27 -0300 Processing by UsuariosController#destroy as HTML

+ +
Parameters: {"id" => "312"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 311 LIMIT 1
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 312 LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Docente::HABTM_Turmas Delete All (0.4ms)  DELETE FROM `docentes_turmas` WHERE `docentes_turmas`.`docente_id` = 312
+Docente Destroy (0.4ms)  DELETE FROM `usuarios` WHERE `usuarios`.`id` = 312
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/usuarios Completed 303 See Other in 3ms (ActiveRecord: 1.8ms (4 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.9ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:26:27.879090', 'Ciência da Computação', '2026-06-30 17:26:27.879090')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:28.069161', NULL, NULL, NULL, 250, 'admin@unb.br', NULL, 'adm001', 'Admin Teste', NULL, NULL, '$2a$12$Dp7UO1neYOw3jvckwbg4k.mNzBFurSupqUHhITwK5jdPRF8HnmRzG', 'Administrador', '2026-06-30 17:26:28.069161')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.5ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Docente Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:28.259689', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Prof Teste', NULL, NULL, '$2a$12$e8GEFBJvoqj.dg/6weH9euyZOGuGGtAj6sfA7KgxvG/R8yfzym0.2', 'Docente', '2026-06-30 17:26:28.259689')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:26:28 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin@unb.br", "senha" => "Senha123"}
+Usuario Load (0.5ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/313/avaliacoes Completed 302 Found in 193ms (ActiveRecord: 0.5ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/usuarios/new” for 127.0.0.1 at 2026-06-30 14:26:28 -0300 Processing by UsuariosController#new as HTML

+ +
Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 313 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering usuarios/new.html.erb within layouts/application
+Rendered usuarios/_form.html.erb (Duration: 1.2ms | GC: 0.0ms)
+Rendered usuarios/new.html.erb within layouts/application (Duration: 1.7ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 2.0ms | GC: 0.0ms)
+ +

Completed 200 OK in 4ms (Views: 2.2ms | ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.4ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:26:28.462457', 'Ciência da Computação', '2026-06-30 17:26:28.462457')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm001' LIMIT 1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:28.651953', NULL, NULL, NULL, 251, 'admin@unb.br', NULL, 'adm001', 'Admin Teste', NULL, NULL, '$2a$12$0rlTDSjBwEiILBvO9/58duef/RvmFwzvEiJcLHBCWppa4vZcH7Cwe', 'Administrador', '2026-06-30 17:26:28.651953')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.5ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:28.842549', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Prof Teste', NULL, NULL, '$2a$12$60oSnJjxxWx71xQf.UObSOyoARb3vZ65SAnR9k.emcoMOSh0d6EH2', 'Docente', '2026-06-30 17:26:28.842549')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:26:28 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/315/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/usuarios/316/edit” for 127.0.0.1 at 2026-06-30 14:26:29 -0300 Processing by UsuariosController#edit as HTML

+ +
Parameters: {"id" => "316"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 315 LIMIT 1
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 316 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering usuarios/edit.html.erb within layouts/application
+Rendered usuarios/_form.html.erb (Duration: 0.6ms | GC: 0.0ms)
+Rendered usuarios/edit.html.erb within layouts/application (Duration: 0.9ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.1ms | GC: 0.0ms)
+ +

Completed 200 OK in 3ms (Views: 1.3ms | ActiveRecord: 0.7ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:26:29.039785', 'Ciência da Computação', '2026-06-30 17:26:29.039785')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:29.229788', NULL, NULL, NULL, 252, 'admin@unb.br', NULL, 'adm001', 'Admin Teste', NULL, NULL, '$2a$12$x.AiFASHZAZk5t.3.hoXP.2dcmTsPWYdCLx5o.8ODPjC/gfWTRN12', 'Administrador', '2026-06-30 17:26:29.229788')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.5ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Docente Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:29.419553', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Prof Teste', NULL, NULL, '$2a$12$PygxnerwmKcut1Gd9/.8N.IK8J.xCXzVbRvj4SVD27AWFO9pSd9zW', 'Docente', '2026-06-30 17:26:29.419553')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:26:29 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin@unb.br", "senha" => "Senha123"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/317/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Usuario Count (0.4ms)  SELECT COUNT(*) FROM `usuarios`
+ +

Started POST “/usuarios” for 127.0.0.1 at 2026-06-30 14:26:29 -0300 Processing by UsuariosController#create as HTML

+ +
Parameters: {"usuario" => {"matricula" => "novo123", "email" => "[FILTERED]", "nome" => "Novo Teste", "type" => "Docente", "senha" => "Senha123", "senha_confirmation" => "Senha123", "formacao" => "Mestrado"}}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 317 LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.5ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'novo123' LIMIT 1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'novo@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:29.613440', NULL, NULL, NULL, NULL, 'novo@unb.br', 'Mestrado', 'novo123', 'Novo Teste', NULL, NULL, NULL, 'Docente', '2026-06-30 17:26:29.613440')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/docentes/319 Completed 302 Found in 3ms (ActiveRecord: 1.9ms (4 queries, 0 cached) | GC: 0.0ms)

+ +
Usuario Count (0.2ms)  SELECT COUNT(*) FROM `usuarios`
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` ORDER BY `usuarios`.`id` DESC LIMIT 1
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` ORDER BY `usuarios`.`id` DESC LIMIT 1
+TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.2ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:26:29.618623', 'Ciência da Computação', '2026-06-30 17:26:29.618623')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:29.807944', NULL, NULL, NULL, 253, 'admin@unb.br', NULL, 'adm001', 'Admin Teste', NULL, NULL, '$2a$12$w4ZwA9HSjiUhfEUyhmJQeu5GAZeNDTdktfoMz8Lnl5OBenNr.Xe7K', 'Administrador', '2026-06-30 17:26:29.807944')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:29.997455', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Prof Teste', NULL, NULL, '$2a$12$b9ZaOW6Hq3Jr6Lu46Fq7BOn1HuJpQVDIs0pw/mL20XYU2jL2GpMCW', 'Docente', '2026-06-30 17:26:29.997455')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:26:29 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/320/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Usuario Count (0.3ms)  SELECT COUNT(*) FROM `usuarios`
+ +

Started POST “/usuarios” for 127.0.0.1 at 2026-06-30 14:26:30 -0300 Processing by UsuariosController#create as HTML

+ +
Parameters: {"usuario" => {"email" => "[FILTERED]"}}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 320 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` IS NULL LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = '' LIMIT 1
+TRANSACTION (0.1ms)  ROLLBACK TO SAVEPOINT active_record_1
+Rendering layout layouts/application.html.erb
+Rendering usuarios/new.html.erb within layouts/application
+Rendered usuarios/_form.html.erb (Duration: 1.4ms | GC: 0.0ms)
+Rendered usuarios/new.html.erb within layouts/application (Duration: 1.4ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.7ms | GC: 0.0ms)
+ +

Completed 422 Unprocessable Content in 4ms (Views: 1.8ms | ActiveRecord: 1.2ms (3 queries, 0 cached) | GC: 0.0ms)

+ +
Usuario Count (0.2ms)  SELECT COUNT(*) FROM `usuarios`
+TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:26:30.196006', 'Ciência da Computação', '2026-06-30 17:26:30.196006')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (3.5ms)  SAVEPOINT active_record_1
+Usuario Exists? (3.7ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm001' LIMIT 1
+Usuario Exists? (0.1ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:30.390928', NULL, NULL, NULL, 254, 'admin@unb.br', NULL, 'adm001', 'Admin Teste', NULL, NULL, '$2a$12$lCZx9KwLU1fCU1scpH0RIu999Z0E46kYjv2gnVZsQfVX4MD.edFk2', 'Administrador', '2026-06-30 17:26:30.390928')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.5ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:30.581091', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Prof Teste', NULL, NULL, '$2a$12$P62rvfr4ChBM60i7eKD9f.Z9J1AUNrYzhUHv444Tun5mwq87pSB56', 'Docente', '2026-06-30 17:26:30.581091')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:26:30 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/322/avaliacoes Completed 302 Found in 195ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started PATCH “/usuarios/323” for 127.0.0.1 at 2026-06-30 14:26:30 -0300 Processing by UsuariosController#update as HTML

+ +
Parameters: {"usuario" => {"nome" => "Nome Atualizado"}, "id" => "323"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 322 LIMIT 1
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 323 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.5ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' AND `usuarios`.`id` != 323 LIMIT 1
+Docente Update (0.4ms)  UPDATE `usuarios` SET `usuarios`.`nome` = 'Nome Atualizado', `usuarios`.`updated_at` = '2026-06-30 17:26:30.781726' WHERE `usuarios`.`id` = 323
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/docentes/323 Completed 303 See Other in 4ms (ActiveRecord: 1.8ms (4 queries, 0 cached) | GC: 0.3ms)

+ +
Docente Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Docente' AND `usuarios`.`id` = 323 LIMIT 1
+TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:26:30.785742', 'Ciência da Computação', '2026-06-30 17:26:30.785742')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:30.974737', NULL, NULL, NULL, 255, 'admin@unb.br', NULL, 'adm001', 'Admin Teste', NULL, NULL, '$2a$12$buZ.6lxDl1CJdzy4.9z15uHip4vpQKqKjEEtmcmIBa8Gdc1x/uO0G', 'Administrador', '2026-06-30 17:26:30.974737')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Docente Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:31.164538', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Prof Teste', NULL, NULL, '$2a$12$.Rll/ZYUfcqQqXj16UPodeCvFQeFU.1HIDoC0YzBhg563VgxsSXyu', 'Docente', '2026-06-30 17:26:31.164538')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:26:31 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/324/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started PATCH “/usuarios/325” for 127.0.0.1 at 2026-06-30 14:26:31 -0300 Processing by UsuariosController#update as HTML

+ +
Parameters: {"usuario" => {"email" => "[FILTERED]"}, "id" => "325"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 324 LIMIT 1
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 325 LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.5ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = '' AND `usuarios`.`id` != 325 LIMIT 1
+TRANSACTION (0.1ms)  ROLLBACK TO SAVEPOINT active_record_1
+Rendering layout layouts/application.html.erb
+Rendering usuarios/edit.html.erb within layouts/application
+Rendered usuarios/_form.html.erb (Duration: 1.3ms | GC: 0.3ms)
+Rendered usuarios/edit.html.erb within layouts/application (Duration: 1.4ms | GC: 0.3ms)
+Rendered layout layouts/application.html.erb (Duration: 1.6ms | GC: 0.3ms)
+ +

Completed 422 Unprocessable Content in 5ms (Views: 1.8ms | ActiveRecord: 1.5ms (3 queries, 0 cached) | GC: 0.3ms)

+ +
TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:26:31.363810', 'Ciência da Computação', '2026-06-30 17:26:31.363810')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:31.553244', NULL, NULL, NULL, 256, 'admin@unb.br', NULL, 'adm001', 'Admin Teste', NULL, NULL, '$2a$12$yPWypH3hVeSHMvDerYcy.ebK./EpE/8jWbCoUFxI/DQVtijgYVRq2', 'Administrador', '2026-06-30 17:26:31.553244')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.5ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Docente Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:31.743485', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Prof Teste', NULL, NULL, '$2a$12$wxmxKVq7QSqLv4TI8HB6GO8ky.iGiVYXX60JVJSR4uEHGBsOCcdb2', 'Docente', '2026-06-30 17:26:31.743485')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.3ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Software' AND `disciplinas`.`codigo` = 'SW1' AND `disciplinas`.`departamento_id` = 256 LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.5ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'SW1' LIMIT 1
+Disciplina Create (0.4ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('SW1', '2026-06-30 17:26:31.745972', 256, 'Software', '2026-06-30 17:26:31.745972')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 127 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 127 LIMIT 1
+Turma Create (0.1ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:26:31.747838', 127, NULL, 'TA', '2026.1', '2026-06-30 17:26:31.747838')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.2ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:26:31.748391', NULL, NULL, NULL, NULL, 120, '2026-06-30 17:26:31.748391')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.2ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:26:31.749102', 'Avalie o professor', 83, 1, 'Texto', '2026-06-30 17:26:31.749102')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.2ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:26:31.749763', 65, 'Resposta', 1, NULL, '2026-06-30 17:26:31.749763')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma::HABTM_Docentes Create (0.3ms)  INSERT INTO `docentes_turmas` (`docente_id`, `turma_id`) VALUES (327, 120)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Curso Load (0.2ms)  SELECT `cursos`.* FROM `cursos` WHERE `cursos`.`nome` = 'Ciência da Computação' AND `cursos`.`codigo` = 'CIC' AND `cursos`.`departamento_id` = 256 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Curso Exists? (0.3ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`codigo` = 'CIC' LIMIT 1
+Curso Create (0.2ms)  INSERT INTO `cursos` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:26:31.752965', 256, 'Ciência da Computação', '2026-06-30 17:26:31.752965')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'disc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'aluno@unb.br' LIMIT 1
+Discente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:31.941467', 30, NULL, NULL, NULL, 'aluno@unb.br', NULL, 'disc001', 'Aluno Teste', NULL, NULL, '$2a$12$VRuXkO7NA65Cycym35QbH.EKv3Pke/G2IZf/4rVH1NAr4f5.xrMVy', 'Discente', '2026-06-30 17:26:31.941467')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Turma::HABTM_Discentes Create (0.4ms)  INSERT INTO `discentes_turmas` (`discente_id`, `turma_id`) VALUES (328, 120)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:26:31 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "prof@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/327/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/usuarios/327/avaliacoes” for 127.0.0.1 at 2026-06-30 14:26:32 -0300 Processing by UsuariosController#avaliacoes as HTML

+ +
Parameters: {"usuario_id" => "327"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 327 LIMIT 1
+CACHE Usuario Load (0.0ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 327 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering usuarios/avaliacoes.html.erb within layouts/application
+Formulario Load (0.5ms)  SELECT `formularios`.* FROM `formularios` INNER JOIN `turmas` ON `turmas`.`id` = `formularios`.`turma_id` WHERE `formularios`.`turma_id` IN (SELECT `turmas`.`id` FROM `turmas` INNER JOIN `docentes_turmas` ON `turmas`.`id` = `docentes_turmas`.`turma_id` WHERE `docentes_turmas`.`docente_id` = 327)
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`id` = 120
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`id` = 127
+HABTM_Docentes Eager Load (0.3ms)  SELECT `docentes_turmas`.`docente_id` AS t0_r0, `docentes_turmas`.`turma_id` AS t0_r1, `usuarios`.`id` AS t1_r0, `usuarios`.`created_at` AS t1_r1, `usuarios`.`curso_id` AS t1_r2, `usuarios`.`definicao_senha_sent_at` AS t1_r3, `usuarios`.`definicao_senha_token` AS t1_r4, `usuarios`.`departamento_id` AS t1_r5, `usuarios`.`email` AS t1_r6, `usuarios`.`formacao` AS t1_r7, `usuarios`.`matricula` AS t1_r8, `usuarios`.`nome` AS t1_r9, `usuarios`.`redefinicao_senha_sent_at` AS t1_r10, `usuarios`.`redefinicao_senha_token` AS t1_r11, `usuarios`.`senha_hash` AS t1_r12, `usuarios`.`type` AS t1_r13, `usuarios`.`updated_at` AS t1_r14 FROM `docentes_turmas` LEFT OUTER JOIN `usuarios` ON `usuarios`.`id` = `docentes_turmas`.`docente_id` AND `usuarios`.`type` = 'Docente' WHERE `usuarios`.`type` = 'Docente' AND `docentes_turmas`.`turma_id` = 120
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`id` = 256
+Rendered usuarios/avaliacoes.html.erb within layouts/application (Duration: 4.3ms | GC: 0.2ms)
+Rendered layout layouts/application.html.erb (Duration: 4.8ms | GC: 0.5ms)
+ +

Completed 200 OK in 7ms (Views: 3.6ms | ActiveRecord: 1.7ms (7 queries, 1 cached) | GC: 0.5ms)

+ +
TRANSACTION (0.6ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:26:32.143138', 'Ciência da Computação', '2026-06-30 17:26:32.143138')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:32.332214', NULL, NULL, NULL, 257, 'admin@unb.br', NULL, 'adm001', 'Admin Teste', NULL, NULL, '$2a$12$vIR7KhJOeH5jzKJo5zrpru1fmxc/k9B1Oa72K88FJEKWlt./7X8GS', 'Administrador', '2026-06-30 17:26:32.332214')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:32.521656', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Prof Teste', NULL, NULL, '$2a$12$LNpW7x.H0lyFUOlZXaDzqOAKwEmZr3IbgUhub1T59/8mfV.GjT7Xm', 'Docente', '2026-06-30 17:26:32.521656')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.3ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Software' AND `disciplinas`.`codigo` = 'SW1' AND `disciplinas`.`departamento_id` = 257 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.4ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'SW1' LIMIT 1
+Disciplina Create (0.3ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('SW1', '2026-06-30 17:26:32.523649', 257, 'Software', '2026-06-30 17:26:32.523649')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 128 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 128 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:26:32.525598', 128, NULL, 'TA', '2026.1', '2026-06-30 17:26:32.525598')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:26:32.526232', NULL, NULL, NULL, NULL, 121, '2026-06-30 17:26:32.526232')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:26:32.527152', 'Avalie o professor', 84, 1, 'Texto', '2026-06-30 17:26:32.527152')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.4ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:26:32.528018', 66, 'Resposta', 1, NULL, '2026-06-30 17:26:32.528018')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma::HABTM_Docentes Create (0.3ms)  INSERT INTO `docentes_turmas` (`docente_id`, `turma_id`) VALUES (330, 121)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Curso Load (0.2ms)  SELECT `cursos`.* FROM `cursos` WHERE `cursos`.`nome` = 'Ciência da Computação' AND `cursos`.`codigo` = 'CIC' AND `cursos`.`departamento_id` = 257 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Curso Exists? (0.3ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`codigo` = 'CIC' LIMIT 1
+Curso Create (0.2ms)  INSERT INTO `cursos` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:26:32.530563', 257, 'Ciência da Computação', '2026-06-30 17:26:32.530563')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'disc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'aluno@unb.br' LIMIT 1
+Discente Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:32.719357', 31, NULL, NULL, NULL, 'aluno@unb.br', NULL, 'disc001', 'Aluno Teste', NULL, NULL, '$2a$12$BupI/uoKUExiw0xEqG5EMOMDHvW6k4Nzls2QqVmVnTfTqL/Kh2bEa', 'Discente', '2026-06-30 17:26:32.719357')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma::HABTM_Discentes Create (0.4ms)  INSERT INTO `discentes_turmas` (`discente_id`, `turma_id`) VALUES (331, 121)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:26:32 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "aluno@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'aluno@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/331/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/usuarios/331/avaliacoes” for 127.0.0.1 at 2026-06-30 14:26:32 -0300 Processing by UsuariosController#avaliacoes as HTML

+ +
Parameters: {"usuario_id" => "331"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 331 LIMIT 1
+CACHE Usuario Load (0.0ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 331 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering usuarios/avaliacoes.html.erb within layouts/application
+Formulario Load (0.5ms)  SELECT `formularios`.* FROM `formularios` INNER JOIN `turmas` ON `turmas`.`id` = `formularios`.`turma_id` WHERE `formularios`.`turma_id` IN (SELECT `turmas`.`id` FROM `turmas` INNER JOIN `discentes_turmas` ON `turmas`.`id` = `discentes_turmas`.`turma_id` WHERE `discentes_turmas`.`discente_id` = 331)
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`id` = 121
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`id` = 128
+HABTM_Docentes Eager Load (0.3ms)  SELECT `docentes_turmas`.`docente_id` AS t0_r0, `docentes_turmas`.`turma_id` AS t0_r1, `usuarios`.`id` AS t1_r0, `usuarios`.`created_at` AS t1_r1, `usuarios`.`curso_id` AS t1_r2, `usuarios`.`definicao_senha_sent_at` AS t1_r3, `usuarios`.`definicao_senha_token` AS t1_r4, `usuarios`.`departamento_id` AS t1_r5, `usuarios`.`email` AS t1_r6, `usuarios`.`formacao` AS t1_r7, `usuarios`.`matricula` AS t1_r8, `usuarios`.`nome` AS t1_r9, `usuarios`.`redefinicao_senha_sent_at` AS t1_r10, `usuarios`.`redefinicao_senha_token` AS t1_r11, `usuarios`.`senha_hash` AS t1_r12, `usuarios`.`type` AS t1_r13, `usuarios`.`updated_at` AS t1_r14 FROM `docentes_turmas` LEFT OUTER JOIN `usuarios` ON `usuarios`.`id` = `docentes_turmas`.`docente_id` AND `usuarios`.`type` = 'Docente' WHERE `usuarios`.`type` = 'Docente' AND `docentes_turmas`.`turma_id` = 121
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`id` = 257
+Rendered usuarios/avaliacoes.html.erb within layouts/application (Duration: 4.0ms | GC: 0.2ms)
+Rendered layout layouts/application.html.erb (Duration: 4.2ms | GC: 0.2ms)
+ +

Completed 200 OK in 6ms (Views: 3.0ms | ActiveRecord: 1.8ms (7 queries, 1 cached) | GC: 0.2ms)

+ +
TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:26:32.920863', 'Ciência da Computação', '2026-06-30 17:26:32.920863')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:33.110572', NULL, NULL, NULL, 258, 'admin@unb.br', NULL, 'adm001', 'Admin Teste', NULL, NULL, '$2a$12$1BBMyZHgyta8BzYcznuWxO7vH91lPsgVyVMFCEm.TL3w8M2/lj/Ty', 'Administrador', '2026-06-30 17:26:33.110572')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.5ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:33.300746', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Prof Teste', NULL, NULL, '$2a$12$.osHXxCmZJ438cQH6trAvupFf50i217DslVP.oaU9FgytVh3LCHES', 'Docente', '2026-06-30 17:26:33.300746')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.3ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Software' AND `disciplinas`.`codigo` = 'SW1' AND `disciplinas`.`departamento_id` = 258 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'SW1' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('SW1', '2026-06-30 17:26:33.303440', 258, 'Software', '2026-06-30 17:26:33.303440')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 129 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 129 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:26:33.304982', 129, NULL, 'TA', '2026.1', '2026-06-30 17:26:33.304982')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:26:33.305640', NULL, NULL, NULL, NULL, 122, '2026-06-30 17:26:33.305640')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:26:33.306568', 'Avalie o professor', 85, 1, 'Texto', '2026-06-30 17:26:33.306568')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.4ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:26:33.307497', 67, 'Resposta', 1, NULL, '2026-06-30 17:26:33.307497')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma::HABTM_Docentes Create (0.3ms)  INSERT INTO `docentes_turmas` (`docente_id`, `turma_id`) VALUES (333, 122)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Curso Load (0.2ms)  SELECT `cursos`.* FROM `cursos` WHERE `cursos`.`nome` = 'Ciência da Computação' AND `cursos`.`codigo` = 'CIC' AND `cursos`.`departamento_id` = 258 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Curso Exists? (0.3ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`codigo` = 'CIC' LIMIT 1
+Curso Create (0.3ms)  INSERT INTO `cursos` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:26:33.310084', 258, 'Ciência da Computação', '2026-06-30 17:26:33.310084')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'disc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'aluno@unb.br' LIMIT 1
+Discente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:33.499397', 32, NULL, NULL, NULL, 'aluno@unb.br', NULL, 'disc001', 'Aluno Teste', NULL, NULL, '$2a$12$xqIVN0OxEKSTq1NAihIny.D.K1hyBt6CQ/vDu5oE7XoE7o4keUpRC', 'Discente', '2026-06-30 17:26:33.499397')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Turma::HABTM_Discentes Create (0.4ms)  INSERT INTO `discentes_turmas` (`discente_id`, `turma_id`) VALUES (334, 122)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:26:33 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/332/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/usuarios/332/avaliacoes” for 127.0.0.1 at 2026-06-30 14:26:33 -0300 Processing by UsuariosController#avaliacoes as HTML

+ +
Parameters: {"usuario_id" => "332"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 332 LIMIT 1
+CACHE Usuario Load (0.0ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 332 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering usuarios/avaliacoes.html.erb within layouts/application
+Formulario Load (0.3ms)  SELECT `formularios`.* FROM `formularios` INNER JOIN `turmas` ON `turmas`.`id` = `formularios`.`turma_id` WHERE `formularios`.`turma_id` IN (SELECT `turmas`.`id` FROM `turmas` WHERE (1=0))
+Rendered usuarios/avaliacoes.html.erb within layouts/application (Duration: 1.0ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.3ms | GC: 0.1ms)
+ +

Completed 200 OK in 3ms (Views: 1.2ms | ActiveRecord: 0.7ms (3 queries, 1 cached) | GC: 0.1ms)

+ +
TRANSACTION (0.9ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:26:33.697392', 'Ciência da Computação', '2026-06-30 17:26:33.697392')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:33.886741', NULL, NULL, NULL, 259, 'admin@unb.br', NULL, 'adm001', 'Admin Teste', NULL, NULL, '$2a$12$mpkiGQNoZdMY9BlqoEpxredCTAunnQcGuG/iD2yW/LzwEUuBOzlUO', 'Administrador', '2026-06-30 17:26:33.886741')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Docente Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:34.076517', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Prof Teste', NULL, NULL, '$2a$12$t5YZVZO4z/uTnBXKqVA/b.4V3Gi27rpgiIavbAyZhLpfFE4IjL9US', 'Docente', '2026-06-30 17:26:34.076517')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.4ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Software' AND `disciplinas`.`codigo` = 'SW1' AND `disciplinas`.`departamento_id` = 259 LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.4ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'SW1' LIMIT 1
+Disciplina Create (0.3ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('SW1', '2026-06-30 17:26:34.079127', 259, 'Software', '2026-06-30 17:26:34.079127')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 130 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 130 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:26:34.081055', 130, NULL, 'TA', '2026.1', '2026-06-30 17:26:34.081055')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:26:34.081712', NULL, NULL, NULL, NULL, 123, '2026-06-30 17:26:34.081712')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:26:34.082673', 'Avalie o professor', 86, 1, 'Texto', '2026-06-30 17:26:34.082673')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+CampoForm Create (0.4ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:26:34.083575', 68, 'Resposta', 1, NULL, '2026-06-30 17:26:34.083575')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma::HABTM_Docentes Create (0.3ms)  INSERT INTO `docentes_turmas` (`docente_id`, `turma_id`) VALUES (336, 123)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Curso Load (0.2ms)  SELECT `cursos`.* FROM `cursos` WHERE `cursos`.`nome` = 'Ciência da Computação' AND `cursos`.`codigo` = 'CIC' AND `cursos`.`departamento_id` = 259 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Curso Exists? (0.3ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`codigo` = 'CIC' LIMIT 1
+Curso Create (0.2ms)  INSERT INTO `cursos` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:26:34.086181', 259, 'Ciência da Computação', '2026-06-30 17:26:34.086181')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'disc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'aluno@unb.br' LIMIT 1
+Discente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:34.275095', 33, NULL, NULL, NULL, 'aluno@unb.br', NULL, 'disc001', 'Aluno Teste', NULL, NULL, '$2a$12$bZW06HXbINDhy3cHemObsuoFqQX14rn.cTUIrmXyvnV3B9YuQlFIi', 'Discente', '2026-06-30 17:26:34.275095')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma::HABTM_Discentes Create (0.4ms)  INSERT INTO `discentes_turmas` (`discente_id`, `turma_id`) VALUES (337, 123)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:26:34 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "aluno@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'aluno@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/337/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/usuarios/337/formularios/86/responder” for 127.0.0.1 at 2026-06-30 14:26:34 -0300 Processing by UsuariosController#responder_formulario as HTML

+ +
Parameters: {"usuario_id" => "337", "formulario_id" => "86"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 337 LIMIT 1
+CACHE Usuario Load (0.0ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 337 LIMIT 1
+Formulario Load (0.2ms)  SELECT `formularios`.* FROM `formularios` WHERE `formularios`.`id` = 86 LIMIT 1
+ElementoForm Load (0.3ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`formulario_id` = 86
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` = 68
+RespostaForm Exists? (0.2ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`formulario_id` = 86 AND `resposta_forms`.`usuario_id` = 337 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering usuarios/responder_formulario.html.erb within layouts/application
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`id` = 123 LIMIT 1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`id` = 130 LIMIT 1
+ElementoForm Load (0.2ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`formulario_id` = 86 ORDER BY `elemento_forms`.`ordem` ASC
+Rendered usuarios/responder_formulario.html.erb within layouts/application (Duration: 2.3ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 2.6ms | GC: 0.0ms)
+ +

Completed 200 OK in 7ms (Views: 2.1ms | ActiveRecord: 1.8ms (9 queries, 1 cached) | GC: 0.1ms)

+ +
TRANSACTION (0.6ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:26:34.475915', 'Ciência da Computação', '2026-06-30 17:26:34.475915')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:34.664616', NULL, NULL, NULL, 260, 'admin@unb.br', NULL, 'adm001', 'Admin Teste', NULL, NULL, '$2a$12$iJYDV0jme3fcjs/29gveNuEDa8x/aNC5xvO7ROTm7.U5LotE.Gr6C', 'Administrador', '2026-06-30 17:26:34.664616')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:34.854604', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Prof Teste', NULL, NULL, '$2a$12$j1.YVMFllDJHskWaaOe0.uCrBYKlw/ia22H7NAvepXjCBHpJ4/BcS', 'Docente', '2026-06-30 17:26:34.854604')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.3ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Software' AND `disciplinas`.`codigo` = 'SW1' AND `disciplinas`.`departamento_id` = 260 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.4ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'SW1' LIMIT 1
+Disciplina Create (0.3ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('SW1', '2026-06-30 17:26:34.856975', 260, 'Software', '2026-06-30 17:26:34.856975')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 131 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 131 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:26:34.858606', 131, NULL, 'TA', '2026.1', '2026-06-30 17:26:34.858606')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:26:34.859250', NULL, NULL, NULL, NULL, 124, '2026-06-30 17:26:34.859250')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:26:34.860164', 'Avalie o professor', 87, 1, 'Texto', '2026-06-30 17:26:34.860164')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.4ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:26:34.861058', 69, 'Resposta', 1, NULL, '2026-06-30 17:26:34.861058')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma::HABTM_Docentes Create (0.3ms)  INSERT INTO `docentes_turmas` (`docente_id`, `turma_id`) VALUES (339, 124)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Curso Load (0.2ms)  SELECT `cursos`.* FROM `cursos` WHERE `cursos`.`nome` = 'Ciência da Computação' AND `cursos`.`codigo` = 'CIC' AND `cursos`.`departamento_id` = 260 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Curso Exists? (0.3ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`codigo` = 'CIC' LIMIT 1
+Curso Create (0.2ms)  INSERT INTO `cursos` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:26:34.863647', 260, 'Ciência da Computação', '2026-06-30 17:26:34.863647')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'disc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'aluno@unb.br' LIMIT 1
+Discente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:35.052205', 34, NULL, NULL, NULL, 'aluno@unb.br', NULL, 'disc001', 'Aluno Teste', NULL, NULL, '$2a$12$bZrlvfFzO8B4Bse5/WR0h.5pgoiTcBfvY9ofv7kbZ2cHd8S3rHqoq', 'Discente', '2026-06-30 17:26:35.052205')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma::HABTM_Discentes Create (0.4ms)  INSERT INTO `discentes_turmas` (`discente_id`, `turma_id`) VALUES (340, 124)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:26:35 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "aluno@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'aluno@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/340/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+RespostaForm Exists? (0.6ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 340 AND `resposta_forms`.`formulario_id` = 87 LIMIT 1
+RespostaForm Create (0.3ms)  INSERT INTO `resposta_forms` (`created_at`, `data_submissao`, `formulario_id`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:26:35.245514', '2026-06-30', 87, '2026-06-30 17:26:35.245514', 340)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/usuarios/340/formularios/87/responder” for 127.0.0.1 at 2026-06-30 14:26:35 -0300 Processing by UsuariosController#responder_formulario as HTML

+ +
Parameters: {"usuario_id" => "340", "formulario_id" => "87"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 340 LIMIT 1
+CACHE Usuario Load (0.0ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 340 LIMIT 1
+Formulario Load (0.2ms)  SELECT `formularios`.* FROM `formularios` WHERE `formularios`.`id` = 87 LIMIT 1
+ElementoForm Load (0.2ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`formulario_id` = 87
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` = 69
+RespostaForm Exists? (0.3ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`formulario_id` = 87 AND `resposta_forms`.`usuario_id` = 340 LIMIT 1
+ +

Redirected to www.example.com/usuarios/340/avaliacoes Completed 302 Found in 3ms (ActiveRecord: 1.2ms (6 queries, 1 cached) | GC: 0.1ms)

+ +
TRANSACTION (0.9ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:26:35.252903', 'Ciência da Computação', '2026-06-30 17:26:35.252903')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:35.441693', NULL, NULL, NULL, 261, 'admin@unb.br', NULL, 'adm001', 'Admin Teste', NULL, NULL, '$2a$12$Dr1MD/A0l0JVZq3YtljbCe1a7GGpAsyJmjVpJ2k6EO4XlZ0NX9dVi', 'Administrador', '2026-06-30 17:26:35.441693')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Docente Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:35.630463', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Prof Teste', NULL, NULL, '$2a$12$PIl9H3QEsN10NEnTO.yIxeueIQ0F6dTzOjnOipOWnvRHqdLeyCtuu', 'Docente', '2026-06-30 17:26:35.630463')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.3ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Software' AND `disciplinas`.`codigo` = 'SW1' AND `disciplinas`.`departamento_id` = 261 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'SW1' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('SW1', '2026-06-30 17:26:35.632313', 261, 'Software', '2026-06-30 17:26:35.632313')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 132 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 132 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:26:35.634057', 132, NULL, 'TA', '2026.1', '2026-06-30 17:26:35.634057')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:26:35.634719', NULL, NULL, NULL, NULL, 125, '2026-06-30 17:26:35.634719')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:26:35.635714', 'Avalie o professor', 88, 1, 'Texto', '2026-06-30 17:26:35.635714')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.4ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:26:35.636615', 70, 'Resposta', 1, NULL, '2026-06-30 17:26:35.636615')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma::HABTM_Docentes Create (0.4ms)  INSERT INTO `docentes_turmas` (`docente_id`, `turma_id`) VALUES (342, 125)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Curso Load (0.2ms)  SELECT `cursos`.* FROM `cursos` WHERE `cursos`.`nome` = 'Ciência da Computação' AND `cursos`.`codigo` = 'CIC' AND `cursos`.`departamento_id` = 261 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Curso Exists? (0.3ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`codigo` = 'CIC' LIMIT 1
+Curso Create (0.2ms)  INSERT INTO `cursos` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:26:35.639169', 261, 'Ciência da Computação', '2026-06-30 17:26:35.639169')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'disc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'aluno@unb.br' LIMIT 1
+Discente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:35.828255', 35, NULL, NULL, NULL, 'aluno@unb.br', NULL, 'disc001', 'Aluno Teste', NULL, NULL, '$2a$12$wmGFATqOB.BsFjGO3IcgQ.l8yN8JhCYvokuySFGP7M3/pSzNdXJ0W', 'Discente', '2026-06-30 17:26:35.828255')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Turma::HABTM_Discentes Create (0.4ms)  INSERT INTO `discentes_turmas` (`discente_id`, `turma_id`) VALUES (343, 125)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:26:35 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "aluno@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'aluno@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/343/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.1ms)

+ +
RespostaElem Count (0.3ms)  SELECT COUNT(*) FROM `resposta_elems`
+RespostaForm Count (0.2ms)  SELECT COUNT(*) FROM `resposta_forms`
+ +

Started POST “/usuarios/343/formularios/88/responder” for 127.0.0.1 at 2026-06-30 14:26:36 -0300 Processing by UsuariosController#submeter_resposta as HTML

+ +
Parameters: {"respostas" => {"70" => "O professor foi ótimo"}, "usuario_id" => "343", "formulario_id" => "88"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 343 LIMIT 1
+CACHE Usuario Load (0.0ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 343 LIMIT 1
+Formulario Load (0.2ms)  SELECT `formularios`.* FROM `formularios` WHERE `formularios`.`id` = 88 LIMIT 1
+ElementoForm Load (0.2ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`formulario_id` = 88
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` = 70
+RespostaForm Exists? (0.2ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`formulario_id` = 88 AND `resposta_forms`.`usuario_id` = 343 LIMIT 1
+ElementoForm Load (0.2ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`formulario_id` = 88 ORDER BY `elemento_forms`.`ordem` ASC
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaForm Exists? (0.4ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 343 AND `resposta_forms`.`formulario_id` = 88 LIMIT 1
+RespostaForm Create (0.3ms)  INSERT INTO `resposta_forms` (`created_at`, `data_submissao`, `formulario_id`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:26:36.025648', '2026-06-30', 88, '2026-06-30 17:26:36.025648', 343)
+ElementoForm Load (0.2ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`formulario_id` = 88 ORDER BY `elemento_forms`.`ordem` ASC
+RespostaElem Create (0.2ms)  INSERT INTO `resposta_elems` (`campo_form_id`, `created_at`, `elemento_form_id`, `resposta_form_id`, `texto_resposta`, `updated_at`) VALUES (NULL, '2026-06-30 17:26:36.026696', 70, 35, 'O professor foi ótimo', '2026-06-30 17:26:36.026696')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/usuarios/343/avaliacoes Completed 302 Found in 6ms (ActiveRecord: 2.8ms (11 queries, 1 cached) | GC: 0.0ms)

+ +
RespostaForm Count (0.2ms)  SELECT COUNT(*) FROM `resposta_forms`
+RespostaElem Count (0.2ms)  SELECT COUNT(*) FROM `resposta_elems`
+TRANSACTION (0.6ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:26:36.030544', 'Ciência da Computação', '2026-06-30 17:26:36.030544')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:36.219450', NULL, NULL, NULL, 262, 'admin@unb.br', NULL, 'adm001', 'Admin Teste', NULL, NULL, '$2a$12$VPKEzJrBSicaJJfyKi7iN.MbyrnKkqX/FkVvPEnuXU8IwCM.UrVAO', 'Administrador', '2026-06-30 17:26:36.219450')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:36.408709', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Prof Teste', NULL, NULL, '$2a$12$zL7hiidgSUGQIbYCFkAZT.Ep/249rVMA33QvIjY5nQx48YpfjGJxi', 'Docente', '2026-06-30 17:26:36.408709')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.3ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Software' AND `disciplinas`.`codigo` = 'SW1' AND `disciplinas`.`departamento_id` = 262 LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.4ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'SW1' LIMIT 1
+Disciplina Create (0.3ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('SW1', '2026-06-30 17:26:36.410947', 262, 'Software', '2026-06-30 17:26:36.410947')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 133 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 133 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:26:36.412670', 133, NULL, 'TA', '2026.1', '2026-06-30 17:26:36.412670')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:26:36.413303', NULL, NULL, NULL, NULL, 126, '2026-06-30 17:26:36.413303')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:26:36.414283', 'Avalie o professor', 89, 1, 'Texto', '2026-06-30 17:26:36.414283')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.4ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:26:36.415148', 71, 'Resposta', 1, NULL, '2026-06-30 17:26:36.415148')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma::HABTM_Docentes Create (0.3ms)  INSERT INTO `docentes_turmas` (`docente_id`, `turma_id`) VALUES (345, 126)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Curso Load (0.2ms)  SELECT `cursos`.* FROM `cursos` WHERE `cursos`.`nome` = 'Ciência da Computação' AND `cursos`.`codigo` = 'CIC' AND `cursos`.`departamento_id` = 262 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Curso Exists? (0.3ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`codigo` = 'CIC' LIMIT 1
+Curso Create (0.2ms)  INSERT INTO `cursos` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:26:36.417615', 262, 'Ciência da Computação', '2026-06-30 17:26:36.417615')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'disc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'aluno@unb.br' LIMIT 1
+Discente Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:36.605951', 36, NULL, NULL, NULL, 'aluno@unb.br', NULL, 'disc001', 'Aluno Teste', NULL, NULL, '$2a$12$4Dvv9rVjYZZPihGqPHvVcOaInz2T21fEyvHTYrDIW28y9lQATR.SS', 'Discente', '2026-06-30 17:26:36.605951')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma::HABTM_Discentes Create (0.4ms)  INSERT INTO `discentes_turmas` (`discente_id`, `turma_id`) VALUES (346, 126)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:26:36 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "aluno@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'aluno@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/346/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.1ms)

+ +
RespostaForm Count (0.3ms)  SELECT COUNT(*) FROM `resposta_forms`
+ +

Started POST “/usuarios/346/formularios/89/responder” for 127.0.0.1 at 2026-06-30 14:26:36 -0300 Processing by UsuariosController#submeter_resposta as HTML

+ +
Parameters: {"respostas" => {"71" => ""}, "usuario_id" => "346", "formulario_id" => "89"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 346 LIMIT 1
+CACHE Usuario Load (0.0ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 346 LIMIT 1
+Formulario Load (0.2ms)  SELECT `formularios`.* FROM `formularios` WHERE `formularios`.`id` = 89 LIMIT 1
+ElementoForm Load (0.2ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`formulario_id` = 89
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` = 71
+RespostaForm Exists? (0.2ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`formulario_id` = 89 AND `resposta_forms`.`usuario_id` = 346 LIMIT 1
+ElementoForm Load (0.2ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`formulario_id` = 89 ORDER BY `elemento_forms`.`ordem` ASC
+Rendering layout layouts/application.html.erb
+Rendering usuarios/responder_formulario.html.erb within layouts/application
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`id` = 126 LIMIT 1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`id` = 133 LIMIT 1
+CACHE ElementoForm Load (0.0ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`formulario_id` = 89 ORDER BY `elemento_forms`.`ordem` ASC
+Rendered usuarios/responder_formulario.html.erb within layouts/application (Duration: 1.6ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.8ms | GC: 0.0ms)
+ +

Completed 422 Unprocessable Content in 5ms (Views: 1.6ms | ActiveRecord: 1.8ms (10 queries, 2 cached) | GC: 0.0ms)

+ +
RespostaForm Count (0.2ms)  SELECT COUNT(*) FROM `resposta_forms`
+TRANSACTION (0.9ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:26:36.807000', 'Ciência da Computação', '2026-06-30 17:26:36.807000')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm001' LIMIT 1
+Usuario Exists? (0.1ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:36.996223', NULL, NULL, NULL, 263, 'admin@unb.br', NULL, 'adm001', 'Admin Teste', NULL, NULL, '$2a$12$v8yD6LTmdx74XDBYXxlmAOSa.XdNP751fMSgxS7BqW0QKGE8JZ8j.', 'Administrador', '2026-06-30 17:26:36.996223')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:37.188328', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Prof Teste', NULL, NULL, '$2a$12$9/Ly0CY5OdGkziqJHxDZfuMfb7uGXRCgM8e8nz.p.EpBaXdBvlIOy', 'Docente', '2026-06-30 17:26:37.188328')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.3ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Software' AND `disciplinas`.`codigo` = 'SW1' AND `disciplinas`.`departamento_id` = 263 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.4ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'SW1' LIMIT 1
+Disciplina Create (0.3ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('SW1', '2026-06-30 17:26:37.190758', 263, 'Software', '2026-06-30 17:26:37.190758')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 134 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 134 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:26:37.192422', 134, NULL, 'TA', '2026.1', '2026-06-30 17:26:37.192422')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.5ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:26:37.193102', NULL, NULL, NULL, NULL, 127, '2026-06-30 17:26:37.193102')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:26:37.194243', 'Avalie o professor', 90, 1, 'Texto', '2026-06-30 17:26:37.194243')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.4ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:26:37.195159', 72, 'Resposta', 1, NULL, '2026-06-30 17:26:37.195159')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma::HABTM_Docentes Create (0.3ms)  INSERT INTO `docentes_turmas` (`docente_id`, `turma_id`) VALUES (348, 127)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Curso Load (0.3ms)  SELECT `cursos`.* FROM `cursos` WHERE `cursos`.`nome` = 'Ciência da Computação' AND `cursos`.`codigo` = 'CIC' AND `cursos`.`departamento_id` = 263 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Curso Exists? (0.3ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`codigo` = 'CIC' LIMIT 1
+Curso Create (0.2ms)  INSERT INTO `cursos` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:26:37.197895', 263, 'Ciência da Computação', '2026-06-30 17:26:37.197895')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'disc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'aluno@unb.br' LIMIT 1
+Discente Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:26:37.387811', 37, NULL, NULL, NULL, 'aluno@unb.br', NULL, 'disc001', 'Aluno Teste', NULL, NULL, '$2a$12$g2.VZKr9LhvfsCGbVjh0SemgogcYtstyVZmD.RRVB1xXVViB7Y/.i', 'Discente', '2026-06-30 17:26:37.387811')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma::HABTM_Discentes Create (0.3ms)  INSERT INTO `discentes_turmas` (`discente_id`, `turma_id`) VALUES (349, 127)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:26:37 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "aluno@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'aluno@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/349/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+RespostaForm Exists? (0.6ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 349 AND `resposta_forms`.`formulario_id` = 90 LIMIT 1
+RespostaForm Create (0.3ms)  INSERT INTO `resposta_forms` (`created_at`, `data_submissao`, `formulario_id`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:26:37.580779', '2026-06-30', 90, '2026-06-30 17:26:37.580779', 349)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/usuarios/349/formularios/90/responder” for 127.0.0.1 at 2026-06-30 14:26:37 -0300 Processing by UsuariosController#submeter_resposta as HTML

+ +
Parameters: {"respostas" => {"72" => "O professor foi ótimo"}, "usuario_id" => "349", "formulario_id" => "90"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 349 LIMIT 1
+CACHE Usuario Load (0.0ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 349 LIMIT 1
+Formulario Load (0.2ms)  SELECT `formularios`.* FROM `formularios` WHERE `formularios`.`id` = 90 LIMIT 1
+ElementoForm Load (0.2ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`formulario_id` = 90
+CampoForm Load (0.3ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` = 72
+RespostaForm Exists? (0.2ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`formulario_id` = 90 AND `resposta_forms`.`usuario_id` = 349 LIMIT 1
+ +

Redirected to www.example.com/usuarios/349/avaliacoes Completed 302 Found in 3ms (ActiveRecord: 1.2ms (6 queries, 1 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.9ms)  ROLLBACK
+ActiveRecord::InternalMetadata Load (0.4ms)  SELECT * FROM `ar_internal_metadata` WHERE `ar_internal_metadata`.`key` = 'schema_sha1' ORDER BY `ar_internal_metadata`.`key` ASC LIMIT 1
+ActiveRecord::SchemaMigration Load (0.3ms)  SELECT `schema_migrations`.`version` FROM `schema_migrations` ORDER BY `schema_migrations`.`version` ASC
+
dotenv
+
+

Saved a snapshot of ENV

+
+ +
TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.5ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.2ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:31:30.524886', 'Ciência da Computação', '2026-06-30 17:31:30.524886')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.7ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_admin' LIMIT 1
+Usuario Exists? (0.1ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+Administrador Create (1.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:31:30.733590', NULL, NULL, NULL, 1, 'admin_ctrl@unb.br', NULL, 'adm_admin', 'Admin Teste', NULL, NULL, '$2a$12$HZap6nCSj.5BYPUj0QX/O.F8lehOVS.qWeR.a5jcfSzgdfrjDWJyG', 'Administrador', '2026-06-30 17:31:30.733590')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:31:30 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin_ctrl@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/1/avaliacoes Completed 302 Found in 196ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/admin/1/avaliacoes” for 127.0.0.1 at 2026-06-30 14:31:30 -0300 Processing by AdminController#avaliacoes as HTML

+ +
Parameters: {"admin_id" => "1"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 1 LIMIT 1
+Administrador Load (0.5ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 1 LIMIT 1
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/avaliacoes.html.erb within layouts/gerenciamento
+Formulario Load (1.4ms)  SELECT `formularios`.* FROM `formularios` INNER JOIN `turmas` ON `turmas`.`id` = `formularios`.`turma_id`
+Rendered admin/avaliacoes.html.erb within layouts/gerenciamento (Duration: 8.6ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 11.1ms | GC: 0.0ms)
+ +

Completed 200 OK in 21ms (Views: 9.8ms | ActiveRecord: 3.9ms (3 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.1ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.2ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:31:30.993726', 'Ciência da Computação', '2026-06-30 17:31:30.993726')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_admin' LIMIT 1
+Usuario Exists? (0.1ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+Administrador Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:31:31.184496', NULL, NULL, NULL, 2, 'admin_ctrl@unb.br', NULL, 'adm_admin', 'Admin Teste', NULL, NULL, '$2a$12$pR4YrLtsMxqi6vCGF41tOeByHndyqaq.euD950VpP1FAKd62Uq47y', 'Administrador', '2026-06-30 17:31:31.184496')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:31:31 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin_ctrl@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/2/avaliacoes Completed 302 Found in 193ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/admin/2/gerenciamento” for 127.0.0.1 at 2026-06-30 14:31:31 -0300 Processing by AdminController#gerenciamento as HTML

+ +
Parameters: {"admin_id" => "2"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 2 LIMIT 1
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 2 LIMIT 1
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/gerenciamento.html.erb within layouts/gerenciamento
+Rendered admin/gerenciamento.html.erb within layouts/gerenciamento (Duration: 0.3ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 0.5ms | GC: 0.0ms)
+ +

Completed 200 OK in 2ms (Views: 0.6ms | ActiveRecord: 0.7ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.1ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:31:31.385041', 'Ciência da Computação', '2026-06-30 17:31:31.385041')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_admin' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+Administrador Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:31:31.600383', NULL, NULL, NULL, 3, 'admin_ctrl@unb.br', NULL, 'adm_admin', 'Admin Teste', NULL, NULL, '$2a$12$oruQjHTRbXKr09Ojd.zoV.i.8OYbPwe1OqQY4Y0oBax7UQ6ciUAjG', 'Administrador', '2026-06-30 17:31:31.600383')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:31:31 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin_ctrl@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/3/avaliacoes Completed 302 Found in 193ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.6ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_outro' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'outro_admin@unb.br' LIMIT 1
+Administrador Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:31:31.987689', NULL, NULL, NULL, 3, 'outro_admin@unb.br', NULL, 'adm_outro', 'Outro Admin', NULL, NULL, '$2a$12$KMlXhibQ5zGx2FUgW5CUce.O9w6p/Zn8QNHm2NvKwUvOHzeyNgTUq', 'Administrador', '2026-06-30 17:31:31.987689')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/admin/4/gerenciamento” for 127.0.0.1 at 2026-06-30 14:31:31 -0300 Processing by AdminController#gerenciamento as HTML

+ +
Parameters: {"admin_id" => "4"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 3 LIMIT 1
+Administrador Load (0.5ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 4 LIMIT 1
+ +

Redirected to www.example.com/inicio Filter chain halted as :set_admin rendered or redirected Completed 302 Found in 2ms (ActiveRecord: 0.9ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.6ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.4ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:31:31.994912', 'Ciência da Computação', '2026-06-30 17:31:31.994912')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_admin' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+Administrador Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:31:32.186631', NULL, NULL, NULL, 4, 'admin_ctrl@unb.br', NULL, 'adm_admin', 'Admin Teste', NULL, NULL, '$2a$12$nl26vGFEE/ZVBZGdMIPrdOdvOEOTyQfbLVSnnSQwZsr6WIbXs5Ms.', 'Administrador', '2026-06-30 17:31:32.186631')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:31:32 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin_ctrl@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/5/avaliacoes Completed 302 Found in 192ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/admin/5/enviar_formularios” for 127.0.0.1 at 2026-06-30 14:31:32 -0300 Processing by AdminController#enviar_formularios as HTML

+ +
Parameters: {"admin_id" => "5"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 5 LIMIT 1
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 5 LIMIT 1
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/enviar_formularios.html.erb within layouts/gerenciamento
+Template Load (0.8ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`usuario_id` = 5
+Turma Eager Load (0.5ms)  SELECT `turmas`.`id` AS t0_r0, `turmas`.`created_at` AS t0_r1, `turmas`.`disciplina_id` AS t0_r2, `turmas`.`horario` AS t0_r3, `turmas`.`numero_da_turma` AS t0_r4, `turmas`.`semestre` AS t0_r5, `turmas`.`updated_at` AS t0_r6, `disciplinas`.`id` AS t1_r0, `disciplinas`.`codigo` AS t1_r1, `disciplinas`.`created_at` AS t1_r2, `disciplinas`.`departamento_id` AS t1_r3, `disciplinas`.`nome` AS t1_r4, `disciplinas`.`updated_at` AS t1_r5 FROM `turmas` INNER JOIN `disciplinas` ON `disciplinas`.`id` = `turmas`.`disciplina_id` ORDER BY disciplinas.nome, turmas.semestre
+Rendered admin/enviar_formularios.html.erb within layouts/gerenciamento (Duration: 7.6ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 7.7ms | GC: 0.0ms)
+ +

Completed 200 OK in 13ms (Views: 2.5ms | ActiveRecord: 7.3ms (4 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.2ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:31:32.396246', 'Ciência da Computação', '2026-06-30 17:31:32.396246')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_admin' LIMIT 1
+Usuario Exists? (0.1ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+Administrador Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:31:32.586304', NULL, NULL, NULL, 5, 'admin_ctrl@unb.br', NULL, 'adm_admin', 'Admin Teste', NULL, NULL, '$2a$12$9TNrGTPZIOFclWfSi2FZCuDYi69QuLCQ6gNyWrJ1u4NaDgCO8VYZG', 'Administrador', '2026-06-30 17:31:32.586304')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:31:32 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin_ctrl@unb.br", "senha" => "Senha123"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/6/avaliacoes Completed 302 Found in 207ms (ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Disciplina Load (0.4ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'ES' AND `disciplinas`.`codigo` = 'CIC001A' AND `disciplinas`.`departamento_id` = 5 LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.4ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC001A' LIMIT 1
+Disciplina Create (0.3ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC001A', '2026-06-30 17:31:32.797995', 5, 'ES', '2026-06-30 17:31:32.797995')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 1 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 1 LIMIT 1
+Turma Create (0.3ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:31:32.801372', 1, NULL, 'TA', '2026.1', '2026-06-30 17:31:32.801372')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Administrador Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 6 LIMIT 1
+Template Create (0.3ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:31:32.813147', 'Template Ctrl', '2026-06-30 17:31:32.813147', 6)
+Elemento Create (0.7ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:31:32.813672', 'Questão 1', 1, 1, '2026-06-30 17:31:32.813672')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/admin/6/enviar_formularios” for 127.0.0.1 at 2026-06-30 14:31:32 -0300 Processing by AdminController#enviar_formularios as HTML

+ +
Parameters: {"template_id" => nil, "turma_ids" => ["1"], "admin_id" => "6"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 6 LIMIT 1
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 6 LIMIT 1
+ +

Redirected to www.example.com/admin/6/enviar_formularios Completed 302 Found in 1ms (ActiveRecord: 0.4ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:31:32.820639', 'Ciência da Computação', '2026-06-30 17:31:32.820639')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_admin' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+Administrador Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:31:33.019764', NULL, NULL, NULL, 6, 'admin_ctrl@unb.br', NULL, 'adm_admin', 'Admin Teste', NULL, NULL, '$2a$12$.yDI.o9FVcZE7HVYu9aWzOutpHIS3w67ZFh6zBKI81efGlBm/rpjO', 'Administrador', '2026-06-30 17:31:33.019764')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:31:33 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin_ctrl@unb.br", "senha" => "Senha123"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/7/avaliacoes Completed 302 Found in 191ms (ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Disciplina Load (0.4ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'ES' AND `disciplinas`.`codigo` = 'CIC001A' AND `disciplinas`.`departamento_id` = 6 LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.5ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC001A' LIMIT 1
+Disciplina Create (0.3ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC001A', '2026-06-30 17:31:33.215312', 6, 'ES', '2026-06-30 17:31:33.215312')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 2 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Turma Exists? (0.6ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 2 LIMIT 1
+Turma Create (0.3ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:31:33.217753', 2, NULL, 'TA', '2026.1', '2026-06-30 17:31:33.217753')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Administrador Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 7 LIMIT 1
+Template Create (0.2ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:31:33.219817', 'Template Ctrl', '2026-06-30 17:31:33.219817', 7)
+Elemento Create (0.2ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:31:33.220261', 'Questão 1', 1, 2, '2026-06-30 17:31:33.220261')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/admin/7/enviar_formularios” for 127.0.0.1 at 2026-06-30 14:31:33 -0300 Processing by AdminController#enviar_formularios as HTML

+ +
Parameters: {"template_id" => "2", "turma_ids" => nil, "admin_id" => "7"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 7 LIMIT 1
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 7 LIMIT 1
+ +

Redirected to www.example.com/admin/7/enviar_formularios Completed 302 Found in 1ms (ActiveRecord: 0.5ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.5ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:31:33.224949', 'Ciência da Computação', '2026-06-30 17:31:33.224949')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_admin' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+Administrador Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:31:33.415285', NULL, NULL, NULL, 7, 'admin_ctrl@unb.br', NULL, 'adm_admin', 'Admin Teste', NULL, NULL, '$2a$12$WcWPVEKnJTdo7VjaoUXbAegCO52QhoGiP2ph3gzywsgtoOO45BY8q', 'Administrador', '2026-06-30 17:31:33.415285')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:31:33 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin_ctrl@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/8/avaliacoes Completed 302 Found in 190ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Disciplina Load (0.5ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'ES' AND `disciplinas`.`codigo` = 'CIC001A' AND `disciplinas`.`departamento_id` = 7 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC001A' LIMIT 1
+Disciplina Create (0.4ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC001A', '2026-06-30 17:31:33.609118', 7, 'ES', '2026-06-30 17:31:33.609118')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 3 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 3 LIMIT 1
+Turma Create (0.3ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:31:33.611199', 3, NULL, 'TA', '2026.1', '2026-06-30 17:31:33.611199')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Administrador Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 8 LIMIT 1
+Template Create (0.2ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:31:33.612974', 'Template Ctrl', '2026-06-30 17:31:33.612974', 8)
+Elemento Create (0.2ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:31:33.613371', 'Questão 1', 1, 3, '2026-06-30 17:31:33.613371')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Formulario Count (0.2ms)  SELECT COUNT(*) FROM `formularios`
+ +

Started POST “/admin/8/enviar_formularios” for 127.0.0.1 at 2026-06-30 14:31:33 -0300 Processing by AdminController#enviar_formularios as HTML

+ +
Parameters: {"template_id" => "3", "turma_ids" => ["3"], "admin_id" => "8"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 8 LIMIT 1
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 8 LIMIT 1
+Template Load (0.2ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`id` = 3 LIMIT 1
+Elemento Load (0.2ms)  SELECT `elementos`.* FROM `elementos` WHERE `elementos`.`template_id` = 3
+Campo Load (0.8ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` = 3
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`id` = 3
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`id` = 3 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.5ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:31:33.627121', NULL, NULL, NULL, 'ES - 2026.1', 3, '2026-06-30 17:31:33.627121')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+ElementoForm Create (1.1ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:31:33.633443', 'Questão 1', 1, 1, 'Texto', '2026-06-30 17:31:33.633443')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/admin/8/gerenciamento Completed 302 Found in 19ms (ActiveRecord: 9.8ms (9 queries, 0 cached) | GC: 0.0ms)

+ +
Formulario Count (0.2ms)  SELECT COUNT(*) FROM `formularios`
+TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:31:33.638285', 'Ciência da Computação', '2026-06-30 17:31:33.638285')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_admin' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:31:33.828358', NULL, NULL, NULL, 8, 'admin_ctrl@unb.br', NULL, 'adm_admin', 'Admin Teste', NULL, NULL, '$2a$12$u5zf6yhBdgOlu3btVsf8m.NI/QRqw.mCouKkXcjVOAHPPns6TVTo6', 'Administrador', '2026-06-30 17:31:33.828358')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:31:33 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin_ctrl@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/9/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Disciplina Load (0.4ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'ES' AND `disciplinas`.`codigo` = 'CIC001A' AND `disciplinas`.`departamento_id` = 8 LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.4ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC001A' LIMIT 1
+Disciplina Create (0.4ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC001A', '2026-06-30 17:31:34.021108', 8, 'ES', '2026-06-30 17:31:34.021108')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 4 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 4 LIMIT 1
+Turma Create (0.3ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:31:34.023325', 4, NULL, 'TA', '2026.1', '2026-06-30 17:31:34.023325')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Administrador Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 9 LIMIT 1
+Template Create (0.2ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:31:34.025315', 'Template Ctrl', '2026-06-30 17:31:34.025315', 9)
+Elemento Create (0.2ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:31:34.025758', 'Questão 1', 1, 4, '2026-06-30 17:31:34.025758')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TB' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 4 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:31:34.027012', 4, NULL, 'TB', '2026.1', '2026-06-30 17:31:34.027012')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Formulario Count (0.2ms)  SELECT COUNT(*) FROM `formularios`
+ +

Started POST “/admin/9/enviar_formularios” for 127.0.0.1 at 2026-06-30 14:31:34 -0300 Processing by AdminController#enviar_formularios as HTML

+ +
Parameters: {"template_id" => "4", "turma_ids" => ["4", "5"], "admin_id" => "9"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 9 LIMIT 1
+Administrador Load (0.1ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 9 LIMIT 1
+Template Load (0.1ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`id` = 4 LIMIT 1
+Elemento Load (0.1ms)  SELECT `elementos`.* FROM `elementos` WHERE `elementos`.`template_id` = 4
+Campo Load (0.2ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` = 4
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`id` IN (4, 5)
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`id` = 4 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:31:34.031471', NULL, NULL, NULL, 'ES - 2026.1', 4, '2026-06-30 17:31:34.031471')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:31:34.032623', 'Questão 1', 2, 1, 'Texto', '2026-06-30 17:31:34.032623')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`id` = 4 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:31:34.034133', NULL, NULL, NULL, 'ES - 2026.1', 5, '2026-06-30 17:31:34.034133')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:31:34.035239', 'Questão 1', 3, 1, 'Texto', '2026-06-30 17:31:34.035239')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/admin/9/gerenciamento Completed 302 Found in 8ms (ActiveRecord: 3.8ms (12 queries, 0 cached) | GC: 0.0ms)

+ +
Formulario Count (0.2ms)  SELECT COUNT(*) FROM `formularios`
+TRANSACTION (0.9ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:31:34.039105', 'Ciência da Computação', '2026-06-30 17:31:34.039105')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_admin' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:31:34.228463', NULL, NULL, NULL, 9, 'admin_ctrl@unb.br', NULL, 'adm_admin', 'Admin Teste', NULL, NULL, '$2a$12$aFj9wn.epa/PYH2j6z13MuL7zzbQYcuaGlkXTTuUZUD7/Y1okLq9e', 'Administrador', '2026-06-30 17:31:34.228463')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:31:34 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin_ctrl@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/10/avaliacoes Completed 302 Found in 190ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Disciplina Load (0.4ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'ES' AND `disciplinas`.`codigo` = 'CIC001A' AND `disciplinas`.`departamento_id` = 9 LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.4ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC001A' LIMIT 1
+Disciplina Create (0.3ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC001A', '2026-06-30 17:31:34.421642', 9, 'ES', '2026-06-30 17:31:34.421642')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 5 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 5 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:31:34.423634', 5, NULL, 'TA', '2026.1', '2026-06-30 17:31:34.423634')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 10 LIMIT 1
+Template Create (0.1ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:31:34.425382', 'Template Ctrl', '2026-06-30 17:31:34.425382', 10)
+Elemento Create (0.2ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:31:34.425708', 'Questão 1', 1, 5, '2026-06-30 17:31:34.425708')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/admin/10/enviar_formularios” for 127.0.0.1 at 2026-06-30 14:31:34 -0300 Processing by AdminController#enviar_formularios as HTML

+ +
Parameters: {"template_id" => "5", "turma_ids" => ["6"], "admin_id" => "10"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 10 LIMIT 1
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 10 LIMIT 1
+Template Load (0.1ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`id` = 5 LIMIT 1
+Elemento Load (0.2ms)  SELECT `elementos`.* FROM `elementos` WHERE `elementos`.`template_id` = 5
+Campo Load (0.2ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` = 5
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`id` = 6
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`id` = 5 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:31:34.429838', NULL, NULL, NULL, 'ES - 2026.1', 6, '2026-06-30 17:31:34.429838')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.3ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:31:34.430954', 'Questão 1', 4, 1, 'Texto', '2026-06-30 17:31:34.430954')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/admin/10/gerenciamento Completed 302 Found in 5ms (ActiveRecord: 2.2ms (9 queries, 0 cached) | GC: 0.0ms)

+ +
Formulario Load (0.1ms)  SELECT `formularios`.* FROM `formularios` ORDER BY `formularios`.`id` DESC LIMIT 1
+ElementoForm Count (0.2ms)  SELECT COUNT(*) FROM `elemento_forms` WHERE `elemento_forms`.`formulario_id` = 4
+TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.1ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:31:34.434522', 'Ciência da Computação', '2026-06-30 17:31:34.434522')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_admin' LIMIT 1
+Usuario Exists? (0.1ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+Administrador Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:31:34.625310', NULL, NULL, NULL, 10, 'admin_ctrl@unb.br', NULL, 'adm_admin', 'Admin Teste', NULL, NULL, '$2a$12$h6y36HPHOZ8aVueFzpyzS.f6mkBbgaeE9FCAv7FnSZ2MOl3oGUz5C', 'Administrador', '2026-06-30 17:31:34.625310')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:31:34 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin_ctrl@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/11/avaliacoes Completed 302 Found in 190ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/admin/11/resultados” for 127.0.0.1 at 2026-06-30 14:31:34 -0300 Processing by AdminController#resultados as HTML

+ +
Parameters: {"admin_id" => "11"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 11 LIMIT 1
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 11 LIMIT 1
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/resultados.html.erb within layouts/gerenciamento
+Formulario Eager Load (0.4ms)  SELECT `formularios`.`id` AS t0_r0, `formularios`.`created_at` AS t0_r1, `formularios`.`data_fim` AS t0_r2, `formularios`.`data_inicio` AS t0_r3, `formularios`.`nome` AS t0_r4, `formularios`.`titulo` AS t0_r5, `formularios`.`turma_id` AS t0_r6, `formularios`.`updated_at` AS t0_r7, `turmas`.`id` AS t1_r0, `turmas`.`created_at` AS t1_r1, `turmas`.`disciplina_id` AS t1_r2, `turmas`.`horario` AS t1_r3, `turmas`.`numero_da_turma` AS t1_r4, `turmas`.`semestre` AS t1_r5, `turmas`.`updated_at` AS t1_r6, `disciplinas`.`id` AS t2_r0, `disciplinas`.`codigo` AS t2_r1, `disciplinas`.`created_at` AS t2_r2, `disciplinas`.`departamento_id` AS t2_r3, `disciplinas`.`nome` AS t2_r4, `disciplinas`.`updated_at` AS t2_r5 FROM `formularios` INNER JOIN `turmas` ON `turmas`.`id` = `formularios`.`turma_id` INNER JOIN `disciplinas` ON `disciplinas`.`id` = `turmas`.`disciplina_id` WHERE `disciplinas`.`departamento_id` = 10
+Rendered admin/resultados.html.erb within layouts/gerenciamento (Duration: 1.2ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 1.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 4ms (Views: 1.0ms | ActiveRecord: 1.1ms (3 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:31:34.824761', 'Ciência da Computação', '2026-06-30 17:31:34.824761')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_admin' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+Administrador Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:31:35.014318', NULL, NULL, NULL, 11, 'admin_ctrl@unb.br', NULL, 'adm_admin', 'Admin Teste', NULL, NULL, '$2a$12$AQDtGJOxaQ.KD0IUpFt5De16u8OTZPngNSkQoOgppTF8CGhCYRz5y', 'Administrador', '2026-06-30 17:31:35.014318')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:31:35 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin_ctrl@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/12/avaliacoes Completed 302 Found in 190ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Disciplina Load (0.4ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'ES Download' AND `disciplinas`.`codigo` = 'CIC002A' AND `disciplinas`.`departamento_id` = 11 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.4ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC002A' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC002A', '2026-06-30 17:31:35.208254', 11, 'ES Download', '2026-06-30 17:31:35.208254')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 6 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.3ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 6 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:31:35.209994', 6, NULL, 'TA', '2026.1', '2026-06-30 17:31:35.209994')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.3ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:31:35.210668', NULL, NULL, NULL, NULL, 7, '2026-06-30 17:31:35.210668')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/admin/12/resultados/999999/download.csv” for 127.0.0.1 at 2026-06-30 14:31:35 -0300 Processing by AdminController#exportar_csv as CSV

+ +
Parameters: {"admin_id" => "12", "id" => "999999"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 12 LIMIT 1
+Administrador Load (0.1ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 12 LIMIT 1
+Formulario Load (0.2ms)  SELECT `formularios`.* FROM `formularios` WHERE `formularios`.`id` = 999999 LIMIT 1
+ +

Redirected to www.example.com/admin/12/resultados Completed 302 Found in 1ms (ActiveRecord: 0.5ms (3 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:31:35.215751', 'Ciência da Computação', '2026-06-30 17:31:35.215751')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_admin' LIMIT 1
+Usuario Exists? (0.1ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+Administrador Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:31:35.405419', NULL, NULL, NULL, 12, 'admin_ctrl@unb.br', NULL, 'adm_admin', 'Admin Teste', NULL, NULL, '$2a$12$fplUrQnY19ZwzdAyO8Xl9O4oK03DAQuk5jUUJDDjcXuypXtfZ3P.W', 'Administrador', '2026-06-30 17:31:35.405419')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:31:35 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin_ctrl@unb.br", "senha" => "Senha123"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/13/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Disciplina Load (0.4ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'ES Download' AND `disciplinas`.`codigo` = 'CIC002A' AND `disciplinas`.`departamento_id` = 12 LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.4ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC002A' LIMIT 1
+Disciplina Create (0.3ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC002A', '2026-06-30 17:31:35.598368', 12, 'ES Download', '2026-06-30 17:31:35.598368')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 7 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 7 LIMIT 1
+Turma Create (0.3ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:31:35.600561', 7, NULL, 'TA', '2026.1', '2026-06-30 17:31:35.600561')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:31:35.601451', NULL, NULL, NULL, NULL, 8, '2026-06-30 17:31:35.601451')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/admin/13/resultados/6/download.csv” for 127.0.0.1 at 2026-06-30 14:31:35 -0300 Processing by AdminController#exportar_csv as CSV

+ +
Parameters: {"admin_id" => "13", "id" => "6"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 13 LIMIT 1
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 13 LIMIT 1
+Formulario Load (0.2ms)  SELECT `formularios`.* FROM `formularios` WHERE `formularios`.`id` = 6 LIMIT 1
+RespostaForm Exists? (0.8ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`formulario_id` = 6 LIMIT 1
+ +

Redirected to www.example.com/admin/13/resultados Completed 302 Found in 8ms (ActiveRecord: 4.7ms (4 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:31:35.613245', 'Ciência da Computação', '2026-06-30 17:31:35.613245')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_admin' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:31:35.802483', NULL, NULL, NULL, 13, 'admin_ctrl@unb.br', NULL, 'adm_admin', 'Admin Teste', NULL, NULL, '$2a$12$EqfkwDVnkNsGRJnJEV/XZu5U0ey9aHdfJ85jbthZSUP.CWyDFTgRq', 'Administrador', '2026-06-30 17:31:35.802483')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:31:35 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin_ctrl@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/14/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Disciplina Load (0.3ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'ES Download' AND `disciplinas`.`codigo` = 'CIC002A' AND `disciplinas`.`departamento_id` = 13 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.4ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC002A' LIMIT 1
+Disciplina Create (0.3ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC002A', '2026-06-30 17:31:35.994501', 13, 'ES Download', '2026-06-30 17:31:35.994501')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 8 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 8 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:31:35.996410', 8, NULL, 'TA', '2026.1', '2026-06-30 17:31:35.996410')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:31:35.997177', NULL, NULL, NULL, NULL, 9, '2026-06-30 17:31:35.997177')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Docente Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Docente' AND `usuarios`.`email` = 'doc_csv@unb.br' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_csv' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_csv@unb.br' LIMIT 1
+Docente Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:31:36.190320', NULL, NULL, NULL, NULL, 'doc_csv@unb.br', 'Doutorado', 'doc_csv', 'Docente CSV', NULL, NULL, '$2a$12$7K2jpBGXbr43VOTnqavzBeI5vxPWEQgkfTxG.rOZ7NQ.wAnzac8ge', 'Docente', '2026-06-30 17:31:36.190320')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+RespostaForm Exists? (0.6ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 15 AND `resposta_forms`.`formulario_id` = 7 LIMIT 1
+RespostaForm Create (0.3ms)  INSERT INTO `resposta_forms` (`created_at`, `data_submissao`, `formulario_id`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:31:36.193536', '2026-06-30', 7, '2026-06-30 17:31:36.193536', 15)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/admin/14/resultados/7/download.csv” for 127.0.0.1 at 2026-06-30 14:31:36 -0300 Processing by AdminController#exportar_csv as CSV

+ +
Parameters: {"admin_id" => "14", "id" => "7"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 14 LIMIT 1
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 14 LIMIT 1
+Formulario Load (0.2ms)  SELECT `formularios`.* FROM `formularios` WHERE `formularios`.`id` = 7 LIMIT 1
+RespostaForm Exists? (0.2ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`formulario_id` = 7 LIMIT 1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`id` = 9 LIMIT 1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`id` = 8 LIMIT 1
+Rendering admin/exportar_csv.csv.erb
+ElementoForm Pluck (0.2ms)  SELECT `elemento_forms`.`enunciado` FROM `elemento_forms` WHERE `elemento_forms`.`formulario_id` = 7 ORDER BY `elemento_forms`.`ordem` ASC
+RespostaForm Load (0.2ms)  SELECT `resposta_forms`.* FROM `resposta_forms` WHERE `resposta_forms`.`formulario_id` = 7
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 15
+RespostaElem Load (0.8ms)  SELECT `resposta_elems`.* FROM `resposta_elems` WHERE `resposta_elems`.`resposta_form_id` = 1
+Rendered admin/exportar_csv.csv.erb (Duration: 7.1ms | GC: 0.0ms)
+ +

Completed 200 OK in 12ms (Views: 3.7ms | ActiveRecord: 5.6ms (10 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.6ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:31:36.209485', 'Ciência da Computação', '2026-06-30 17:31:36.209485')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_admin' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:31:36.398078', NULL, NULL, NULL, 14, 'admin_ctrl@unb.br', NULL, 'adm_admin', 'Admin Teste', NULL, NULL, '$2a$12$C.r4lYmorTfprOCczqJpMuogZLt4WtGrVOjsyMcrzLK/Qa4csltZy', 'Administrador', '2026-06-30 17:31:36.398078')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:31:36 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin_ctrl@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/16/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/admin/16/sincronizar_sigaa” for 127.0.0.1 at 2026-06-30 14:31:36 -0300 Processing by AdminController#sincronizar_sigaa as HTML

+ +
Parameters: {"admin_id" => "16"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 16 LIMIT 1
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 16 LIMIT 1
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/sincronizar_sigaa.html.erb within layouts/gerenciamento
+Rendered admin/sincronizar_sigaa.html.erb within layouts/gerenciamento (Duration: 2.0ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 2.2ms | GC: 0.0ms)
+ +

Completed 200 OK in 6ms (Views: 4.3ms | ActiveRecord: 0.6ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:31:36.596857', 'Ciência da Computação', '2026-06-30 17:31:36.596857')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_admin' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:31:36.786054', NULL, NULL, NULL, 15, 'admin_ctrl@unb.br', NULL, 'adm_admin', 'Admin Teste', NULL, NULL, '$2a$12$vU7uN8QKxRSvi/yYs7ELd.h6i3vnqNz8V9QKR1p1m3C5W9Ihg8Weu', 'Administrador', '2026-06-30 17:31:36.786054')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:31:36 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin_ctrl@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/17/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started POST “/admin/17/sincronizar_sigaa” for 127.0.0.1 at 2026-06-30 14:31:36 -0300 Processing by AdminController#sincronizar_sigaa as HTML

+ +
Parameters: {"acao" => "importar", "admin_id" => "17"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 17 LIMIT 1
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 17 LIMIT 1
+ +

Redirected to www.example.com/admin/17/gerenciamento Completed 302 Found in 1ms (ActiveRecord: 0.6ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:31:36.981624', 'Ciência da Computação', '2026-06-30 17:31:36.981624')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_admin' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:31:37.170195', NULL, NULL, NULL, 16, 'admin_ctrl@unb.br', NULL, 'adm_admin', 'Admin Teste', NULL, NULL, '$2a$12$Q1sVS3wu76RFKPPhr9r0Q.RUGbo5tkvYKjNizmodx0bKUeE5D8nvi', 'Administrador', '2026-06-30 17:31:37.170195')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:31:37 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin_ctrl@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/18/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started POST “/admin/18/sincronizar_sigaa” for 127.0.0.1 at 2026-06-30 14:31:37 -0300 Processing by AdminController#sincronizar_sigaa as HTML

+ +
Parameters: {"acao" => "importar", "arquivo_classes" => #<ActionDispatch::Http::UploadedFile:0x0000000127ee2280 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-99457-8q5g2g.json>, @content_type="application/json", @original_filename="class_members.json", @headers="content-disposition: form-data; name=\"arquivo_classes\"; filename=\"class_members.json\"\r\ncontent-type: application/json\r\ncontent-length: 16065\r\n">, "arquivo_membros" => #<ActionDispatch::Http::UploadedFile:0x0000000127ee2190 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-99457-x7ckp7.json>, @content_type="application/json", @original_filename="class_members.json", @headers="content-disposition: form-data; name=\"arquivo_membros\"; filename=\"class_members.json\"\r\ncontent-type: application/json\r\ncontent-length: 16065\r\n">, "admin_id" => "18"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 18 LIMIT 1
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 18 LIMIT 1
+ +

Redirected to www.example.com/admin/18/gerenciamento Completed 302 Found in 1ms (ActiveRecord: 0.6ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:31:37.370408', 'Ciência da Computação', '2026-06-30 17:31:37.370408')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_admin' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:31:37.559466', NULL, NULL, NULL, 17, 'admin_ctrl@unb.br', NULL, 'adm_admin', 'Admin Teste', NULL, NULL, '$2a$12$Y2xeSLnSBn/Rcuj/nIS0L.avwOqAULycU6P7H2.cV4aIk3BGRGBCC', 'Administrador', '2026-06-30 17:31:37.559466')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:31:37 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin_ctrl@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/19/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started POST “/admin/19/sincronizar_sigaa” for 127.0.0.1 at 2026-06-30 14:31:37 -0300 Processing by AdminController#sincronizar_sigaa as HTML

+ +
Parameters: {"acao" => "atualizar", "arquivo_classes" => #<ActionDispatch::Http::UploadedFile:0x0000000127fa40b0 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-99457-69t9pz.json>, @content_type="application/json", @original_filename="class_members.json", @headers="content-disposition: form-data; name=\"arquivo_classes\"; filename=\"class_members.json\"\r\ncontent-type: application/json\r\ncontent-length: 16065\r\n">, "arquivo_membros" => #<ActionDispatch::Http::UploadedFile:0x0000000127fa4060 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-99457-ay20v3.json>, @content_type="application/json", @original_filename="class_members.json", @headers="content-disposition: form-data; name=\"arquivo_membros\"; filename=\"class_members.json\"\r\ncontent-type: application/json\r\ncontent-length: 16065\r\n">, "admin_id" => "19"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 19 LIMIT 1
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 19 LIMIT 1
+ +

Redirected to www.example.com/admin/19/gerenciamento Completed 302 Found in 2ms (ActiveRecord: 0.6ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:31:37.756059', 'Ciência da Computação', '2026-06-30 17:31:37.756059')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_admin' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+Administrador Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:31:37.946901', NULL, NULL, NULL, 18, 'admin_ctrl@unb.br', NULL, 'adm_admin', 'Admin Teste', NULL, NULL, '$2a$12$cr09JFbhMj.m0vEQJepHrOo0ZRpkjyNsQ2A00y3hOuLC1PGxKKUJW', 'Administrador', '2026-06-30 17:31:37.946901')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:31:37 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin_ctrl@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/20/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started POST “/admin/20/sincronizar_sigaa” for 127.0.0.1 at 2026-06-30 14:31:38 -0300 Processing by AdminController#sincronizar_sigaa as HTML

+ +
Parameters: {"acao" => "importar", "arquivo_classes" => #<ActionDispatch::Http::UploadedFile:0x00000001280a6008 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-99457-2a6csj.json>, @content_type="application/json", @original_filename="class_members.json", @headers="content-disposition: form-data; name=\"arquivo_classes\"; filename=\"class_members.json\"\r\ncontent-type: application/json\r\ncontent-length: 16065\r\n">, "arquivo_membros" => #<ActionDispatch::Http::UploadedFile:0x00000001280a5fb8 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-99457-ub0r38.json>, @content_type="application/json", @original_filename="class_members.json", @headers="content-disposition: form-data; name=\"arquivo_membros\"; filename=\"class_members.json\"\r\ncontent-type: application/json\r\ncontent-length: 16065\r\n">, "admin_id" => "20"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 20 LIMIT 1
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 20 LIMIT 1
+ +

Redirected to www.example.com/admin/20/gerenciamento Completed 302 Found in 1ms (ActiveRecord: 0.6ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.5ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:31:38.143024', 'Ciência da Computação', '2026-06-30 17:31:38.143024')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_admin' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:31:38.331979', NULL, NULL, NULL, 19, 'admin_ctrl@unb.br', NULL, 'adm_admin', 'Admin Teste', NULL, NULL, '$2a$12$4gnax/dcWK7L2IvPYV7bWO6mNqwUa3fvTqAVu4gYQPmgTWcGNg3pi', 'Administrador', '2026-06-30 17:31:38.331979')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:31:38 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin_ctrl@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/21/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started POST “/admin/21/sincronizar_sigaa” for 127.0.0.1 at 2026-06-30 14:31:38 -0300 Processing by AdminController#sincronizar_sigaa as HTML

+ +
Parameters: {"acao" => "atualizar", "arquivo_classes" => #<ActionDispatch::Http::UploadedFile:0x0000000128167f50 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-99457-17cln2.json>, @content_type="application/json", @original_filename="class_members.json", @headers="content-disposition: form-data; name=\"arquivo_classes\"; filename=\"class_members.json\"\r\ncontent-type: application/json\r\ncontent-length: 16065\r\n">, "arquivo_membros" => #<ActionDispatch::Http::UploadedFile:0x0000000128167f00 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-99457-5alqq7.json>, @content_type="application/json", @original_filename="class_members.json", @headers="content-disposition: form-data; name=\"arquivo_membros\"; filename=\"class_members.json\"\r\ncontent-type: application/json\r\ncontent-length: 16065\r\n">, "admin_id" => "21"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 21 LIMIT 1
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 21 LIMIT 1
+ +

Redirected to www.example.com/admin/21/gerenciamento Completed 302 Found in 1ms (ActiveRecord: 0.6ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:31:38.528257', 'Ciência da Computação', '2026-06-30 17:31:38.528257')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_admin' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:31:38.718401', NULL, NULL, NULL, 20, 'admin_ctrl@unb.br', NULL, 'adm_admin', 'Admin Teste', NULL, NULL, '$2a$12$j9VPFd4MXORVuQia9e1jOOJAaK2WWjzjElyz0KVxk8OURXD8v7s/K', 'Administrador', '2026-06-30 17:31:38.718401')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:31:38 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin_ctrl@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/22/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started POST “/admin/22/sincronizar_sigaa” for 127.0.0.1 at 2026-06-30 14:31:38 -0300 Processing by AdminController#sincronizar_sigaa as HTML

+ +
Parameters: {"acao" => "importar", "arquivo_classes" => #<ActionDispatch::Http::UploadedFile:0x0000000128229ec0 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-99457-oueq01.json>, @content_type="application/json", @original_filename="class_members.json", @headers="content-disposition: form-data; name=\"arquivo_classes\"; filename=\"class_members.json\"\r\ncontent-type: application/json\r\ncontent-length: 16065\r\n">, "arquivo_membros" => #<ActionDispatch::Http::UploadedFile:0x0000000128229e70 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-99457-gsyr7p.json>, @content_type="application/json", @original_filename="class_members.json", @headers="content-disposition: form-data; name=\"arquivo_membros\"; filename=\"class_members.json\"\r\ncontent-type: application/json\r\ncontent-length: 16065\r\n">, "admin_id" => "22"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 22 LIMIT 1
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 22 LIMIT 1
+ +

Redirected to www.example.com/admin/22/gerenciamento Completed 302 Found in 2ms (ActiveRecord: 0.8ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.6ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:31:38.927395', 'Ciência da Computação', '2026-06-30 17:31:38.927395')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_admin' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+Administrador Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:31:39.115976', NULL, NULL, NULL, 21, 'admin_ctrl@unb.br', NULL, 'adm_admin', 'Admin Teste', NULL, NULL, '$2a$12$XLvDTV0mbb3GNBmRf4h2IOjIoKQyENy/dijo3z0CS.25B8bg2lbeO', 'Administrador', '2026-06-30 17:31:39.115976')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:31:39 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin_ctrl@unb.br", "senha" => "Senha123"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/23/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms) Started POST “/admin/23/sincronizar_sigaa” for 127.0.0.1 at 2026-06-30 14:31:39 -0300 Processing by AdminController#sincronizar_sigaa as HTML

+ +
Parameters: {"acao" => "atualizar", "arquivo_classes" => #<ActionDispatch::Http::UploadedFile:0x0000000126187eb0 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-99457-i5s9bo.json>, @content_type="application/json", @original_filename="class_members.json", @headers="content-disposition: form-data; name=\"arquivo_classes\"; filename=\"class_members.json\"\r\ncontent-type: application/json\r\ncontent-length: 16065\r\n">, "arquivo_membros" => #<ActionDispatch::Http::UploadedFile:0x0000000126187e60 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-99457-w0a01g.json>, @content_type="application/json", @original_filename="class_members.json", @headers="content-disposition: form-data; name=\"arquivo_membros\"; filename=\"class_members.json\"\r\ncontent-type: application/json\r\ncontent-length: 16065\r\n">, "admin_id" => "23"}
+Usuario Load (0.5ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 23 LIMIT 1
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 23 LIMIT 1
+ +

Redirected to www.example.com/admin/23/gerenciamento Completed 302 Found in 2ms (ActiveRecord: 0.7ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:31:39.312819', 'Ciência da Computação', '2026-06-30 17:31:39.312819')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_admin' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+Administrador Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:31:39.502267', NULL, NULL, NULL, 22, 'admin_ctrl@unb.br', NULL, 'adm_admin', 'Admin Teste', NULL, NULL, '$2a$12$V4ds.cAppiZyqkdOdZNvoO2w/avIiqnpURlZZ0qKCrgmvCrImxKF6', 'Administrador', '2026-06-30 17:31:39.502267')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:31:39 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin_ctrl@unb.br", "senha" => "Senha123"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/24/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms) Started POST “/admin/24/sincronizar_sigaa” for 127.0.0.1 at 2026-06-30 14:31:39 -0300 Processing by AdminController#sincronizar_sigaa as HTML

+ +
Parameters: {"acao" => "invalida", "arquivo_classes" => #<ActionDispatch::Http::UploadedFile:0x00000001269c8930 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-99457-z0o1id.json>, @content_type="application/json", @original_filename="class_members.json", @headers="content-disposition: form-data; name=\"arquivo_classes\"; filename=\"class_members.json\"\r\ncontent-type: application/json\r\ncontent-length: 16065\r\n">, "arquivo_membros" => #<ActionDispatch::Http::UploadedFile:0x00000001269c8890 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-99457-ju45m9.json>, @content_type="application/json", @original_filename="class_members.json", @headers="content-disposition: form-data; name=\"arquivo_membros\"; filename=\"class_members.json\"\r\ncontent-type: application/json\r\ncontent-length: 16065\r\n">, "admin_id" => "24"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 24 LIMIT 1
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 24 LIMIT 1
+ +

Redirected to www.example.com/admin/24/gerenciamento Completed 302 Found in 1ms (ActiveRecord: 0.6ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:31:39.698472', 'Ciência da Computação', '2026-06-30 17:31:39.698472')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '123' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:31:39.887756', NULL, NULL, NULL, 23, 'admin@unb.br', NULL, '123', 'Admin', NULL, NULL, '$2a$12$VDFwnaJCUErTETWe85ukKOys2zxwJu71FrzypJmiPL8iWJ3E9XFmO', 'Administrador', '2026-06-30 17:31:39.887756')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:31:39 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin@unb.br", "senha" => "Senha123"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/25/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms) Started POST “/admin/25/sincronizar_sigaa” for 127.0.0.1 at 2026-06-30 14:31:40 -0300 Processing by AdminController#sincronizar_sigaa as HTML

+ +
Parameters: {"acao" => "importar", "arquivo_classes" => #<ActionDispatch::Http::UploadedFile:0x00000001271c6470 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-99457-wkln4i.json>, @content_type="application/json", @original_filename="class_members.json", @headers="content-disposition: form-data; name=\"arquivo_classes\"; filename=\"class_members.json\"\r\ncontent-type: application/json\r\ncontent-length: 16065\r\n">, "arquivo_membros" => #<ActionDispatch::Http::UploadedFile:0x00000001271c6420 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-99457-4w6bv4.json>, @content_type="application/json", @original_filename="class_members.json", @headers="content-disposition: form-data; name=\"arquivo_membros\"; filename=\"class_members.json\"\r\ncontent-type: application/json\r\ncontent-length: 16065\r\n">, "admin_id" => "25"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 25 LIMIT 1
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 25 LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Load (0.4ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`codigo` = 'NAO_ESP' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_2
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'NAO_ESP' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('NAO_ESP', '2026-06-30 17:31:40.083044', 'Não especificado', '2026-06-30 17:31:40.083044')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_2
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_2
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+TRANSACTION (0.1ms)  ROLLBACK TO SAVEPOINT active_record_2
+TRANSACTION (0.2ms)  ROLLBACK TO SAVEPOINT active_record_1
+ +

Redirected to www.example.com/admin/25/gerenciamento Completed 302 Found in 5ms (ActiveRecord: 3.0ms (7 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:31:40.088598', 'Ciência da Computação', '2026-06-30 17:31:40.088598')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '123' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:31:40.277340', NULL, NULL, NULL, 25, 'admin@unb.br', NULL, '123', 'Admin', NULL, NULL, '$2a$12$sCI315K.y/lNYF3/TtyoVOf2kuG5bcsE3jIAPaYqy1OAYp1DSi7Ji', 'Administrador', '2026-06-30 17:31:40.277340')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Template Create (0.5ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:31:40.279020', 'Template Base', '2026-06-30 17:31:40.279020', 26)
+Elemento Create (0.3ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:31:40.279687', 'Questão 1', 1, 6, '2026-06-30 17:31:40.279687')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:31:40 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/26/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/admin/26/templates” for 127.0.0.1 at 2026-06-30 14:31:40 -0300 Processing by TemplatesController#index as HTML

+ +
Parameters: {"admin_id" => "26"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 26 LIMIT 1
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 26 LIMIT 1
+Rendering layout layouts/gerenciamento.html.erb
+Rendering templates/index.html.erb within layouts/gerenciamento
+Template Exists? (0.2ms)  SELECT 1 AS one FROM `templates` WHERE `templates`.`usuario_id` = 26 LIMIT 1
+Template Load (0.2ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`usuario_id` = 26
+Elemento Load (0.2ms)  SELECT `elementos`.* FROM `elementos` WHERE `elementos`.`template_id` = 6
+Campo Load (0.2ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` = 6
+Rendered templates/_grid.html.erb (Duration: 3.0ms | GC: 0.2ms)
+Rendered templates/index.html.erb within layouts/gerenciamento (Duration: 3.5ms | GC: 0.2ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 3.6ms | GC: 0.2ms)
+ +

Completed 200 OK in 6ms (Views: 3.0ms | ActiveRecord: 1.4ms (6 queries, 0 cached) | GC: 0.2ms)

+ +
TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:31:40.479319', 'Ciência da Computação', '2026-06-30 17:31:40.479319')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '123' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:31:40.667879', NULL, NULL, NULL, 26, 'admin@unb.br', NULL, '123', 'Admin', NULL, NULL, '$2a$12$eErMNxyCMLWf4Wu1KtDZ1.gzFVLtYZz5FRBGUhmrJgfPFk891DBuS', 'Administrador', '2026-06-30 17:31:40.667879')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Template Create (0.4ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:31:40.669489', 'Template Base', '2026-06-30 17:31:40.669489', 27)
+Elemento Create (0.2ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:31:40.670109', 'Questão 1', 1, 7, '2026-06-30 17:31:40.670109')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:31:40 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/27/avaliacoes Completed 302 Found in 193ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Template Count (0.3ms)  SELECT COUNT(*) FROM `templates`
+ +

Started POST “/admin/27/templates” for 127.0.0.1 at 2026-06-30 14:31:40 -0300 Processing by TemplatesController#create as HTML

+ +
Parameters: {"template" => {"nome" => "Avaliação Nova", "administrador_id" => "27", "elementos_attributes" => [{"enunciado" => "Questão 1", "ordem" => "1"}]}, "admin_id" => "27"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 27 LIMIT 1
+Administrador Load (0.1ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 27 LIMIT 1
+ +

Unpermitted parameter: :administrador_id. Context: { controller: TemplatesController, action: create, request: + +

CACHE Administrador Load (0.0ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 27 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Template Create (0.5ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:31:40.868320', 'Avaliação Nova', '2026-06-30 17:31:40.868320', 27)
+Elemento Create (0.2ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:31:40.869039', 'Questão 1', 1, 8, '2026-06-30 17:31:40.869039')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/admin/27/templates Completed 302 Found in 4ms (ActiveRecord: 1.4ms (5 queries, 1 cached) | GC: 0.0ms)

+ +
Template Count (0.2ms)  SELECT COUNT(*) FROM `templates`
+TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:31:40.872399', 'Ciência da Computação', '2026-06-30 17:31:40.872399')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '123' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:31:41.061820', NULL, NULL, NULL, 27, 'admin@unb.br', NULL, '123', 'Admin', NULL, NULL, '$2a$12$aHFy20WJdx.LOpZI6zqlGODvWYM5Wb2sLe.XSrFA0NIX2l4z/ZgP6', 'Administrador', '2026-06-30 17:31:41.061820')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Template Create (0.5ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:31:41.063583', 'Template Base', '2026-06-30 17:31:41.063583', 28)
+Elemento Create (0.2ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:31:41.064261', 'Questão 1', 1, 9, '2026-06-30 17:31:41.064261')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:31:41 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/28/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.1ms) Started PATCH “/admin/28/templates/9” for 127.0.0.1 at 2026-06-30 14:31:41 -0300 Processing by TemplatesController#update as HTML

+ +
Parameters: {"template" => {"nome" => "Nome Atualizado"}, "admin_id" => "28", "id" => "9"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 28 LIMIT 1
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 28 LIMIT 1
+Template Load (0.2ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`usuario_id` = 28 AND `templates`.`id` = 9 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Elemento Load (0.4ms)  SELECT `elementos`.* FROM `elementos` WHERE `elementos`.`template_id` = 9
+Campo Load (0.2ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` = 9
+Template Update (0.4ms)  UPDATE `templates` SET `templates`.`nome` = 'Nome Atualizado', `templates`.`updated_at` = '2026-06-30 17:31:41.258692' WHERE `templates`.`id` = 9
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/admin/28/templates Completed 302 Found in 5ms (ActiveRecord: 2.2ms (6 queries, 0 cached) | GC: 0.0ms)

+ +
Template Load (0.3ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`id` = 9 LIMIT 1
+TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:31:41.262939', 'Ciência da Computação', '2026-06-30 17:31:41.262939')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '123' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:31:41.454845', NULL, NULL, NULL, 28, 'admin@unb.br', NULL, '123', 'Admin', NULL, NULL, '$2a$12$/uxYTnDYn0Ur6h1mgtr8geWEGkLUrjl87tF0rYOjO5237ysynDjEi', 'Administrador', '2026-06-30 17:31:41.454845')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Template Create (0.4ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:31:41.456550', 'Template Base', '2026-06-30 17:31:41.456550', 29)
+Elemento Create (0.2ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:31:41.457180', 'Questão 1', 1, 10, '2026-06-30 17:31:41.457180')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:31:41 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/29/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Template Count (0.3ms)  SELECT COUNT(*) FROM `templates`
+ +

Started DELETE “/admin/29/templates/10” for 127.0.0.1 at 2026-06-30 14:31:41 -0300 Processing by TemplatesController#destroy as HTML

+ +
Parameters: {"admin_id" => "29", "id" => "10"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 29 LIMIT 1
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 29 LIMIT 1
+Template Load (0.2ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`usuario_id` = 29 AND `templates`.`id` = 10 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Elemento Load (0.4ms)  SELECT `elementos`.* FROM `elementos` WHERE `elementos`.`template_id` = 10
+Campo Load (0.2ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` = 10
+Elemento Destroy (0.3ms)  DELETE FROM `elementos` WHERE `elementos`.`id` = 10
+Template Destroy (0.2ms)  DELETE FROM `templates` WHERE `templates`.`id` = 10
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/admin/29/templates Completed 303 See Other in 4ms (ActiveRecord: 2.0ms (7 queries, 0 cached) | GC: 0.0ms)

+ +
Template Count (0.2ms)  SELECT COUNT(*) FROM `templates`
+TRANSACTION (0.7ms)  ROLLBACK
+ActiveRecord::InternalMetadata Load (0.3ms)  SELECT * FROM `ar_internal_metadata` WHERE `ar_internal_metadata`.`key` = 'schema_sha1' ORDER BY `ar_internal_metadata`.`key` ASC LIMIT 1
+ActiveRecord::SchemaMigration Load (0.2ms)  SELECT `schema_migrations`.`version` FROM `schema_migrations` ORDER BY `schema_migrations`.`version` ASC
+
dotenv
+
+

Saved a snapshot of ENV

+
+ +
TRANSACTION (0.2ms)  BEGIN
+Departamento Load (0.4ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.2ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:31:47.768448', 'Ciência da Computação', '2026-06-30 17:31:47.768448')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'admin123' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+TRANSACTION (1.2ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:31:47.787516', 'Ciência da Computação', '2026-06-30 17:31:47.787516')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'admin123' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+TRANSACTION (0.3ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'admin123' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:31:47.791718', 'Ciência da Computação', '2026-06-30 17:31:47.791718')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.3ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 31 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.2ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:31:47.796662', 31, 'Engenharia de Software', '2026-06-30 17:31:47.796662')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 9 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.2ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 9 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:31:47.801787', 9, NULL, 'TA', '2026.1', '2026-06-30 17:31:47.801787')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.5ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:31:47.806278', NULL, NULL, NULL, NULL, 10, '2026-06-30 17:31:47.806278')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.5ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:31:47.810825', NULL, 8, 1, NULL, '2026-06-30 17:31:47.810825')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:31:47.817020', 'Ciência da Computação', '2026-06-30 17:31:47.817020')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 32 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:31:47.818390', 32, 'Engenharia de Software', '2026-06-30 17:31:47.818390')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 10 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 10 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:31:47.819870', 10, NULL, 'TA', '2026.1', '2026-06-30 17:31:47.819870')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:31:47.820478', NULL, NULL, NULL, NULL, 11, '2026-06-30 17:31:47.820478')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.5ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:31:47.821391', NULL, 9, 1, NULL, '2026-06-30 17:31:47.821391')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`email` = 'admin_campo@unb.br' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Load (0.4ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_2
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:31:47.829969', 'Ciência da Computação', '2026-06-30 17:31:47.829969')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_2
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_campo' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin_campo@unb.br' LIMIT 1
+Administrador Create (0.8ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:31:48.019626', NULL, NULL, NULL, 33, 'admin_campo@unb.br', NULL, 'adm_campo', 'Admin Campo', NULL, NULL, '$2a$12$xXqpZuhDX1WvuhKzdq/TaOMkhGupJ/PV1aEuLKRHnAHmO1issGmg2', 'Administrador', '2026-06-30 17:31:48.019626')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Template Create (0.6ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:31:48.025351', 'Template', '2026-06-30 17:31:48.025351', 30)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Elemento Create (0.5ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:31:48.029896', 'Questão 1', 1, 11, '2026-06-30 17:31:48.029896')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Campo Exists? (0.3ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` = 11 LIMIT 1
+TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`email` = 'admin_campo@unb.br' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Load (0.4ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_2
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:31:48.037882', 'Ciência da Computação', '2026-06-30 17:31:48.037882')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_2
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_campo' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin_campo@unb.br' LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:31:48.226592', NULL, NULL, NULL, 34, 'admin_campo@unb.br', NULL, 'adm_campo', 'Admin Campo', NULL, NULL, '$2a$12$W.gcc7HjuFtxpAoBA3zxbuatk2dexw4Gp5.Qus7Biea.3sDbp.UiK', 'Administrador', '2026-06-30 17:31:48.226592')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Template Create (0.4ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:31:48.227796', 'Template', '2026-06-30 17:31:48.227796', 31)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Elemento Create (0.4ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:31:48.228658', 'Questão 1', 1, 12, '2026-06-30 17:31:48.228658')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Campo Exists? (0.3ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` IS NULL AND `campos`.`elemento_id` = 12 LIMIT 1
+TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`email` = 'admin_campo@unb.br' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_2
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:31:48.232504', 'Ciência da Computação', '2026-06-30 17:31:48.232504')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_2
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_campo' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin_campo@unb.br' LIMIT 1
+Administrador Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:31:48.421006', NULL, NULL, NULL, 35, 'admin_campo@unb.br', NULL, 'adm_campo', 'Admin Campo', NULL, NULL, '$2a$12$Nm0aKAzvlFB3HuZdIL/tqeXiXjM6eC/vjFfA1yW3H3SZ3yc70eDXu', 'Administrador', '2026-06-30 17:31:48.421006')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Template Create (0.4ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:31:48.422120', 'Template', '2026-06-30 17:31:48.422120', 32)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Elemento Create (0.4ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:31:48.422928', 'Questão 1', 1, 13, '2026-06-30 17:31:48.422928')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Campo Exists? (0.3ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` = 13 LIMIT 1
+TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Campo Exists? (0.2ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` IS NULL LIMIT 1
+TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`email` = 'admin_campo@unb.br' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_2
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:31:48.427962', 'Ciência da Computação', '2026-06-30 17:31:48.427962')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_2
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_campo' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin_campo@unb.br' LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:31:48.616394', NULL, NULL, NULL, 36, 'admin_campo@unb.br', NULL, 'adm_campo', 'Admin Campo', NULL, NULL, '$2a$12$tYbxNQlUCXkNJM/lBl8QFuSfgUYpPtgwW2GE4IsdlvKMm2cwvu3jW', 'Administrador', '2026-06-30 17:31:48.616394')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Template Create (0.4ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:31:48.617472', 'Template', '2026-06-30 17:31:48.617472', 33)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Elemento Create (0.4ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:31:48.618293', 'Questão 1', 1, 14, '2026-06-30 17:31:48.618293')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Campo Exists? (0.4ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` = 14 LIMIT 1
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:31:48.619636', 14, NULL, 1, 'Texto', '2026-06-30 17:31:48.619636')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Campo Exists? (0.2ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` = 14 LIMIT 1
+TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`email` = 'admin_campo@unb.br' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Load (0.4ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_2
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:31:48.623620', 'Ciência da Computação', '2026-06-30 17:31:48.623620')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_2
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_campo' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin_campo@unb.br' LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:31:48.812355', NULL, NULL, NULL, 37, 'admin_campo@unb.br', NULL, 'adm_campo', 'Admin Campo', NULL, NULL, '$2a$12$cCmmT5nUN7fk4JhedDz39eLKXZ1nDqipIKCrnHpf9N5pLI2LBpCxS', 'Administrador', '2026-06-30 17:31:48.812355')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Template Create (0.4ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:31:48.813558', 'Template', '2026-06-30 17:31:48.813558', 34)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Elemento Create (0.4ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:31:48.814376', 'Questão 1', 1, 15, '2026-06-30 17:31:48.814376')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Campo Exists? (0.4ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` = 15 LIMIT 1
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:31:48.815733', 15, NULL, 1, 'Texto', '2026-06-30 17:31:48.815733')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Campo Exists? (0.2ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 2 AND `campos`.`elemento_id` = 15 LIMIT 1
+TRANSACTION (0.9ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:31:48.819918', 'Ciência da Computação', '2026-06-30 17:31:48.819918')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Curso Exists? (0.2ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`codigo` = 'ESW' LIMIT 1
+TRANSACTION (0.3ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:31:48.826320', 'Ciência da Computação', '2026-06-30 17:31:48.826320')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Curso Exists? (0.2ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`codigo` = 'ESW' LIMIT 1
+TRANSACTION (0.3ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:31:48.828858', 'Ciência da Computação', '2026-06-30 17:31:48.828858')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Curso Exists? (0.2ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`codigo` IS NULL LIMIT 1
+TRANSACTION (0.3ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Curso Exists? (0.2ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`codigo` = 'ESW' LIMIT 1
+TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:31:48.832287', 'Ciência da Computação', '2026-06-30 17:31:48.832287')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Curso Exists? (0.3ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`codigo` = 'ESW' LIMIT 1
+Curso Create (0.2ms)  INSERT INTO `cursos` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('ESW', '2026-06-30 17:31:48.833292', 41, 'ES Original', '2026-06-30 17:31:48.833292')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Curso Exists? (0.2ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`codigo` = 'ESW' LIMIT 1
+TRANSACTION (0.3ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:31:48.835775', 'Ciência da Computação', '2026-06-30 17:31:48.835775')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Curso Exists? (0.3ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`codigo` = 'ESW' LIMIT 1
+Curso Create (0.2ms)  INSERT INTO `cursos` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('ESW', '2026-06-30 17:31:48.836717', 42, 'ES', '2026-06-30 17:31:48.836717')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Curso Exists? (0.2ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`codigo` = 'CC01' LIMIT 1
+TRANSACTION (0.3ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Exists? (0.2ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Exists? (0.2ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Exists? (0.2ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` IS NULL LIMIT 1
+TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:31:48.843062', 'CIC Original', '2026-06-30 17:31:48.843062')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Exists? (0.2ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.3ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:31:48.845124', 'CIC', '2026-06-30 17:31:48.845124')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Exists? (0.2ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'MAT' LIMIT 1
+TRANSACTION (0.3ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:31:48.849315', 'Ciência da Computação', '2026-06-30 17:31:48.849315')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Exists? (0.2ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+TRANSACTION (0.3ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:31:48.851662', 'Ciência da Computação', '2026-06-30 17:31:48.851662')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Exists? (0.2ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+TRANSACTION (0.3ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:31:48.854110', 'Ciência da Computação', '2026-06-30 17:31:48.854110')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Exists? (0.2ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` IS NULL LIMIT 1
+TRANSACTION (0.3ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Disciplina Exists? (0.2ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:31:48.857459', 'Ciência da Computação', '2026-06-30 17:31:48.857459')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:31:48.858414', 48, 'ES Original', '2026-06-30 17:31:48.858414')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Exists? (0.1ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+TRANSACTION (0.2ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.1ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.2ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.1ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:31:48.860593', 'Ciência da Computação', '2026-06-30 17:31:48.860593')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.2ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:31:48.861407', 49, 'ES', '2026-06-30 17:31:48.861407')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Exists? (0.1ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0098' LIMIT 1
+TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.1ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.2ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.1ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:31:48.864946', 'Ciência da Computação', '2026-06-30 17:31:48.864946')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.1ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 50 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.2ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:31:48.866068', 50, 'Engenharia de Software', '2026-06-30 17:31:48.866068')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 13 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.3ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 13 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:31:48.867383', 13, NULL, 'TA', '2026.1', '2026-06-30 17:31:48.867383')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.3ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:31:48.867914', NULL, NULL, NULL, NULL, 12, '2026-06-30 17:31:48.867914')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.3ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.1ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.2ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.1ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:31:48.869895', 'Ciência da Computação', '2026-06-30 17:31:48.869895')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.1ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 51 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.2ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:31:48.871007', 51, 'Engenharia de Software', '2026-06-30 17:31:48.871007')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 14 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.3ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 14 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:31:48.872212', 14, NULL, 'TA', '2026.1', '2026-06-30 17:31:48.872212')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.3ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:31:48.872729', NULL, NULL, NULL, NULL, 13, '2026-06-30 17:31:48.872729')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`email` = 'admin_elem@unb.br' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_2
+Departamento Exists? (0.2ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:31:48.877041', 'Ciência da Computação', '2026-06-30 17:31:48.877041')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_2
+Usuario Exists? (0.1ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_elem' LIMIT 1
+Usuario Exists? (0.1ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin_elem@unb.br' LIMIT 1
+Administrador Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:31:49.065145', NULL, NULL, NULL, 52, 'admin_elem@unb.br', NULL, 'adm_elem', 'Admin Elem', NULL, NULL, '$2a$12$0ISC/va5oto/ayMYb9c2ju0zgrgsZl2EQ74aRlMJzNH.LKhYZ1uy2', 'Administrador', '2026-06-30 17:31:49.065145')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Template Create (0.4ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:31:49.066042', 'Template Teste', '2026-06-30 17:31:49.066042', 35)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:31:49.070867', 'Ciência da Computação', '2026-06-30 17:31:49.070867')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 53 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:31:49.072142', 53, 'Engenharia de Software', '2026-06-30 17:31:49.072142')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 15 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.3ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 15 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:31:49.073559', 15, NULL, 'TA', '2026.1', '2026-06-30 17:31:49.073559')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.3ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:31:49.076322', 'Ciência da Computação', '2026-06-30 17:31:49.076322')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 54 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:31:49.077569', 54, 'Engenharia de Software', '2026-06-30 17:31:49.077569')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 16 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.3ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 16 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:31:49.078947', 16, NULL, 'TA', '2026.1', '2026-06-30 17:31:49.078947')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.3ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:31:49.081043', 'Ciência da Computação', '2026-06-30 17:31:49.081043')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 55 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:31:49.082343', 55, 'Engenharia de Software', '2026-06-30 17:31:49.082343')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 17 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.3ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 17 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:31:49.083726', 17, NULL, 'TA', '2026.1', '2026-06-30 17:31:49.083726')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.3ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:31:49.085884', 'Ciência da Computação', '2026-06-30 17:31:49.085884')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 56 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:31:49.087126', 56, 'Engenharia de Software', '2026-06-30 17:31:49.087126')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 18 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.3ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 18 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:31:49.088533', 18, NULL, 'TA', '2026.1', '2026-06-30 17:31:49.088533')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.3ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:31:49.089104', NULL, NULL, NULL, NULL, 17, '2026-06-30 17:31:49.089104')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Docente Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Docente' AND `usuarios`.`email` = 'doc_re@unb.br' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_re001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_re@unb.br' LIMIT 1
+Docente Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:31:49.280770', NULL, NULL, NULL, NULL, 'doc_re@unb.br', 'Doutorado', 'doc_re001', 'Docente RE', NULL, NULL, '$2a$12$HQ7gECXKPugKHfdM1Pt5cOGQqcRQiuQuaUdeGNrrKP1UZJmegVajm', 'Docente', '2026-06-30 17:31:49.280770')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+RespostaForm Exists? (0.5ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 36 AND `resposta_forms`.`formulario_id` = 12 LIMIT 1
+RespostaForm Create (0.3ms)  INSERT INTO `resposta_forms` (`created_at`, `data_submissao`, `formulario_id`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:31:49.286608', '2026-06-30', 12, '2026-06-30 17:31:49.286608', 36)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:31:49.287343', NULL, 12, 1, 'Texto', '2026-06-30 17:31:49.287343')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:31:49.293987', 'Ciência da Computação', '2026-06-30 17:31:49.293987')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 57 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:31:49.295331', 57, 'Engenharia de Software', '2026-06-30 17:31:49.295331')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 19 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 19 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:31:49.296785', 19, NULL, 'TA', '2026.1', '2026-06-30 17:31:49.296785')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:31:49.297377', NULL, NULL, NULL, NULL, 18, '2026-06-30 17:31:49.297377')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Docente Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Docente' AND `usuarios`.`email` = 'doc_re@unb.br' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_re001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_re@unb.br' LIMIT 1
+Docente Create (0.2ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:31:49.486330', NULL, NULL, NULL, NULL, 'doc_re@unb.br', 'Doutorado', 'doc_re001', 'Docente RE', NULL, NULL, '$2a$12$.v0Ffau5i15eR/xT6gqklujL2OSBB/sqcsATmGRxThjTNuNe..nO2', 'Docente', '2026-06-30 17:31:49.486330')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaForm Exists? (0.3ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 37 AND `resposta_forms`.`formulario_id` = 13 LIMIT 1
+RespostaForm Create (0.2ms)  INSERT INTO `resposta_forms` (`created_at`, `data_submissao`, `formulario_id`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:31:49.487521', '2026-06-30', 13, '2026-06-30 17:31:49.487521', 37)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:31:49.488192', NULL, 13, 1, 'Texto', '2026-06-30 17:31:49.488192')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:31:49.491215', 'Ciência da Computação', '2026-06-30 17:31:49.491215')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 58 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:31:49.492549', 58, 'Engenharia de Software', '2026-06-30 17:31:49.492549')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 20 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 20 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:31:49.493963', 20, NULL, 'TA', '2026.1', '2026-06-30 17:31:49.493963')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.3ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:31:49.494544', NULL, NULL, NULL, NULL, 19, '2026-06-30 17:31:49.494544')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:31:49.495259', NULL, 14, 1, 'Texto', '2026-06-30 17:31:49.495259')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:31:49.497604', 'Ciência da Computação', '2026-06-30 17:31:49.497604')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 59 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:31:49.498861', 59, 'Engenharia de Software', '2026-06-30 17:31:49.498861')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 21 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.3ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 21 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:31:49.500274', 21, NULL, 'TA', '2026.1', '2026-06-30 17:31:49.500274')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:31:49.500853', NULL, NULL, NULL, NULL, 20, '2026-06-30 17:31:49.500853')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Docente Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Docente' AND `usuarios`.`email` = 'doc_re@unb.br' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_re001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_re@unb.br' LIMIT 1
+Docente Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:31:49.689703', NULL, NULL, NULL, NULL, 'doc_re@unb.br', 'Doutorado', 'doc_re001', 'Docente RE', NULL, NULL, '$2a$12$vg84OxH.zSvNzDgr6oyWm.3Y4B7L6vo6eZL1QsCbmJT8W./ovAHqm', 'Docente', '2026-06-30 17:31:49.689703')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaForm Exists? (0.4ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 38 AND `resposta_forms`.`formulario_id` = 15 LIMIT 1
+RespostaForm Create (0.2ms)  INSERT INTO `resposta_forms` (`created_at`, `data_submissao`, `formulario_id`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:31:49.691036', '2026-06-30', 15, '2026-06-30 17:31:49.691036', 38)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (1.3ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:31:49.694416', 'Ciência da Computação', '2026-06-30 17:31:49.694416')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 60 LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.4ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:31:49.707706', 60, 'Engenharia de Software', '2026-06-30 17:31:49.707706')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 22 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 22 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:31:49.709340', 22, NULL, 'TA', '2026.1', '2026-06-30 17:31:49.709340')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:31:49.709948', NULL, NULL, NULL, NULL, 21, '2026-06-30 17:31:49.709948')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Docente Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Docente' AND `usuarios`.`email` = 'doc_re@unb.br' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_re001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_re@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:31:49.900852', NULL, NULL, NULL, NULL, 'doc_re@unb.br', 'Doutorado', 'doc_re001', 'Docente RE', NULL, NULL, '$2a$12$hFH7A98NFaFhx6H8FiyP0uOgWqKgttPb8vORYNVjU9hNk0w0sy9q6', 'Docente', '2026-06-30 17:31:49.900852')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaForm Exists? (0.5ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 39 AND `resposta_forms`.`formulario_id` = 16 LIMIT 1
+RespostaForm Create (0.3ms)  INSERT INTO `resposta_forms` (`created_at`, `data_submissao`, `formulario_id`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:31:49.902867', '2026-06-30', 16, '2026-06-30 17:31:49.902867', 39)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:31:49.903611', NULL, 16, 1, 'Texto', '2026-06-30 17:31:49.903611')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:31:49.909776', 'Ciência da Computação', '2026-06-30 17:31:49.909776')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 61 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.4ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:31:49.911207', 61, 'Engenharia de Software', '2026-06-30 17:31:49.911207')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 23 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 23 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:31:49.912741', 23, NULL, 'TA', '2026.1', '2026-06-30 17:31:49.912741')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:31:49.913357', NULL, NULL, NULL, NULL, 22, '2026-06-30 17:31:49.913357')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Docente Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Docente' AND `usuarios`.`email` = 'doc_rf@unb.br' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_rf001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_rf@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:31:50.103267', NULL, NULL, NULL, NULL, 'doc_rf@unb.br', 'Doutorado', 'doc_rf001', 'Docente RF', NULL, NULL, '$2a$12$O4gUfsPmN5xK8i.kVOeCCelRQ6yzLdPa6AEY/GgBKs1ZTUYMVi0rG', 'Docente', '2026-06-30 17:31:50.103267')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+RespostaForm Exists? (0.3ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 40 AND `resposta_forms`.`formulario_id` = 17 LIMIT 1
+TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:31:50.108104', 'Ciência da Computação', '2026-06-30 17:31:50.108104')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 62 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:31:50.109644', 62, 'Engenharia de Software', '2026-06-30 17:31:50.109644')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 24 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 24 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:31:50.111183', 24, NULL, 'TA', '2026.1', '2026-06-30 17:31:50.111183')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:31:50.111809', NULL, NULL, NULL, NULL, 23, '2026-06-30 17:31:50.111809')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Docente Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Docente' AND `usuarios`.`email` = 'doc_rf@unb.br' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_rf001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_rf@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:31:50.301823', NULL, NULL, NULL, NULL, 'doc_rf@unb.br', 'Doutorado', 'doc_rf001', 'Docente RF', NULL, NULL, '$2a$12$VcSnvgN/n.om55LmxTyfDeafJayLiVXf6YgeCer7pDhDHCbZfMXo.', 'Docente', '2026-06-30 17:31:50.301823')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+RespostaForm Exists? (0.3ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 41 AND `resposta_forms`.`formulario_id` = 18 LIMIT 1
+TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Docente Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Docente' AND `usuarios`.`email` = 'doc_rf@unb.br' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_rf001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_rf@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:31:50.494962', NULL, NULL, NULL, NULL, 'doc_rf@unb.br', 'Doutorado', 'doc_rf001', 'Docente RF', NULL, NULL, '$2a$12$qc/b1Gywd4wTLAIdJ.NNGusHBK6oFS.5H/zCgNLMDH9R0ALpHIiCW', 'Docente', '2026-06-30 17:31:50.494962')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+RespostaForm Exists? (0.2ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 42 AND `resposta_forms`.`formulario_id` IS NULL LIMIT 1
+TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:31:50.499456', 'Ciência da Computação', '2026-06-30 17:31:50.499456')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 63 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:31:50.501033', 63, 'Engenharia de Software', '2026-06-30 17:31:50.501033')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 25 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 25 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:31:50.502625', 25, NULL, 'TA', '2026.1', '2026-06-30 17:31:50.502625')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:31:50.503261', NULL, NULL, NULL, NULL, 24, '2026-06-30 17:31:50.503261')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+RespostaForm Exists? (0.2ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` IS NULL AND `resposta_forms`.`formulario_id` = 19 LIMIT 1
+TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:31:50.506143', 'Ciência da Computação', '2026-06-30 17:31:50.506143')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 64 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:31:50.507745', 64, 'Engenharia de Software', '2026-06-30 17:31:50.507745')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 26 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 26 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:31:50.509236', 26, NULL, 'TA', '2026.1', '2026-06-30 17:31:50.509236')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:31:50.509843', NULL, NULL, NULL, NULL, 25, '2026-06-30 17:31:50.509843')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Docente Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Docente' AND `usuarios`.`email` = 'doc_rf@unb.br' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_rf001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_rf@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:31:50.699029', NULL, NULL, NULL, NULL, 'doc_rf@unb.br', 'Doutorado', 'doc_rf001', 'Docente RF', NULL, NULL, '$2a$12$MnshFIm3jFnH9HPERdf/eeGvdqHJgpe6jv3DWftMgIY1vDUiIu1Ti', 'Docente', '2026-06-30 17:31:50.699029')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+RespostaForm Exists? (0.5ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 43 AND `resposta_forms`.`formulario_id` = 20 LIMIT 1
+RespostaForm Create (0.3ms)  INSERT INTO `resposta_forms` (`created_at`, `data_submissao`, `formulario_id`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:31:50.700803', '2026-06-30', 20, '2026-06-30 17:31:50.700803', 43)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+RespostaForm Exists? (0.3ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 43 AND `resposta_forms`.`formulario_id` = 20 LIMIT 1
+TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Docente Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Docente' AND `usuarios`.`email` = 'doc2_rf@unb.br' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc2_rf' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc2_rf@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:31:50.892755', NULL, NULL, NULL, NULL, 'doc2_rf@unb.br', 'Mestrado', 'doc2_rf', 'Docente 2', NULL, NULL, '$2a$12$sOIhbicRn8sE2lNqDWos.eGUDPWUO.GbumXSzs.O9XZQGTjYU6RuS', 'Docente', '2026-06-30 17:31:50.892755')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:31:50.895145', 'Ciência da Computação', '2026-06-30 17:31:50.895145')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 65 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:31:50.896932', 65, 'Engenharia de Software', '2026-06-30 17:31:50.896932')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 27 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 27 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:31:50.898519', 27, NULL, 'TA', '2026.1', '2026-06-30 17:31:50.898519')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:31:50.899164', NULL, NULL, NULL, NULL, 26, '2026-06-30 17:31:50.899164')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Docente Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Docente' AND `usuarios`.`email` = 'doc_rf@unb.br' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_rf001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_rf@unb.br' LIMIT 1
+Docente Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:31:51.088372', NULL, NULL, NULL, NULL, 'doc_rf@unb.br', 'Doutorado', 'doc_rf001', 'Docente RF', NULL, NULL, '$2a$12$BVwdwnuBszMOAExr7hq8buvMnVeibJaDau5O0VUQ5mcrW.Wf7H/ZS', 'Docente', '2026-06-30 17:31:51.088372')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaForm Exists? (0.4ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 45 AND `resposta_forms`.`formulario_id` = 21 LIMIT 1
+RespostaForm Create (0.3ms)  INSERT INTO `resposta_forms` (`created_at`, `data_submissao`, `formulario_id`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:31:51.089901', '2026-06-30', 21, '2026-06-30 17:31:51.089901', 45)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+RespostaForm Exists? (0.2ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 44 AND `resposta_forms`.`formulario_id` = 21 LIMIT 1
+TRANSACTION (0.9ms)  ROLLBACK
+TRANSACTION (0.2ms)  BEGIN
+TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`email` = 'admin_template@unb.br' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_2
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:31:51.096214', 'Ciência da Computação', '2026-06-30 17:31:51.096214')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_2
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '78910' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin_template@unb.br' LIMIT 1
+Administrador Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:31:51.284838', NULL, NULL, NULL, 66, 'admin_template@unb.br', NULL, '78910', 'Admin Template', NULL, NULL, '$2a$12$ij2J8VDSLF8CxJbfqu0J7OKv8yjU8OgjwGgyo13qhOE7LUwbgJepy', 'Administrador', '2026-06-30 17:31:51.284838')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`email` = 'admin_template@unb.br' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Load (0.4ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_2
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:31:51.292405', 'Ciência da Computação', '2026-06-30 17:31:51.292405')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_2
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '78910' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin_template@unb.br' LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:31:51.481188', NULL, NULL, NULL, 67, 'admin_template@unb.br', NULL, '78910', 'Admin Template', NULL, NULL, '$2a$12$FifLl50y32BFSsrOzxVuwOB0gVQI6LFLBJJlVxaXM2zNq6L.XokNS', 'Administrador', '2026-06-30 17:31:51.481188')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.6ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`email` = 'admin_template@unb.br' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_2
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:31:51.485746', 'Ciência da Computação', '2026-06-30 17:31:51.485746')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_2
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '78910' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin_template@unb.br' LIMIT 1
+Administrador Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:31:51.673956', NULL, NULL, NULL, 68, 'admin_template@unb.br', NULL, '78910', 'Admin Template', NULL, NULL, '$2a$12$O.CUDMuAR/XNFoAtnRkM..u3YtgR10g.0qjqOhA25nx5DfHstUIda', 'Administrador', '2026-06-30 17:31:51.673956')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.9ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`email` = 'admin_template@unb.br' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Load (0.4ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_2
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:31:51.678505', 'Ciência da Computação', '2026-06-30 17:31:51.678505')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_2
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '78910' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin_template@unb.br' LIMIT 1
+Administrador Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:31:51.872028', NULL, NULL, NULL, 69, 'admin_template@unb.br', NULL, '78910', 'Admin Template', NULL, NULL, '$2a$12$p94eEqXge6HyvyUdNOyV.OlZ1K3PB2XrGIgzJQUQmsEd1nQN6.HeG', 'Administrador', '2026-06-30 17:31:51.872028')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`email` = 'admin_template@unb.br' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Load (0.4ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_2
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:31:51.878250', 'Ciência da Computação', '2026-06-30 17:31:51.878250')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_2
+Usuario Exists? (0.1ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '78910' LIMIT 1
+Usuario Exists? (0.1ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin_template@unb.br' LIMIT 1
+Administrador Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:31:52.066495', NULL, NULL, NULL, 70, 'admin_template@unb.br', NULL, '78910', 'Admin Template', NULL, NULL, '$2a$12$NT0ZrZErevYI.jH5CLc5uewuggZ.2gkYG4puTr0JJSPFf9LlYVR9G', 'Administrador', '2026-06-30 17:31:52.066495')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Campo Exists? (0.2ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` IS NULL LIMIT 1
+TRANSACTION (1.3ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:31:52.071288', 'Ciência da Computação', '2026-06-30 17:31:52.071288')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 71 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:31:52.072728', 71, 'Engenharia de Software', '2026-06-30 17:31:52.072728')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Exists? (0.2ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 28 LIMIT 1
+TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:31:52.075677', 'Ciência da Computação', '2026-06-30 17:31:52.075677')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 72 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.3ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:31:52.077054', 72, 'Engenharia de Software', '2026-06-30 17:31:52.077054')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Exists? (0.3ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` IS NULL AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 29 LIMIT 1
+TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:31:52.080236', 'Ciência da Computação', '2026-06-30 17:31:52.080236')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 73 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:31:52.081689', 73, 'Engenharia de Software', '2026-06-30 17:31:52.081689')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Exists? (0.3ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` IS NULL AND `turmas`.`disciplina_id` = 30 LIMIT 1
+TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Turma Exists? (0.2ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` IS NULL LIMIT 1
+TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:31:52.085749', 'Ciência da Computação', '2026-06-30 17:31:52.085749')
+TRANSACTION (0.3ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 74 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:31:52.087368', 74, 'Engenharia de Software', '2026-06-30 17:31:52.087368')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.3ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 31 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:31:52.088380', 31, NULL, 'TA', '2026.1', '2026-06-30 17:31:52.088380')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Exists? (0.3ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 31 LIMIT 1
+TRANSACTION (0.3ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.1ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.2ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.1ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:31:52.090748', 'Ciência da Computação', '2026-06-30 17:31:52.090748')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.1ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 75 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.5ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:31:52.091866', 75, 'Engenharia de Software', '2026-06-30 17:31:52.091866')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 32 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:31:52.093235', 32, NULL, 'TA', '2026.1', '2026-06-30 17:31:52.093235')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Exists? (0.2ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.2' AND `turmas`.`disciplina_id` = 32 LIMIT 1
+TRANSACTION (0.2ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.1ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.2ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.1ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:31:52.095294', 'Ciência da Computação', '2026-06-30 17:31:52.095294')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.1ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 76 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.2ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.1ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:31:52.096264', 76, 'Engenharia de Software', '2026-06-30 17:31:52.096264')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.2ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 33 LIMIT 1
+Turma Create (0.1ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:31:52.097062', 33, NULL, 'TA', '2026.1', '2026-06-30 17:31:52.097062')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Exists? (0.2ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TB' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 33 LIMIT 1
+TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Usuario Exists? (0.1ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` IS NULL LIMIT 1
+Usuario Exists? (0.1ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Usuario Exists? (0.1ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.1ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` IS NULL LIMIT 1
+TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.1ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:31:52.293761', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Professor Teste', NULL, NULL, '$2a$12$vGXxtix7hVIYj44mDylwyuJng55GmSP3a/6kMAZv7gHyFXYWrLIue', 'Docente', '2026-06-30 17:31:52.293761')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'outro@unb.br' LIMIT 1
+TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:31:52.484929', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Professor Teste', NULL, NULL, '$2a$12$2GE7jErTe.BdCbLUrYyJ6OFvtJIy5cuDdDTMgE25vgHD6snOKqj3C', 'Docente', '2026-06-30 17:31:52.484929')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc002' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Docente Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:31:52.679714', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Professor Teste', NULL, NULL, '$2a$12$/n/y6Vyp1WryYawVJeVjWe55/p4VGpUSUln7bbUL8HJHfwzzOMXtS', 'Docente', '2026-06-30 17:31:52.679714')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.6ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:31:52.870735', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Professor Teste', NULL, NULL, '$2a$12$NWkD3Yiw2aS0WZA/jTLvyO1DWL01aIQzlFUYp.rTwqP8Dujc9MZjG', 'Docente', '2026-06-30 17:31:52.870735')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (1.0ms)  ROLLBACK
+TRANSACTION (0.2ms)  BEGIN
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.5ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Docente Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:31:53.251264', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Professor Teste', NULL, NULL, '$2a$12$lo4vR.t6SeliA0LW24ZgK.PBWXucpkgbXh/CdkvV3Z4ZUa5G56rfW', 'Docente', '2026-06-30 17:31:53.251264')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.2ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.5ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:31:53.630767', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Professor Teste', NULL, NULL, '$2a$12$yXx/1/4rVV6gODq.nSZG7.N7ixDlxPQzODm4R.Rs8xQD0ziB7qir2', 'Docente', '2026-06-30 17:31:53.630767')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:31:53.822686', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Professor Teste', NULL, NULL, '$2a$12$OtI.QQd97.bxG8YE2nqB1uuyEjRVKFewRg3C/ZYo1KezXx6tBtDiC', 'Docente', '2026-06-30 17:31:53.822686')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' AND `usuarios`.`id` != 57 LIMIT 1
+Docente Update (0.6ms)  UPDATE `usuarios` SET `usuarios`.`definicao_senha_sent_at` = '2026-06-30 17:31:53.824012', `usuarios`.`definicao_senha_token` = 'uGEJjtsxNePLIv6q1dVFMwygFaoiYv6ek8uVUIWgCAM', `usuarios`.`senha_hash` = '$2a$12$3Z7VkQThDtGmituGZrZfs.2Rmpy9hNWWz.uzl4DlSQSQLLE3TZWUq', `usuarios`.`updated_at` = '2026-06-30 17:31:54.014619' WHERE `usuarios`.`id` = 57
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Docente Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:31:54.205719', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Professor Teste', NULL, NULL, '$2a$12$.jjPBqQvuH19qvlpZfOLAO9VHeubjFPu4CMRorbCg0STvlf4p.utW', 'Docente', '2026-06-30 17:31:54.205719')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' AND `usuarios`.`id` != 58 LIMIT 1
+Docente Update (0.6ms)  UPDATE `usuarios` SET `usuarios`.`definicao_senha_sent_at` = '2026-06-30 17:31:54.206598', `usuarios`.`definicao_senha_token` = '8ndx3lQUXn6c0Sxjk-QXsMBVeyl7wxaYOvXVyKmlFVE', `usuarios`.`senha_hash` = '$2a$12$7mNk60NjUp1QfdnvpVEJ0ejWnodumNG1z3FX4dkuzLnsREjvNifJi', `usuarios`.`updated_at` = '2026-06-30 17:31:54.394704' WHERE `usuarios`.`id` = 58
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.9ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:31:54.585851', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Professor Teste', NULL, NULL, '$2a$12$fykDAfDd5x2uorF0Y2er2eYFfSN8C/DzhNDWf.DIb6Ylp2IzOlHq.', 'Docente', '2026-06-30 17:31:54.585851')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.5ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' AND `usuarios`.`id` != 59 LIMIT 1
+Docente Update (0.7ms)  UPDATE `usuarios` SET `usuarios`.`definicao_senha_sent_at` = '2026-06-30 17:31:54.586891', `usuarios`.`definicao_senha_token` = 'ZPTvY6UEN870fVNV8b7NRfUYTAYoj_99R8k5i291axg', `usuarios`.`senha_hash` = '$2a$12$o95HhI5mpWd5bpuDKJoEe.L/ncDP5jAFOPI4MJdgkZhLvRZuGbzPS', `usuarios`.`updated_at` = '2026-06-30 17:31:54.775262' WHERE `usuarios`.`id` = 59
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.5ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' AND `usuarios`.`id` != 59 LIMIT 1
+Docente Update (0.8ms)  UPDATE `usuarios` SET `usuarios`.`definicao_senha_sent_at` = NULL, `usuarios`.`definicao_senha_token` = NULL, `usuarios`.`senha_hash` = '$2a$12$uZC2lw.iU7BDEymB4xetS.gtglf8H.F5xW42GxgqCL3HJObvTssh2', `usuarios`.`updated_at` = '2026-06-30 17:31:54.964947' WHERE `usuarios`.`id` = 59
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.9ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Docente Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:31:55.156387', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Professor Teste', NULL, NULL, '$2a$12$3iWT7nJNcx0LLG85r/Q3jeYfBshXx5gFKzwgLRbFUHBvxDPsSdo7W', 'Docente', '2026-06-30 17:31:55.156387')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.6ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' AND `usuarios`.`id` != 60 LIMIT 1
+Docente Update (0.8ms)  UPDATE `usuarios` SET `usuarios`.`definicao_senha_sent_at` = '2026-06-30 17:31:55.157386', `usuarios`.`definicao_senha_token` = 'vn1Lb3O2dbjPFZWtWOx206EHxDHFMi-0UEMDicXbpjM', `usuarios`.`senha_hash` = '$2a$12$PkN9rtueSsNWTdLsVfFfbOcMWHHGV1q89WVIVuGpUcILcX0YlEIGa', `usuarios`.`updated_at` = '2026-06-30 17:31:55.345650' WHERE `usuarios`.`id` = 60
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.5ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' AND `usuarios`.`id` != 60 LIMIT 1
+Docente Update (0.5ms)  UPDATE `usuarios` SET `usuarios`.`definicao_senha_sent_at` = NULL, `usuarios`.`definicao_senha_token` = NULL, `usuarios`.`senha_hash` = '$2a$12$gZbev67HEZxh1JAgnx1g7eawbVReX003jhSqB/8.5xfwUreqqTpIm', `usuarios`.`updated_at` = '2026-06-30 17:31:55.534891' WHERE `usuarios`.`id` = 60
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Docente Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:31:55.725814', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Professor Teste', NULL, NULL, '$2a$12$.4mizc5xvS7sgY.LHecizeuItKeresn6s7FY3XdFvyFzcQyeu79NC', 'Docente', '2026-06-30 17:31:55.725814')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.6ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' AND `usuarios`.`id` != 61 LIMIT 1
+Docente Update (0.6ms)  UPDATE `usuarios` SET `usuarios`.`redefinicao_senha_sent_at` = '2026-06-30 17:31:55.727087', `usuarios`.`redefinicao_senha_token` = 'M1aF5iNUgROWRn4F4eh-KH84KpG9LdifKESowYwKUCY', `usuarios`.`senha_hash` = '$2a$12$VmI8LT8BsrF6xxMtgC216.MqKRRzF8HUTQGs1xgb81/KVUbGvaoxi', `usuarios`.`updated_at` = '2026-06-30 17:31:55.915767' WHERE `usuarios`.`id` = 61
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (1.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:31:56.107437', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Professor Teste', NULL, NULL, '$2a$12$lK/BcBd1n8o61uh1OMgGhOEuryqrc.9KXMtDWLh1gGTD7xRFOT4Pu', 'Docente', '2026-06-30 17:31:56.107437')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.5ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' AND `usuarios`.`id` != 62 LIMIT 1
+Docente Update (0.6ms)  UPDATE `usuarios` SET `usuarios`.`redefinicao_senha_sent_at` = '2026-06-30 17:31:56.108462', `usuarios`.`redefinicao_senha_token` = '2L77f3Nnns9QEBwUu_u-YrU17lZIs3mrL9zsHTKBxmg', `usuarios`.`senha_hash` = '$2a$12$0AcdX1vuQaBdRViAESdRju15r6JzEeV5cfxXxU7f.GAvOCNXhvuWK', `usuarios`.`updated_at` = '2026-06-30 17:31:56.296685' WHERE `usuarios`.`id` = 62
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:31:56.487560', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Professor Teste', NULL, NULL, '$2a$12$/hgDQ/VrVDAnivPwIpzT5ebAPHjGrd12MTr29i0jdGoK2vakts1zu', 'Docente', '2026-06-30 17:31:56.487560')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.6ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' AND `usuarios`.`id` != 63 LIMIT 1
+Docente Update (0.6ms)  UPDATE `usuarios` SET `usuarios`.`redefinicao_senha_sent_at` = '2026-06-30 17:31:56.488630', `usuarios`.`redefinicao_senha_token` = 'kkSBag_CFm2N1KUViKVcZc_o-iYmGuY2S5TZwvemLHs', `usuarios`.`senha_hash` = '$2a$12$iE2/uXiYGdArajSZ05YYB.feUfGqMItso2H7AiPob5wKGgAYHfnEG', `usuarios`.`updated_at` = '2026-06-30 17:31:56.676593' WHERE `usuarios`.`id` = 63
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.5ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' AND `usuarios`.`id` != 63 LIMIT 1
+Docente Update (0.8ms)  UPDATE `usuarios` SET `usuarios`.`redefinicao_senha_sent_at` = NULL, `usuarios`.`redefinicao_senha_token` = NULL, `usuarios`.`senha_hash` = '$2a$12$sTapSHjGFke3uKz3Zaz0o.8z/AIcOuHq9.Y5ekKA0F60VxHqZJSm2', `usuarios`.`updated_at` = '2026-06-30 17:31:56.866388' WHERE `usuarios`.`id` = 63
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:31:57.057437', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Professor Teste', NULL, NULL, '$2a$12$vdUNrZiFnnK9VX505HHWe.gKl/kv23ZG2VL3Y7eGordae4pNJxvNK', 'Docente', '2026-06-30 17:31:57.057437')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.5ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' AND `usuarios`.`id` != 64 LIMIT 1
+Docente Update (0.7ms)  UPDATE `usuarios` SET `usuarios`.`redefinicao_senha_sent_at` = '2026-06-30 17:31:57.058612', `usuarios`.`redefinicao_senha_token` = 'anU3eBkUtmgkbzFFwQtklVemX-Wz9AD2frdphQRd7PE', `usuarios`.`senha_hash` = '$2a$12$./AXlzQ7o903XTVqUVFJheSK1iescbRhivQP4zlsZHfjzCe3tW8J.', `usuarios`.`updated_at` = '2026-06-30 17:31:57.246995' WHERE `usuarios`.`id` = 64
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.5ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' AND `usuarios`.`id` != 64 LIMIT 1
+Docente Update (0.9ms)  UPDATE `usuarios` SET `usuarios`.`redefinicao_senha_sent_at` = NULL, `usuarios`.`redefinicao_senha_token` = NULL, `usuarios`.`senha_hash` = '$2a$12$JN8T9xGELkKKeio.JiO3SOjtHUoVxA.Kwk8k4B0SFGkK44nx91aLy', `usuarios`.`updated_at` = '2026-06-30 17:31:57.436509' WHERE `usuarios`.`id` = 64
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (1.1ms)  ROLLBACK
+TRANSACTION (0.2ms)  BEGIN
+Departamento Load (0.5ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:31:57.441692', 'Ciência da Computação', '2026-06-30 17:31:57.441692')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_admin' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+Administrador Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:31:57.630347', NULL, NULL, NULL, 77, 'admin_ctrl@unb.br', NULL, 'adm_admin', 'Admin Teste', NULL, NULL, '$2a$12$hgvEDpSpNMTYZk1nioI.SeBbdSRE.o9XpwI/HKHNMU4b/KpkJd9gS', 'Administrador', '2026-06-30 17:31:57.630347')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:31:57 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin_ctrl@unb.br", "senha" => "Senha123"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/65/avaliacoes Completed 302 Found in 194ms (ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/admin/65/avaliacoes” for 127.0.0.1 at 2026-06-30 14:31:57 -0300 Processing by AdminController#avaliacoes as HTML

+ +
Parameters: {"admin_id" => "65"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 65 LIMIT 1
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 65 LIMIT 1
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/avaliacoes.html.erb within layouts/gerenciamento
+Formulario Load (0.2ms)  SELECT `formularios`.* FROM `formularios` INNER JOIN `turmas` ON `turmas`.`id` = `formularios`.`turma_id`
+Rendered admin/avaliacoes.html.erb within layouts/gerenciamento (Duration: 3.5ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 6.0ms | GC: 0.0ms)
+ +

Completed 200 OK in 13ms (Views: 7.6ms | ActiveRecord: 0.8ms (3 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:31:57.873167', 'Ciência da Computação', '2026-06-30 17:31:57.873167')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_admin' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+Administrador Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:31:58.062051', NULL, NULL, NULL, 78, 'admin_ctrl@unb.br', NULL, 'adm_admin', 'Admin Teste', NULL, NULL, '$2a$12$0DmUIy0QXO5rhYZ3qv5Ie.DO.xeO3HBq37fwAA1E/E0NK5ssQJw2K', 'Administrador', '2026-06-30 17:31:58.062051')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:31:58 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin_ctrl@unb.br", "senha" => "Senha123"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/66/avaliacoes Completed 302 Found in 199ms (ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 10.3ms) Started GET “/admin/66/gerenciamento” for 127.0.0.1 at 2026-06-30 14:31:58 -0300 Processing by AdminController#gerenciamento as HTML

+ +
Parameters: {"admin_id" => "66"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 66 LIMIT 1
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 66 LIMIT 1
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/gerenciamento.html.erb within layouts/gerenciamento
+Rendered admin/gerenciamento.html.erb within layouts/gerenciamento (Duration: 0.3ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 0.5ms | GC: 0.0ms)
+ +

Completed 200 OK in 3ms (Views: 0.6ms | ActiveRecord: 0.7ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:31:58.269216', 'Ciência da Computação', '2026-06-30 17:31:58.269216')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_admin' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:31:58.458018', NULL, NULL, NULL, 79, 'admin_ctrl@unb.br', NULL, 'adm_admin', 'Admin Teste', NULL, NULL, '$2a$12$OW5V8RlUkjm/Wqd78C//bOuAhoRyo0Ddx/YKMrhsqFlaH/qtmNaJG', 'Administrador', '2026-06-30 17:31:58.458018')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:31:58 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin_ctrl@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/67/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_outro' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'outro_admin@unb.br' LIMIT 1
+Administrador Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:31:58.837205', NULL, NULL, NULL, 79, 'outro_admin@unb.br', NULL, 'adm_outro', 'Outro Admin', NULL, NULL, '$2a$12$17Ur9It3KndaVKscLerqdu332.CwLAnNa8i4PfdPSU2hiy.ayWGJi', 'Administrador', '2026-06-30 17:31:58.837205')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/admin/68/gerenciamento” for 127.0.0.1 at 2026-06-30 14:31:58 -0300 Processing by AdminController#gerenciamento as HTML

+ +
Parameters: {"admin_id" => "68"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 67 LIMIT 1
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 68 LIMIT 1
+ +

Redirected to www.example.com/inicio Filter chain halted as :set_admin rendered or redirected Completed 302 Found in 2ms (ActiveRecord: 0.6ms (2 queries, 0 cached) | GC: 0.3ms)

+ +
TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:31:58.843824', 'Ciência da Computação', '2026-06-30 17:31:58.843824')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_admin' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:31:59.033136', NULL, NULL, NULL, 80, 'admin_ctrl@unb.br', NULL, 'adm_admin', 'Admin Teste', NULL, NULL, '$2a$12$yr8VG6MtwTtAyB3WB8ygMOHhEzF3HGAGH650uadWeKmd6VMHZPQT.', 'Administrador', '2026-06-30 17:31:59.033136')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:31:59 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin_ctrl@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/69/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/admin/69/enviar_formularios” for 127.0.0.1 at 2026-06-30 14:31:59 -0300 Processing by AdminController#enviar_formularios as HTML

+ +
Parameters: {"admin_id" => "69"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 69 LIMIT 1
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 69 LIMIT 1
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/enviar_formularios.html.erb within layouts/gerenciamento
+Template Load (0.3ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`usuario_id` = 69
+Turma Eager Load (0.4ms)  SELECT `turmas`.`id` AS t0_r0, `turmas`.`created_at` AS t0_r1, `turmas`.`disciplina_id` AS t0_r2, `turmas`.`horario` AS t0_r3, `turmas`.`numero_da_turma` AS t0_r4, `turmas`.`semestre` AS t0_r5, `turmas`.`updated_at` AS t0_r6, `disciplinas`.`id` AS t1_r0, `disciplinas`.`codigo` AS t1_r1, `disciplinas`.`created_at` AS t1_r2, `disciplinas`.`departamento_id` AS t1_r3, `disciplinas`.`nome` AS t1_r4, `disciplinas`.`updated_at` AS t1_r5 FROM `turmas` INNER JOIN `disciplinas` ON `disciplinas`.`id` = `turmas`.`disciplina_id` ORDER BY disciplinas.nome, turmas.semestre
+Rendered admin/enviar_formularios.html.erb within layouts/gerenciamento (Duration: 1.7ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 1.9ms | GC: 0.0ms)
+ +

Completed 200 OK in 5ms (Views: 1.4ms | ActiveRecord: 1.4ms (4 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:31:59.232094', 'Ciência da Computação', '2026-06-30 17:31:59.232094')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_admin' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+Administrador Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:31:59.421595', NULL, NULL, NULL, 81, 'admin_ctrl@unb.br', NULL, 'adm_admin', 'Admin Teste', NULL, NULL, '$2a$12$gmhKwoQe1HYb/T0KsLmBwucdsw3xq3GEwJvUyNj5YG83rEK4dcJ.y', 'Administrador', '2026-06-30 17:31:59.421595')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:31:59 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin_ctrl@unb.br", "senha" => "Senha123"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/70/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Disciplina Load (0.3ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'ES' AND `disciplinas`.`codigo` = 'CIC001A' AND `disciplinas`.`departamento_id` = 81 LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.4ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC001A' LIMIT 1
+Disciplina Create (0.3ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC001A', '2026-06-30 17:31:59.613846', 81, 'ES', '2026-06-30 17:31:59.613846')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 34 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 34 LIMIT 1
+Turma Create (0.3ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:31:59.616105', 34, NULL, 'TA', '2026.1', '2026-06-30 17:31:59.616105')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Administrador Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 70 LIMIT 1
+Template Create (0.3ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:31:59.618333', 'Template Ctrl', '2026-06-30 17:31:59.618333', 70)
+Elemento Create (0.2ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:31:59.618783', 'Questão 1', 1, 17, '2026-06-30 17:31:59.618783')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/admin/70/enviar_formularios” for 127.0.0.1 at 2026-06-30 14:31:59 -0300 Processing by AdminController#enviar_formularios as HTML

+ +
Parameters: {"template_id" => nil, "turma_ids" => ["30"], "admin_id" => "70"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 70 LIMIT 1
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 70 LIMIT 1
+ +

Redirected to www.example.com/admin/70/enviar_formularios Completed 302 Found in 1ms (ActiveRecord: 0.5ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:31:59.623535', 'Ciência da Computação', '2026-06-30 17:31:59.623535')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_admin' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+Administrador Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:31:59.812595', NULL, NULL, NULL, 82, 'admin_ctrl@unb.br', NULL, 'adm_admin', 'Admin Teste', NULL, NULL, '$2a$12$aUz8FQVoJSHC6h2DcOBBvugi5UCLHYKfQCbngvDYrpqznstDJhcDi', 'Administrador', '2026-06-30 17:31:59.812595')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:31:59 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin_ctrl@unb.br", "senha" => "Senha123"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/71/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Disciplina Load (0.4ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'ES' AND `disciplinas`.`codigo` = 'CIC001A' AND `disciplinas`.`departamento_id` = 82 LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.4ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC001A' LIMIT 1
+Disciplina Create (0.3ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC001A', '2026-06-30 17:32:00.005720', 82, 'ES', '2026-06-30 17:32:00.005720')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 35 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 35 LIMIT 1
+Turma Create (0.3ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:32:00.007816', 35, NULL, 'TA', '2026.1', '2026-06-30 17:32:00.007816')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Administrador Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 71 LIMIT 1
+Template Create (0.2ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:32:00.009675', 'Template Ctrl', '2026-06-30 17:32:00.009675', 71)
+Elemento Create (0.2ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:32:00.010072', 'Questão 1', 1, 18, '2026-06-30 17:32:00.010072')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/admin/71/enviar_formularios” for 127.0.0.1 at 2026-06-30 14:32:00 -0300 Processing by AdminController#enviar_formularios as HTML

+ +
Parameters: {"template_id" => "18", "turma_ids" => nil, "admin_id" => "71"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 71 LIMIT 1
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 71 LIMIT 1
+ +

Redirected to www.example.com/admin/71/enviar_formularios Completed 302 Found in 1ms (ActiveRecord: 0.4ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:00.014360', 'Ciência da Computação', '2026-06-30 17:32:00.014360')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_admin' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+Administrador Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:00.203161', NULL, NULL, NULL, 83, 'admin_ctrl@unb.br', NULL, 'adm_admin', 'Admin Teste', NULL, NULL, '$2a$12$8H1yQubjMaQI9eUqTXmu2eAJYi7aoImZ58U.OWrlMBwoD2UdvlEv.', 'Administrador', '2026-06-30 17:32:00.203161')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:00 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin_ctrl@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/72/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Disciplina Load (0.3ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'ES' AND `disciplinas`.`codigo` = 'CIC001A' AND `disciplinas`.`departamento_id` = 83 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.4ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC001A' LIMIT 1
+Disciplina Create (0.3ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC001A', '2026-06-30 17:32:00.395066', 83, 'ES', '2026-06-30 17:32:00.395066')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 36 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 36 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:32:00.396974', 36, NULL, 'TA', '2026.1', '2026-06-30 17:32:00.396974')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Administrador Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 72 LIMIT 1
+Template Create (0.2ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:32:00.398826', 'Template Ctrl', '2026-06-30 17:32:00.398826', 72)
+Elemento Create (0.2ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:32:00.399236', 'Questão 1', 1, 19, '2026-06-30 17:32:00.399236')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Formulario Count (0.2ms)  SELECT COUNT(*) FROM `formularios`
+ +

Started POST “/admin/72/enviar_formularios” for 127.0.0.1 at 2026-06-30 14:32:00 -0300 Processing by AdminController#enviar_formularios as HTML

+ +
Parameters: {"template_id" => "19", "turma_ids" => ["32"], "admin_id" => "72"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 72 LIMIT 1
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 72 LIMIT 1
+Template Load (0.2ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`id` = 19 LIMIT 1
+Elemento Load (0.2ms)  SELECT `elementos`.* FROM `elementos` WHERE `elementos`.`template_id` = 19
+Campo Load (0.1ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` = 18
+Turma Load (0.1ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`id` = 32
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`id` = 36 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:32:00.406143', NULL, NULL, NULL, 'ES - 2026.1', 32, '2026-06-30 17:32:00.406143')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.3ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:32:00.407341', 'Questão 1', 22, 1, 'Texto', '2026-06-30 17:32:00.407341')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/admin/72/gerenciamento Completed 302 Found in 7ms (ActiveRecord: 2.3ms (9 queries, 0 cached) | GC: 0.1ms)

+ +
Formulario Count (0.2ms)  SELECT COUNT(*) FROM `formularios`
+TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:00.411079', 'Ciência da Computação', '2026-06-30 17:32:00.411079')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_admin' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:00.599777', NULL, NULL, NULL, 84, 'admin_ctrl@unb.br', NULL, 'adm_admin', 'Admin Teste', NULL, NULL, '$2a$12$Mrqe.AapfVnoZB7j4BXvZeU9etwAeOcbvQNqWc68EDP.RPqMap6dC', 'Administrador', '2026-06-30 17:32:00.599777')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:00 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin_ctrl@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/73/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Disciplina Load (0.3ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'ES' AND `disciplinas`.`codigo` = 'CIC001A' AND `disciplinas`.`departamento_id` = 84 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.4ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC001A' LIMIT 1
+Disciplina Create (0.3ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC001A', '2026-06-30 17:32:00.791929', 84, 'ES', '2026-06-30 17:32:00.791929')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 37 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 37 LIMIT 1
+Turma Create (0.3ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:32:00.794004', 37, NULL, 'TA', '2026.1', '2026-06-30 17:32:00.794004')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Administrador Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 73 LIMIT 1
+Template Create (0.2ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:32:00.795872', 'Template Ctrl', '2026-06-30 17:32:00.795872', 73)
+Elemento Create (0.2ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:32:00.796334', 'Questão 1', 1, 20, '2026-06-30 17:32:00.796334')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TB' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 37 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:32:00.797586', 37, NULL, 'TB', '2026.1', '2026-06-30 17:32:00.797586')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Formulario Count (0.2ms)  SELECT COUNT(*) FROM `formularios`
+ +

Started POST “/admin/73/enviar_formularios” for 127.0.0.1 at 2026-06-30 14:32:00 -0300 Processing by AdminController#enviar_formularios as HTML

+ +
Parameters: {"template_id" => "20", "turma_ids" => ["33", "34"], "admin_id" => "73"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 73 LIMIT 1
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 73 LIMIT 1
+Template Load (0.2ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`id` = 20 LIMIT 1
+Elemento Load (0.2ms)  SELECT `elementos`.* FROM `elementos` WHERE `elementos`.`template_id` = 20
+Campo Load (0.2ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` = 19
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`id` IN (33, 34)
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`id` = 37 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:32:00.802505', NULL, NULL, NULL, 'ES - 2026.1', 33, '2026-06-30 17:32:00.802505')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:32:00.803577', 'Questão 1', 23, 1, 'Texto', '2026-06-30 17:32:00.803577')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`id` = 37 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.3ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:32:00.804944', NULL, NULL, NULL, 'ES - 2026.1', 34, '2026-06-30 17:32:00.804944')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.3ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:32:00.805917', 'Questão 1', 24, 1, 'Texto', '2026-06-30 17:32:00.805917')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/admin/73/gerenciamento Completed 302 Found in 8ms (ActiveRecord: 3.9ms (12 queries, 0 cached) | GC: 0.0ms)

+ +
Formulario Count (0.2ms)  SELECT COUNT(*) FROM `formularios`
+TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:00.809259', 'Ciência da Computação', '2026-06-30 17:32:00.809259')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_admin' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:00.998023', NULL, NULL, NULL, 85, 'admin_ctrl@unb.br', NULL, 'adm_admin', 'Admin Teste', NULL, NULL, '$2a$12$6czNFKMnYktJRpk4IzlrvuGtjx95CconIb1DIs3qXGrsPdVAivnRa', 'Administrador', '2026-06-30 17:32:00.998023')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:00 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin_ctrl@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/74/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Disciplina Load (0.3ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'ES' AND `disciplinas`.`codigo` = 'CIC001A' AND `disciplinas`.`departamento_id` = 85 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.4ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC001A' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC001A', '2026-06-30 17:32:01.189167', 85, 'ES', '2026-06-30 17:32:01.189167')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 38 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 38 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:32:01.190914', 38, NULL, 'TA', '2026.1', '2026-06-30 17:32:01.190914')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Administrador Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 74 LIMIT 1
+Template Create (0.2ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:32:01.192618', 'Template Ctrl', '2026-06-30 17:32:01.192618', 74)
+Elemento Create (0.2ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:32:01.193009', 'Questão 1', 1, 21, '2026-06-30 17:32:01.193009')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/admin/74/enviar_formularios” for 127.0.0.1 at 2026-06-30 14:32:01 -0300 Processing by AdminController#enviar_formularios as HTML

+ +
Parameters: {"template_id" => "21", "turma_ids" => ["35"], "admin_id" => "74"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 74 LIMIT 1
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 74 LIMIT 1
+Template Load (0.2ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`id` = 21 LIMIT 1
+Elemento Load (0.2ms)  SELECT `elementos`.* FROM `elementos` WHERE `elementos`.`template_id` = 21
+Campo Load (0.2ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` = 20
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`id` = 35
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`id` = 38 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:32:01.197202', NULL, NULL, NULL, 'ES - 2026.1', 35, '2026-06-30 17:32:01.197202')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.3ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:32:01.198233', 'Questão 1', 25, 1, 'Texto', '2026-06-30 17:32:01.198233')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/admin/74/gerenciamento Completed 302 Found in 5ms (ActiveRecord: 2.4ms (9 queries, 0 cached) | GC: 0.0ms)

+ +
Formulario Load (0.2ms)  SELECT `formularios`.* FROM `formularios` ORDER BY `formularios`.`id` DESC LIMIT 1
+ElementoForm Count (0.2ms)  SELECT COUNT(*) FROM `elemento_forms` WHERE `elemento_forms`.`formulario_id` = 25
+TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:01.202399', 'Ciência da Computação', '2026-06-30 17:32:01.202399')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_admin' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+Administrador Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:01.390969', NULL, NULL, NULL, 86, 'admin_ctrl@unb.br', NULL, 'adm_admin', 'Admin Teste', NULL, NULL, '$2a$12$3iecofB8QxXOIwaESxXLq.lavgOPzygbUpgH1fHoLkXgP9JRNukbK', 'Administrador', '2026-06-30 17:32:01.390969')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:01 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin_ctrl@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/75/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/admin/75/resultados” for 127.0.0.1 at 2026-06-30 14:32:01 -0300 Processing by AdminController#resultados as HTML

+ +
Parameters: {"admin_id" => "75"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 75 LIMIT 1
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 75 LIMIT 1
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/resultados.html.erb within layouts/gerenciamento
+Formulario Eager Load (0.4ms)  SELECT `formularios`.`id` AS t0_r0, `formularios`.`created_at` AS t0_r1, `formularios`.`data_fim` AS t0_r2, `formularios`.`data_inicio` AS t0_r3, `formularios`.`nome` AS t0_r4, `formularios`.`titulo` AS t0_r5, `formularios`.`turma_id` AS t0_r6, `formularios`.`updated_at` AS t0_r7, `turmas`.`id` AS t1_r0, `turmas`.`created_at` AS t1_r1, `turmas`.`disciplina_id` AS t1_r2, `turmas`.`horario` AS t1_r3, `turmas`.`numero_da_turma` AS t1_r4, `turmas`.`semestre` AS t1_r5, `turmas`.`updated_at` AS t1_r6, `disciplinas`.`id` AS t2_r0, `disciplinas`.`codigo` AS t2_r1, `disciplinas`.`created_at` AS t2_r2, `disciplinas`.`departamento_id` AS t2_r3, `disciplinas`.`nome` AS t2_r4, `disciplinas`.`updated_at` AS t2_r5 FROM `formularios` INNER JOIN `turmas` ON `turmas`.`id` = `formularios`.`turma_id` INNER JOIN `disciplinas` ON `disciplinas`.`id` = `turmas`.`disciplina_id` WHERE `disciplinas`.`departamento_id` = 86
+Rendered admin/resultados.html.erb within layouts/gerenciamento (Duration: 1.1ms | GC: 0.1ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 1.3ms | GC: 0.1ms)
+ +

Completed 200 OK in 3ms (Views: 1.1ms | ActiveRecord: 0.9ms (3 queries, 0 cached) | GC: 0.1ms)

+ +
TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:01.586236', 'Ciência da Computação', '2026-06-30 17:32:01.586236')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_admin' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:01.774982', NULL, NULL, NULL, 87, 'admin_ctrl@unb.br', NULL, 'adm_admin', 'Admin Teste', NULL, NULL, '$2a$12$G3QMlhYoTaI952MFcYXbJeZx9UyvCP5203htE/V/xaup8qxyLYQP.', 'Administrador', '2026-06-30 17:32:01.774982')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:01 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin_ctrl@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/76/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Disciplina Load (0.3ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'ES Download' AND `disciplinas`.`codigo` = 'CIC002A' AND `disciplinas`.`departamento_id` = 87 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.4ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC002A' LIMIT 1
+Disciplina Create (0.3ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC002A', '2026-06-30 17:32:01.967161', 87, 'ES Download', '2026-06-30 17:32:01.967161')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 39 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 39 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:32:01.969080', 39, NULL, 'TA', '2026.1', '2026-06-30 17:32:01.969080')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:32:01.969845', NULL, NULL, NULL, NULL, 36, '2026-06-30 17:32:01.969845')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/admin/76/resultados/999999/download.csv” for 127.0.0.1 at 2026-06-30 14:32:01 -0300 Processing by AdminController#exportar_csv as CSV

+ +
Parameters: {"admin_id" => "76", "id" => "999999"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 76 LIMIT 1
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 76 LIMIT 1
+Formulario Load (0.2ms)  SELECT `formularios`.* FROM `formularios` WHERE `formularios`.`id` = 999999 LIMIT 1
+ +

Redirected to www.example.com/admin/76/resultados Completed 302 Found in 1ms (ActiveRecord: 0.6ms (3 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:01.975082', 'Ciência da Computação', '2026-06-30 17:32:01.975082')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_admin' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+Administrador Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:02.163865', NULL, NULL, NULL, 88, 'admin_ctrl@unb.br', NULL, 'adm_admin', 'Admin Teste', NULL, NULL, '$2a$12$4a/cds7IO6UZTi0aykCyre2lnm00UllDZpEdKVnCSiWjH8INIXYZm', 'Administrador', '2026-06-30 17:32:02.163865')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:02 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin_ctrl@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/77/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Disciplina Load (0.6ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'ES Download' AND `disciplinas`.`codigo` = 'CIC002A' AND `disciplinas`.`departamento_id` = 88 LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.5ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC002A' LIMIT 1
+Disciplina Create (0.4ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC002A', '2026-06-30 17:32:02.355034', 88, 'ES Download', '2026-06-30 17:32:02.355034')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 40 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 40 LIMIT 1
+Turma Create (0.3ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:32:02.357050', 40, NULL, 'TA', '2026.1', '2026-06-30 17:32:02.357050')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:32:02.357818', NULL, NULL, NULL, NULL, 37, '2026-06-30 17:32:02.357818')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/admin/77/resultados/27/download.csv” for 127.0.0.1 at 2026-06-30 14:32:02 -0300 Processing by AdminController#exportar_csv as CSV

+ +
Parameters: {"admin_id" => "77", "id" => "27"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 77 LIMIT 1
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 77 LIMIT 1
+Formulario Load (0.2ms)  SELECT `formularios`.* FROM `formularios` WHERE `formularios`.`id` = 27 LIMIT 1
+RespostaForm Exists? (0.2ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`formulario_id` = 27 LIMIT 1
+ +

Redirected to www.example.com/admin/77/resultados Completed 302 Found in 2ms (ActiveRecord: 0.9ms (4 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:02.363407', 'Ciência da Computação', '2026-06-30 17:32:02.363407')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_admin' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+Administrador Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:02.551892', NULL, NULL, NULL, 89, 'admin_ctrl@unb.br', NULL, 'adm_admin', 'Admin Teste', NULL, NULL, '$2a$12$1h4NGJhfVpInQRCRMJ2tyutf8tW/H5l3mlE5hmhxir52wpMgKGOma', 'Administrador', '2026-06-30 17:32:02.551892')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:02 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin_ctrl@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/78/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.1ms)

+ +
Disciplina Load (0.4ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'ES Download' AND `disciplinas`.`codigo` = 'CIC002A' AND `disciplinas`.`departamento_id` = 89 LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.4ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC002A' LIMIT 1
+Disciplina Create (0.4ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC002A', '2026-06-30 17:32:02.743537', 89, 'ES Download', '2026-06-30 17:32:02.743537')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 41 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.2ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 41 LIMIT 1
+Turma Create (0.1ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:32:02.745425', 41, NULL, 'TA', '2026.1', '2026-06-30 17:32:02.745425')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:32:02.746112', NULL, NULL, NULL, NULL, 38, '2026-06-30 17:32:02.746112')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Docente Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Docente' AND `usuarios`.`email` = 'doc_csv@unb.br' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_csv' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_csv@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:02.935781', NULL, NULL, NULL, NULL, 'doc_csv@unb.br', 'Doutorado', 'doc_csv', 'Docente CSV', NULL, NULL, '$2a$12$Dw4z/goymlnLPj.D7DPy/u57zbicblEYtMRU0YIl8wAtk7BEA.nUa', 'Docente', '2026-06-30 17:32:02.935781')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaForm Exists? (0.5ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 79 AND `resposta_forms`.`formulario_id` = 28 LIMIT 1
+RespostaForm Create (0.3ms)  INSERT INTO `resposta_forms` (`created_at`, `data_submissao`, `formulario_id`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:32:02.937944', '2026-06-30', 28, '2026-06-30 17:32:02.937944', 79)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/admin/78/resultados/28/download.csv” for 127.0.0.1 at 2026-06-30 14:32:02 -0300 Processing by AdminController#exportar_csv as CSV

+ +
Parameters: {"admin_id" => "78", "id" => "28"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 78 LIMIT 1
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 78 LIMIT 1
+Formulario Load (0.2ms)  SELECT `formularios`.* FROM `formularios` WHERE `formularios`.`id` = 28 LIMIT 1
+RespostaForm Exists? (0.2ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`formulario_id` = 28 LIMIT 1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`id` = 38 LIMIT 1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`id` = 41 LIMIT 1
+Rendering admin/exportar_csv.csv.erb
+ElementoForm Pluck (0.2ms)  SELECT `elemento_forms`.`enunciado` FROM `elemento_forms` WHERE `elemento_forms`.`formulario_id` = 28 ORDER BY `elemento_forms`.`ordem` ASC
+RespostaForm Load (0.2ms)  SELECT `resposta_forms`.* FROM `resposta_forms` WHERE `resposta_forms`.`formulario_id` = 28
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 79
+RespostaElem Load (0.3ms)  SELECT `resposta_elems`.* FROM `resposta_elems` WHERE `resposta_elems`.`resposta_form_id` = 8
+Rendered admin/exportar_csv.csv.erb (Duration: 2.3ms | GC: 0.0ms)
+ +

Completed 200 OK in 7ms (Views: 2.5ms | ActiveRecord: 2.2ms (10 queries, 0 cached) | GC: 0.1ms)

+ +
TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:02.949304', 'Ciência da Computação', '2026-06-30 17:32:02.949304')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_admin' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:03.137772', NULL, NULL, NULL, 90, 'admin_ctrl@unb.br', NULL, 'adm_admin', 'Admin Teste', NULL, NULL, '$2a$12$kRO3wx3m8G9oERo0Un3Bnezd04LsPqyLjC4zXqO352trvAS4OMJ36', 'Administrador', '2026-06-30 17:32:03.137772')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:03 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin_ctrl@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/80/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/admin/80/sincronizar_sigaa” for 127.0.0.1 at 2026-06-30 14:32:03 -0300 Processing by AdminController#sincronizar_sigaa as HTML

+ +
Parameters: {"admin_id" => "80"}
+Usuario Load (0.5ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 80 LIMIT 1
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 80 LIMIT 1
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/sincronizar_sigaa.html.erb within layouts/gerenciamento
+Rendered admin/sincronizar_sigaa.html.erb within layouts/gerenciamento (Duration: 2.4ms | GC: 0.2ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 2.6ms | GC: 0.2ms)
+ +

Completed 200 OK in 5ms (Views: 3.0ms | ActiveRecord: 0.8ms (2 queries, 0 cached) | GC: 0.2ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:03.334957', 'Ciência da Computação', '2026-06-30 17:32:03.334957')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_admin' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:03.523980', NULL, NULL, NULL, 91, 'admin_ctrl@unb.br', NULL, 'adm_admin', 'Admin Teste', NULL, NULL, '$2a$12$cpgoasRJqvzJYtGagiZ2Sug81deCtb9YDEOZ6wHO0.sFi914ynNu6', 'Administrador', '2026-06-30 17:32:03.523980')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:03 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin_ctrl@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/81/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started POST “/admin/81/sincronizar_sigaa” for 127.0.0.1 at 2026-06-30 14:32:03 -0300 Processing by AdminController#sincronizar_sigaa as HTML

+ +
Parameters: {"acao" => "importar", "admin_id" => "81"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 81 LIMIT 1
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 81 LIMIT 1
+ +

Redirected to www.example.com/admin/81/gerenciamento Completed 302 Found in 1ms (ActiveRecord: 0.6ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:03.717745', 'Ciência da Computação', '2026-06-30 17:32:03.717745')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_admin' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:03.906980', NULL, NULL, NULL, 92, 'admin_ctrl@unb.br', NULL, 'adm_admin', 'Admin Teste', NULL, NULL, '$2a$12$oN35hGAnSki7cMFFAIoKse3q14vHPuIJHNQKmb/JSf.39p2bIUHoW', 'Administrador', '2026-06-30 17:32:03.906980')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:03 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin_ctrl@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/82/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started POST “/admin/82/sincronizar_sigaa” for 127.0.0.1 at 2026-06-30 14:32:04 -0300 Processing by AdminController#sincronizar_sigaa as HTML

+ +
Parameters: {"acao" => "importar", "arquivo_classes" => #<ActionDispatch::Http::UploadedFile:0x0000000126902190 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-99492-qm099r.json>, @content_type="application/json", @original_filename="class_members.json", @headers="content-disposition: form-data; name=\"arquivo_classes\"; filename=\"class_members.json\"\r\ncontent-type: application/json\r\ncontent-length: 16065\r\n">, "arquivo_membros" => #<ActionDispatch::Http::UploadedFile:0x00000001269020a0 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-99492-r5lx51.json>, @content_type="application/json", @original_filename="class_members.json", @headers="content-disposition: form-data; name=\"arquivo_membros\"; filename=\"class_members.json\"\r\ncontent-type: application/json\r\ncontent-length: 16065\r\n">, "admin_id" => "82"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 82 LIMIT 1
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 82 LIMIT 1
+ +

Redirected to www.example.com/admin/82/gerenciamento Completed 302 Found in 1ms (ActiveRecord: 0.5ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:04.107190', 'Ciência da Computação', '2026-06-30 17:32:04.107190')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_admin' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:04.295871', NULL, NULL, NULL, 93, 'admin_ctrl@unb.br', NULL, 'adm_admin', 'Admin Teste', NULL, NULL, '$2a$12$fqjpN.fPjZIUqYGZsKn8nO4OnUOyDU41A0yYf/6pXnnNrr7ZxqHIy', 'Administrador', '2026-06-30 17:32:04.295871')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:04 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin_ctrl@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/83/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started POST “/admin/83/sincronizar_sigaa” for 127.0.0.1 at 2026-06-30 14:32:04 -0300 Processing by AdminController#sincronizar_sigaa as HTML

+ +
Parameters: {"acao" => "atualizar", "arquivo_classes" => #<ActionDispatch::Http::UploadedFile:0x00000001266ca968 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-99492-ruobph.json>, @content_type="application/json", @original_filename="class_members.json", @headers="content-disposition: form-data; name=\"arquivo_classes\"; filename=\"class_members.json\"\r\ncontent-type: application/json\r\ncontent-length: 16065\r\n">, "arquivo_membros" => #<ActionDispatch::Http::UploadedFile:0x00000001266ca918 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-99492-5a2i26.json>, @content_type="application/json", @original_filename="class_members.json", @headers="content-disposition: form-data; name=\"arquivo_membros\"; filename=\"class_members.json\"\r\ncontent-type: application/json\r\ncontent-length: 16065\r\n">, "admin_id" => "83"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 83 LIMIT 1
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 83 LIMIT 1
+ +

Redirected to www.example.com/admin/83/gerenciamento Completed 302 Found in 1ms (ActiveRecord: 0.5ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:04.491053', 'Ciência da Computação', '2026-06-30 17:32:04.491053')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_admin' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+Administrador Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:04.679675', NULL, NULL, NULL, 94, 'admin_ctrl@unb.br', NULL, 'adm_admin', 'Admin Teste', NULL, NULL, '$2a$12$rDjaxTtoF/tTUNmrpNGeLefcctvoF6YiEilL3OZ1A2LjRg8hj9kkO', 'Administrador', '2026-06-30 17:32:04.679675')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:04 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin_ctrl@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/84/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started POST “/admin/84/sincronizar_sigaa” for 127.0.0.1 at 2026-06-30 14:32:04 -0300 Processing by AdminController#sincronizar_sigaa as HTML

+ +
Parameters: {"acao" => "importar", "arquivo_classes" => #<ActionDispatch::Http::UploadedFile:0x00000001265cbc38 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-99492-attyln.json>, @content_type="application/json", @original_filename="class_members.json", @headers="content-disposition: form-data; name=\"arquivo_classes\"; filename=\"class_members.json\"\r\ncontent-type: application/json\r\ncontent-length: 16065\r\n">, "arquivo_membros" => #<ActionDispatch::Http::UploadedFile:0x00000001265cbbe8 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-99492-f8qc2y.json>, @content_type="application/json", @original_filename="class_members.json", @headers="content-disposition: form-data; name=\"arquivo_membros\"; filename=\"class_members.json\"\r\ncontent-type: application/json\r\ncontent-length: 16065\r\n">, "admin_id" => "84"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 84 LIMIT 1
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 84 LIMIT 1
+ +

Redirected to www.example.com/admin/84/gerenciamento Completed 302 Found in 2ms (ActiveRecord: 0.7ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.3ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:04.875828', 'Ciência da Computação', '2026-06-30 17:32:04.875828')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_admin' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+Administrador Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:05.065267', NULL, NULL, NULL, 95, 'admin_ctrl@unb.br', NULL, 'adm_admin', 'Admin Teste', NULL, NULL, '$2a$12$n4HAxU7WUob.rgOsm.apneUi/oPErFwHwJZN5b/sf/usfE7ToJY8K', 'Administrador', '2026-06-30 17:32:05.065267')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:05 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin_ctrl@unb.br", "senha" => "Senha123"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/85/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms) Started POST “/admin/85/sincronizar_sigaa” for 127.0.0.1 at 2026-06-30 14:32:05 -0300 Processing by AdminController#sincronizar_sigaa as HTML

+ +
Parameters: {"acao" => "atualizar", "arquivo_classes" => #<ActionDispatch::Http::UploadedFile:0x0000000126549350 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-99492-yrciv8.json>, @content_type="application/json", @original_filename="class_members.json", @headers="content-disposition: form-data; name=\"arquivo_classes\"; filename=\"class_members.json\"\r\ncontent-type: application/json\r\ncontent-length: 16065\r\n">, "arquivo_membros" => #<ActionDispatch::Http::UploadedFile:0x0000000126549300 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-99492-2z6e11.json>, @content_type="application/json", @original_filename="class_members.json", @headers="content-disposition: form-data; name=\"arquivo_membros\"; filename=\"class_members.json\"\r\ncontent-type: application/json\r\ncontent-length: 16065\r\n">, "admin_id" => "85"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 85 LIMIT 1
+Administrador Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 85 LIMIT 1
+ +

Redirected to www.example.com/admin/85/gerenciamento Completed 302 Found in 2ms (ActiveRecord: 0.8ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:05.262364', 'Ciência da Computação', '2026-06-30 17:32:05.262364')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_admin' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+Administrador Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:05.451558', NULL, NULL, NULL, 96, 'admin_ctrl@unb.br', NULL, 'adm_admin', 'Admin Teste', NULL, NULL, '$2a$12$.pyR62x9k15CU9TtBitOSehmBTSq09od0uuTrDsLsgbNaytCHJakC', 'Administrador', '2026-06-30 17:32:05.451558')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:05 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin_ctrl@unb.br", "senha" => "Senha123"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/86/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms) Started POST “/admin/86/sincronizar_sigaa” for 127.0.0.1 at 2026-06-30 14:32:05 -0300 Processing by AdminController#sincronizar_sigaa as HTML

+ +
Parameters: {"acao" => "importar", "arquivo_classes" => #<ActionDispatch::Http::UploadedFile:0x0000000125ba5ec0 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-99492-ma9448.json>, @content_type="application/json", @original_filename="class_members.json", @headers="content-disposition: form-data; name=\"arquivo_classes\"; filename=\"class_members.json\"\r\ncontent-type: application/json\r\ncontent-length: 16065\r\n">, "arquivo_membros" => #<ActionDispatch::Http::UploadedFile:0x0000000125ba5e70 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-99492-n6whgu.json>, @content_type="application/json", @original_filename="class_members.json", @headers="content-disposition: form-data; name=\"arquivo_membros\"; filename=\"class_members.json\"\r\ncontent-type: application/json\r\ncontent-length: 16065\r\n">, "admin_id" => "86"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 86 LIMIT 1
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 86 LIMIT 1
+ +

Redirected to www.example.com/admin/86/gerenciamento Completed 302 Found in 2ms (ActiveRecord: 0.7ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:05.648415', 'Ciência da Computação', '2026-06-30 17:32:05.648415')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_admin' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:05.837972', NULL, NULL, NULL, 97, 'admin_ctrl@unb.br', NULL, 'adm_admin', 'Admin Teste', NULL, NULL, '$2a$12$e5Gf9qmR6y5nzRYL3hclpe9junHPRYABfp3mcGiinD/97/vvXKC5q', 'Administrador', '2026-06-30 17:32:05.837972')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:05 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin_ctrl@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/87/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started POST “/admin/87/sincronizar_sigaa” for 127.0.0.1 at 2026-06-30 14:32:06 -0300 Processing by AdminController#sincronizar_sigaa as HTML

+ +
Parameters: {"acao" => "atualizar", "arquivo_classes" => #<ActionDispatch::Http::UploadedFile:0x0000000125a35d38 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-99492-9hu0zy.json>, @content_type="application/json", @original_filename="class_members.json", @headers="content-disposition: form-data; name=\"arquivo_classes\"; filename=\"class_members.json\"\r\ncontent-type: application/json\r\ncontent-length: 16065\r\n">, "arquivo_membros" => #<ActionDispatch::Http::UploadedFile:0x0000000125a35c98 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-99492-pryaev.json>, @content_type="application/json", @original_filename="class_members.json", @headers="content-disposition: form-data; name=\"arquivo_membros\"; filename=\"class_members.json\"\r\ncontent-type: application/json\r\ncontent-length: 16065\r\n">, "admin_id" => "87"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 87 LIMIT 1
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 87 LIMIT 1
+ +

Redirected to www.example.com/admin/87/gerenciamento Completed 302 Found in 2ms (ActiveRecord: 0.7ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:06.034648', 'Ciência da Computação', '2026-06-30 17:32:06.034648')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_admin' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:06.223382', NULL, NULL, NULL, 98, 'admin_ctrl@unb.br', NULL, 'adm_admin', 'Admin Teste', NULL, NULL, '$2a$12$TCoZy0kOHiNiQDq5aro8beoQFumREakqyaivG.J.Jo1Q0qVExkEGu', 'Administrador', '2026-06-30 17:32:06.223382')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:06 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin_ctrl@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin_ctrl@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/88/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started POST “/admin/88/sincronizar_sigaa” for 127.0.0.1 at 2026-06-30 14:32:06 -0300 Processing by AdminController#sincronizar_sigaa as HTML

+ +
Parameters: {"acao" => "invalida", "arquivo_classes" => #<ActionDispatch::Http::UploadedFile:0x0000000124e90c30 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-99492-7q2qdw.json>, @content_type="application/json", @original_filename="class_members.json", @headers="content-disposition: form-data; name=\"arquivo_classes\"; filename=\"class_members.json\"\r\ncontent-type: application/json\r\ncontent-length: 16065\r\n">, "arquivo_membros" => #<ActionDispatch::Http::UploadedFile:0x0000000124e90b90 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-99492-ac80gz.json>, @content_type="application/json", @original_filename="class_members.json", @headers="content-disposition: form-data; name=\"arquivo_membros\"; filename=\"class_members.json\"\r\ncontent-type: application/json\r\ncontent-length: 16065\r\n">, "admin_id" => "88"}
+Usuario Load (0.5ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 88 LIMIT 1
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 88 LIMIT 1
+ +

Redirected to www.example.com/admin/88/gerenciamento Completed 302 Found in 2ms (ActiveRecord: 0.8ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_cf' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_cf@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:06.606522', NULL, NULL, NULL, NULL, 'doc_cf@unb.br', 'Doutorado', 'doc_cf', 'Docente CF', NULL, NULL, '$2a$12$d.dZkaKi1RZPh8UmnRcEDOUiXWZ27uocYmuerm8e6fafd5LWemaZy', 'Docente', '2026-06-30 17:32:06.606522')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:06.608673', 'Ciência da Computação', '2026-06-30 17:32:06.608673')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 99 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.4ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:32:06.610218', 99, 'Engenharia de Software', '2026-06-30 17:32:06.610218')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 42 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 42 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:32:06.611829', 42, NULL, 'TA', '2026.1', '2026-06-30 17:32:06.611829')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:32:06.612478', NULL, NULL, NULL, NULL, 39, '2026-06-30 17:32:06.612478')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:32:06.613267', NULL, 29, 1, NULL, '2026-06-30 17:32:06.613267')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (1.0ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:06.614070', 15, 'Opção A', 1, NULL, '2026-06-30 17:32:06.614070')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:06 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_cf@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_cf@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/89/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started DELETE “/logout” for 127.0.0.1 at 2026-06-30 14:32:06 -0300 Processing by SessionsController#destroy as HTML Redirected to www.example.com/ Completed 302 Found in 0ms (ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 0.0ms) Started GET “/campo_forms” for 127.0.0.1 at 2026-06-30 14:32:06 -0300 Processing by CampoFormsController#index as HTML

+ +
Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+ +

Redirected to www.example.com/ Filter chain halted as :require_login rendered or redirected Completed 302 Found in 1ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.2ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_cf' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_cf@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:06.997232', NULL, NULL, NULL, NULL, 'doc_cf@unb.br', 'Doutorado', 'doc_cf', 'Docente CF', NULL, NULL, '$2a$12$UFs0JiEdleLu/u4Myb.DAOEOjTkBAf4RP5RA2wXH.SWOhB1kqtd1q', 'Docente', '2026-06-30 17:32:06.997232')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:06.999446', 'Ciência da Computação', '2026-06-30 17:32:06.999446')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 100 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:32:07.000955', 100, 'Engenharia de Software', '2026-06-30 17:32:07.000955')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 43 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 43 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:32:07.002494', 43, NULL, 'TA', '2026.1', '2026-06-30 17:32:07.002494')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:32:07.003107', NULL, NULL, NULL, NULL, 40, '2026-06-30 17:32:07.003107')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:32:07.003863', NULL, 30, 1, NULL, '2026-06-30 17:32:07.003863')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.4ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:07.004598', 16, 'Opção A', 1, NULL, '2026-06-30 17:32:07.004598')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:07 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_cf@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_cf@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/90/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/campo_forms” for 127.0.0.1 at 2026-06-30 14:32:07 -0300 Processing by CampoFormsController#index as HTML

+ +
Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 90 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering campo_forms/index.html.erb within layouts/application
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms`
+Rendered campo_forms/_campo_form.html.erb (Duration: 0.1ms | GC: 0.0ms)
+Rendered campo_forms/index.html.erb within layouts/application (Duration: 1.3ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 4.7ms | GC: 0.3ms)
+ +

Completed 200 OK in 14ms (Views: 5.1ms | ActiveRecord: 0.5ms (2 queries, 0 cached) | GC: 8.0ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_cf' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_cf@unb.br' LIMIT 1
+Docente Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:07.398489', NULL, NULL, NULL, NULL, 'doc_cf@unb.br', 'Doutorado', 'doc_cf', 'Docente CF', NULL, NULL, '$2a$12$8YZcRt/xZ3Zr82tVyVhEo.GsYIZxZvR8j1M.lpHgJBAjn1F/RJn.G', 'Docente', '2026-06-30 17:32:07.398489')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:07.400928', 'Ciência da Computação', '2026-06-30 17:32:07.400928')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 101 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:32:07.402375', 101, 'Engenharia de Software', '2026-06-30 17:32:07.402375')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 44 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 44 LIMIT 1
+Turma Create (0.1ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:32:07.403893', 44, NULL, 'TA', '2026.1', '2026-06-30 17:32:07.403893')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.2ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:32:07.404337', NULL, NULL, NULL, NULL, 41, '2026-06-30 17:32:07.404337')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.2ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:32:07.404862', NULL, 31, 1, NULL, '2026-06-30 17:32:07.404862')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.2ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:07.405374', 17, 'Opção A', 1, NULL, '2026-06-30 17:32:07.405374')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:07 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_cf@unb.br", "senha" => "Senha123"}
+Usuario Load (0.1ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_cf@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/91/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.1ms (1 query, 0 cached) | GC: 0.3ms) Started GET “/campo_forms/new” for 127.0.0.1 at 2026-06-30 14:32:07 -0300 Processing by CampoFormsController#new as HTML

+ +
Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 91 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering campo_forms/new.html.erb within layouts/application
+Rendered campo_forms/_form.html.erb (Duration: 1.1ms | GC: 0.0ms)
+Rendered campo_forms/new.html.erb within layouts/application (Duration: 1.7ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.9ms | GC: 0.0ms)
+ +

Completed 200 OK in 3ms (Views: 2.0ms | ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_cf' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_cf@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:07.788181', NULL, NULL, NULL, NULL, 'doc_cf@unb.br', 'Doutorado', 'doc_cf', 'Docente CF', NULL, NULL, '$2a$12$XzMCPvToWA1zUtrpuodwk.VdT/aZV1za/Gl1odAVBO4T7bn5oxT0a', 'Docente', '2026-06-30 17:32:07.788181')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:07.790487', 'Ciência da Computação', '2026-06-30 17:32:07.790487')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 102 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:32:07.791933', 102, 'Engenharia de Software', '2026-06-30 17:32:07.791933')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 45 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 45 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:32:07.793448', 45, NULL, 'TA', '2026.1', '2026-06-30 17:32:07.793448')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:32:07.794052', NULL, NULL, NULL, NULL, 42, '2026-06-30 17:32:07.794052')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:32:07.794792', NULL, 32, 1, NULL, '2026-06-30 17:32:07.794792')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.4ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:07.795536', 18, 'Opção A', 1, NULL, '2026-06-30 17:32:07.795536')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:07 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_cf@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_cf@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/92/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms)

+ +
CampoForm Count (0.3ms)  SELECT COUNT(*) FROM `campo_forms`
+ +

Started POST “/campo_forms” for 127.0.0.1 at 2026-06-30 14:32:07 -0300 Processing by CampoFormsController#create as HTML

+ +
Parameters: {"campo_form" => {"ordem" => "99", "enunciado" => "Nova Opção", "elemento_form_id" => "18"}}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 92 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Load (0.4ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`id` = 18 LIMIT 1
+CampoForm Create (0.3ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:07.988733', 18, 'Nova Opção', 99, NULL, '2026-06-30 17:32:07.988733')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/campo_forms/5 Completed 302 Found in 3ms (ActiveRecord: 1.2ms (3 queries, 0 cached) | GC: 0.0ms)

+ +
CampoForm Count (0.2ms)  SELECT COUNT(*) FROM `campo_forms`
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` ORDER BY `campo_forms`.`id` DESC LIMIT 1
+TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_cf' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_cf@unb.br' LIMIT 1
+Docente Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:08.180538', NULL, NULL, NULL, NULL, 'doc_cf@unb.br', 'Doutorado', 'doc_cf', 'Docente CF', NULL, NULL, '$2a$12$SA.qOfGifF/um0hvAXoEm.HxUu1dU.ZG3ZPFzcjXQ5Emhfz6W9rU.', 'Docente', '2026-06-30 17:32:08.180538')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:08.182578', 'Ciência da Computação', '2026-06-30 17:32:08.182578')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 103 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:32:08.184131', 103, 'Engenharia de Software', '2026-06-30 17:32:08.184131')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 46 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 46 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:32:08.185675', 46, NULL, 'TA', '2026.1', '2026-06-30 17:32:08.185675')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:32:08.186297', NULL, NULL, NULL, NULL, 43, '2026-06-30 17:32:08.186297')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:32:08.187214', NULL, 33, 1, NULL, '2026-06-30 17:32:08.187214')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.4ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:08.187968', 19, 'Opção A', 1, NULL, '2026-06-30 17:32:08.187968')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:08 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_cf@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_cf@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/93/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms)

+ +
CampoForm Count (0.3ms)  SELECT COUNT(*) FROM `campo_forms`
+ +

Started POST “/campo_forms” for 127.0.0.1 at 2026-06-30 14:32:08 -0300 Processing by CampoFormsController#create as HTML

+ +
Parameters: {"campo_form" => {"ordem" => nil, "enunciado" => "X", "elemento_form_id" => "19"}}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 93 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Load (0.4ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`id` = 19 LIMIT 1
+TRANSACTION (0.1ms)  ROLLBACK TO SAVEPOINT active_record_1
+Rendering layout layouts/application.html.erb
+Rendering campo_forms/new.html.erb within layouts/application
+Rendered campo_forms/_form.html.erb (Duration: 0.8ms | GC: 0.1ms)
+Rendered campo_forms/new.html.erb within layouts/application (Duration: 0.9ms | GC: 0.1ms)
+Rendered layout layouts/application.html.erb (Duration: 1.1ms | GC: 0.1ms)
+ +

Completed 422 Unprocessable Content in 3ms (Views: 1.3ms | ActiveRecord: 0.9ms (2 queries, 0 cached) | GC: 0.1ms)

+ +
CampoForm Count (0.2ms)  SELECT COUNT(*) FROM `campo_forms`
+TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_cf' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_cf@unb.br' LIMIT 1
+Docente Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:08.571897', NULL, NULL, NULL, NULL, 'doc_cf@unb.br', 'Doutorado', 'doc_cf', 'Docente CF', NULL, NULL, '$2a$12$L0pqB4YDKy2l8k2F7oWeC./7wb51ymLSp0IC1Y8.CS.ENOLmI/XMG', 'Docente', '2026-06-30 17:32:08.571897')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:08.573667', 'Ciência da Computação', '2026-06-30 17:32:08.573667')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 104 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:32:08.575105', 104, 'Engenharia de Software', '2026-06-30 17:32:08.575105')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 47 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 47 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:32:08.576684', 47, NULL, 'TA', '2026.1', '2026-06-30 17:32:08.576684')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:32:08.577285', NULL, NULL, NULL, NULL, 44, '2026-06-30 17:32:08.577285')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:32:08.578046', NULL, 34, 1, NULL, '2026-06-30 17:32:08.578046')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.4ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:08.578789', 20, 'Opção A', 1, NULL, '2026-06-30 17:32:08.578789')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:08 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_cf@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_cf@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/94/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/campo_forms/7” for 127.0.0.1 at 2026-06-30 14:32:08 -0300 Processing by CampoFormsController#show as HTML

+ +
Parameters: {"id" => "7"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 94 LIMIT 1
+CampoForm Load (0.3ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`id` = 7 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering campo_forms/show.html.erb within layouts/application
+Rendered campo_forms/_campo_form.html.erb (Duration: 0.1ms | GC: 0.1ms)
+Rendered campo_forms/show.html.erb within layouts/application (Duration: 0.4ms | GC: 0.1ms)
+Rendered layout layouts/application.html.erb (Duration: 0.7ms | GC: 0.1ms)
+ +

Completed 200 OK in 3ms (Views: 0.8ms | ActiveRecord: 0.6ms (2 queries, 0 cached) | GC: 0.1ms)

+ +
TRANSACTION (0.6ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_cf' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_cf@unb.br' LIMIT 1
+Docente Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:08.961731', NULL, NULL, NULL, NULL, 'doc_cf@unb.br', 'Doutorado', 'doc_cf', 'Docente CF', NULL, NULL, '$2a$12$flVZugtx9NbCgsIoAGVX3ODAnxEt78o4CcK4eU7ddw4BMpdqbfH62', 'Docente', '2026-06-30 17:32:08.961731')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:08.963817', 'Ciência da Computação', '2026-06-30 17:32:08.963817')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 105 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:32:08.965334', 105, 'Engenharia de Software', '2026-06-30 17:32:08.965334')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 48 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 48 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:32:08.966954', 48, NULL, 'TA', '2026.1', '2026-06-30 17:32:08.966954')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:32:08.967610', NULL, NULL, NULL, NULL, 45, '2026-06-30 17:32:08.967610')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:32:08.968402', NULL, 35, 1, NULL, '2026-06-30 17:32:08.968402')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.4ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:08.969158', 21, 'Opção A', 1, NULL, '2026-06-30 17:32:08.969158')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:08 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_cf@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_cf@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/95/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/campo_forms/8/edit” for 127.0.0.1 at 2026-06-30 14:32:09 -0300 Processing by CampoFormsController#edit as HTML

+ +
Parameters: {"id" => "8"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 95 LIMIT 1
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`id` = 8 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering campo_forms/edit.html.erb within layouts/application
+Rendered campo_forms/_form.html.erb (Duration: 0.5ms | GC: 0.0ms)
+Rendered campo_forms/edit.html.erb within layouts/application (Duration: 0.7ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.0ms | GC: 0.0ms)
+ +

Completed 200 OK in 3ms (Views: 1.1ms | ActiveRecord: 0.5ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_cf' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_cf@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:09.352899', NULL, NULL, NULL, NULL, 'doc_cf@unb.br', 'Doutorado', 'doc_cf', 'Docente CF', NULL, NULL, '$2a$12$yD5aV/kC7JRLD8gXO17qd.bwe618Qs7cLps4Qa411INQK8vMpF.au', 'Docente', '2026-06-30 17:32:09.352899')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:09.355243', 'Ciência da Computação', '2026-06-30 17:32:09.355243')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 106 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:32:09.356721', 106, 'Engenharia de Software', '2026-06-30 17:32:09.356721')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 49 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 49 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:32:09.358312', 49, NULL, 'TA', '2026.1', '2026-06-30 17:32:09.358312')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:32:09.358952', NULL, NULL, NULL, NULL, 46, '2026-06-30 17:32:09.358952')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:32:09.359708', NULL, 36, 1, NULL, '2026-06-30 17:32:09.359708')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.3ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:09.360457', 22, 'Opção A', 1, NULL, '2026-06-30 17:32:09.360457')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:09 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_cf@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_cf@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/96/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started PATCH “/campo_forms/9” for 127.0.0.1 at 2026-06-30 14:32:09 -0300 Processing by CampoFormsController#update as HTML

+ +
Parameters: {"campo_form" => {"ordem" => "1", "enunciado" => "Opção Atualizada", "elemento_form_id" => "22"}, "id" => "9"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 96 LIMIT 1
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`id` = 9 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Update (0.5ms)  UPDATE `campo_forms` SET `campo_forms`.`enunciado` = 'Opção Atualizada', `campo_forms`.`updated_at` = '2026-06-30 17:32:09.552064' WHERE `campo_forms`.`id` = 9
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/campo_forms/9 Completed 303 See Other in 3ms (ActiveRecord: 1.3ms (3 queries, 0 cached) | GC: 0.0ms)

+ +
CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`id` = 9 LIMIT 1
+TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_cf' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_cf@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:09.744194', NULL, NULL, NULL, NULL, 'doc_cf@unb.br', 'Doutorado', 'doc_cf', 'Docente CF', NULL, NULL, '$2a$12$Ky.84hsA2RFk1JGcymQdeeC7tXF0hvPYukkS.a7Wrpnr6qJrNZS0W', 'Docente', '2026-06-30 17:32:09.744194')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.5ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:09.746783', 'Ciência da Computação', '2026-06-30 17:32:09.746783')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 107 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:32:09.748325', 107, 'Engenharia de Software', '2026-06-30 17:32:09.748325')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 50 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.2ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 50 LIMIT 1
+Turma Create (0.1ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:32:09.749633', 50, NULL, 'TA', '2026.1', '2026-06-30 17:32:09.749633')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:32:09.750198', NULL, NULL, NULL, NULL, 47, '2026-06-30 17:32:09.750198')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:32:09.750987', NULL, 37, 1, NULL, '2026-06-30 17:32:09.750987')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.4ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:09.751793', 23, 'Opção A', 1, NULL, '2026-06-30 17:32:09.751793')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:09 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_cf@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_cf@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/97/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started PATCH “/campo_forms/10” for 127.0.0.1 at 2026-06-30 14:32:09 -0300 Processing by CampoFormsController#update as HTML

+ +
Parameters: {"campo_form" => {"ordem" => nil, "enunciado" => "X", "elemento_form_id" => "23"}, "id" => "10"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 97 LIMIT 1
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`id` = 10 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering campo_forms/edit.html.erb within layouts/application
+Rendered campo_forms/_form.html.erb (Duration: 0.7ms | GC: 0.0ms)
+Rendered campo_forms/edit.html.erb within layouts/application (Duration: 0.8ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.1ms | GC: 0.0ms)
+ +

Completed 422 Unprocessable Content in 3ms (Views: 1.2ms | ActiveRecord: 0.5ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_cf' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_cf@unb.br' LIMIT 1
+Docente Create (0.3ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:10.135826', NULL, NULL, NULL, NULL, 'doc_cf@unb.br', 'Doutorado', 'doc_cf', 'Docente CF', NULL, NULL, '$2a$12$w76NUp/iqwhVYDzx4zkTKOjxtRHE1fBWCjbWHIWm2iQApoBWQbIo.', 'Docente', '2026-06-30 17:32:10.135826')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:10.138057', 'Ciência da Computação', '2026-06-30 17:32:10.138057')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 108 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.4ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.1ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:32:10.139702', 108, 'Engenharia de Software', '2026-06-30 17:32:10.139702')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.1ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 51 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.5ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 51 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:32:10.141178', 51, NULL, 'TA', '2026.1', '2026-06-30 17:32:10.141178')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.2ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:32:10.141853', NULL, NULL, NULL, NULL, 48, '2026-06-30 17:32:10.141853')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.2ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:32:10.142528', NULL, 38, 1, NULL, '2026-06-30 17:32:10.142528')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.3ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:10.143087', 24, 'Opção A', 1, NULL, '2026-06-30 17:32:10.143087')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:10 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_cf@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_cf@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/98/avaliacoes Completed 302 Found in 195ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+CampoForm Create (0.5ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:10.339949', 24, NULL, 50, NULL, '2026-06-30 17:32:10.339949')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+CampoForm Count (0.2ms)  SELECT COUNT(*) FROM `campo_forms`
+ +

Started DELETE “/campo_forms/12” for 127.0.0.1 at 2026-06-30 14:32:10 -0300 Processing by CampoFormsController#destroy as HTML

+ +
Parameters: {"id" => "12"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 98 LIMIT 1
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`id` = 12 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaElem Load (0.4ms)  SELECT `resposta_elems`.* FROM `resposta_elems` WHERE `resposta_elems`.`campo_form_id` = 12
+CampoForm Destroy (0.2ms)  DELETE FROM `campo_forms` WHERE `campo_forms`.`id` = 12
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/campo_forms Completed 303 See Other in 2ms (ActiveRecord: 1.3ms (4 queries, 0 cached) | GC: 0.0ms)

+ +
CampoForm Count (0.2ms)  SELECT COUNT(*) FROM `campo_forms`
+TRANSACTION (1.3ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:10.347961', 'Ciência da Computação', '2026-06-30 17:32:10.347961')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_campo2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'adm_campo2@unb.br' LIMIT 1
+Administrador Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:10.537198', NULL, NULL, NULL, 109, 'adm_campo2@unb.br', NULL, 'adm_campo2', 'Admin Campo', NULL, NULL, '$2a$12$/CU0.5xbAz1LGrs2CHODseN5nUXILwQZ9HbWYEZsKgT9MB7jYJQS2', 'Administrador', '2026-06-30 17:32:10.537198')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Template Create (0.4ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:32:10.538489', 'Template Campo', '2026-06-30 17:32:10.538489', 99)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Elemento Create (0.4ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:32:10.539292', 'Q1', 1, 22, '2026-06-30 17:32:10.539292')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Campo Exists? (0.4ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` = 21 LIMIT 1
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:10.540583', 21, 'Opção A', 1, 'Multipla Escolha', '2026-06-30 17:32:10.540583')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:10 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "adm_campo2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'adm_campo2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/99/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started DELETE “/logout” for 127.0.0.1 at 2026-06-30 14:32:10 -0300 Processing by SessionsController#destroy as HTML Redirected to www.example.com/ Completed 302 Found in 0ms (ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 0.0ms) Started GET “/campos” for 127.0.0.1 at 2026-06-30 14:32:10 -0300 Processing by CamposController#index as HTML

+ +
Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+ +

Redirected to www.example.com/ Filter chain halted as :require_login rendered or redirected Completed 302 Found in 1ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.2ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:10.735919', 'Ciência da Computação', '2026-06-30 17:32:10.735919')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_campo2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'adm_campo2@unb.br' LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:10.925643', NULL, NULL, NULL, 110, 'adm_campo2@unb.br', NULL, 'adm_campo2', 'Admin Campo', NULL, NULL, '$2a$12$DaQeT7HxfC0dq62jw.F.FOdkJ9b9mSq9uX5cd8pltAjWPkZqxLMqS', 'Administrador', '2026-06-30 17:32:10.925643')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Template Create (0.4ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:32:10.927022', 'Template Campo', '2026-06-30 17:32:10.927022', 100)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Elemento Create (0.4ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:32:10.927905', 'Q1', 1, 23, '2026-06-30 17:32:10.927905')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Campo Exists? (0.5ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` = 22 LIMIT 1
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:10.929356', 22, 'Opção A', 1, 'Multipla Escolha', '2026-06-30 17:32:10.929356')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:10 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "adm_campo2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'adm_campo2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/100/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/campos” for 127.0.0.1 at 2026-06-30 14:32:11 -0300 Processing by CamposController#index as HTML

+ +
Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 100 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering campos/index.html.erb within layouts/application
+Campo Load (0.2ms)  SELECT `campos`.* FROM `campos`
+Rendered campos/_campo.html.erb (Duration: 0.1ms | GC: 0.0ms)
+Rendered campos/index.html.erb within layouts/application (Duration: 1.2ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.6ms | GC: 0.1ms)
+ +

Completed 200 OK in 3ms (Views: 1.7ms | ActiveRecord: 0.6ms (2 queries, 0 cached) | GC: 0.1ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:11.126383', 'Ciência da Computação', '2026-06-30 17:32:11.126383')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_campo2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'adm_campo2@unb.br' LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:11.316182', NULL, NULL, NULL, 111, 'adm_campo2@unb.br', NULL, 'adm_campo2', 'Admin Campo', NULL, NULL, '$2a$12$7jkSqZ8zHT0Yq/jC18gfyew2TgOScLItdyKvyENG.j8/uODClXMR6', 'Administrador', '2026-06-30 17:32:11.316182')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Template Create (0.5ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:32:11.317634', 'Template Campo', '2026-06-30 17:32:11.317634', 101)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Elemento Create (0.4ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:32:11.318623', 'Q1', 1, 24, '2026-06-30 17:32:11.318623')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Campo Exists? (0.4ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` = 23 LIMIT 1
+Campo Create (0.3ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:11.320035', 23, 'Opção A', 1, 'Multipla Escolha', '2026-06-30 17:32:11.320035')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:11 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "adm_campo2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'adm_campo2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/101/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/campos/new” for 127.0.0.1 at 2026-06-30 14:32:11 -0300 Processing by CamposController#new as HTML

+ +
Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 101 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering campos/new.html.erb within layouts/application
+Rendered campos/_form.html.erb (Duration: 0.7ms | GC: 0.0ms)
+Rendered campos/new.html.erb within layouts/application (Duration: 1.1ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.3ms | GC: 0.0ms)
+ +

Completed 200 OK in 3ms (Views: 1.5ms | ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:11.517278', 'Ciência da Computação', '2026-06-30 17:32:11.517278')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_campo2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'adm_campo2@unb.br' LIMIT 1
+Administrador Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:11.706236', NULL, NULL, NULL, 112, 'adm_campo2@unb.br', NULL, 'adm_campo2', 'Admin Campo', NULL, NULL, '$2a$12$m1iSBi5SGSWtZOaJNYnZcu4Jjet.gwdtvqAg7xepTxbHxBvEeAN5G', 'Administrador', '2026-06-30 17:32:11.706236')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Template Create (0.4ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:32:11.707503', 'Template Campo', '2026-06-30 17:32:11.707503', 102)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Elemento Create (0.4ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:32:11.708328', 'Q1', 1, 25, '2026-06-30 17:32:11.708328')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Campo Exists? (0.4ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` = 24 LIMIT 1
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:11.709662', 24, 'Opção A', 1, 'Multipla Escolha', '2026-06-30 17:32:11.709662')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:11 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "adm_campo2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'adm_campo2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/102/avaliacoes Completed 302 Found in 193ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Campo Count (0.3ms)  SELECT COUNT(*) FROM `campos`
+ +

Started POST “/campos” for 127.0.0.1 at 2026-06-30 14:32:11 -0300 Processing by CamposController#create as HTML

+ +
Parameters: {"campo" => {"ordem" => "99", "tipo_elemento" => "Texto", "enunciado" => "Novo campo", "elemento_id" => "24"}}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 102 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Elemento Load (0.4ms)  SELECT `elementos`.* FROM `elementos` WHERE `elementos`.`id` = 24 LIMIT 1
+Campo Exists? (0.2ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 99 AND `campos`.`elemento_id` = 24 LIMIT 1
+Campo Create (0.3ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:11.907800', 24, 'Novo campo', 99, 'Texto', '2026-06-30 17:32:11.907800')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/campos/7 Completed 302 Found in 3ms (ActiveRecord: 1.5ms (4 queries, 0 cached) | GC: 0.0ms)

+ +
Campo Count (0.2ms)  SELECT COUNT(*) FROM `campos`
+Campo Load (0.2ms)  SELECT `campos`.* FROM `campos` ORDER BY `campos`.`id` DESC LIMIT 1
+TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:11.911989', 'Ciência da Computação', '2026-06-30 17:32:11.911989')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_campo2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'adm_campo2@unb.br' LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:12.100833', NULL, NULL, NULL, 113, 'adm_campo2@unb.br', NULL, 'adm_campo2', 'Admin Campo', NULL, NULL, '$2a$12$se2mnSt.RHKSw6LZMvCtHeOHpnt/0C.bbJKJfgglugKNZ6NXG7hlu', 'Administrador', '2026-06-30 17:32:12.100833')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Template Create (0.4ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:32:12.102039', 'Template Campo', '2026-06-30 17:32:12.102039', 103)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Elemento Create (0.4ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:32:12.102845', 'Q1', 1, 26, '2026-06-30 17:32:12.102845')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Campo Exists? (0.4ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` = 25 LIMIT 1
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:12.104138', 25, 'Opção A', 1, 'Multipla Escolha', '2026-06-30 17:32:12.104138')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:12 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "adm_campo2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'adm_campo2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/103/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Campo Count (0.3ms)  SELECT COUNT(*) FROM `campos`
+ +

Started POST “/campos” for 127.0.0.1 at 2026-06-30 14:32:12 -0300 Processing by CamposController#create as HTML

+ +
Parameters: {"campo" => {"ordem" => "2", "tipo_elemento" => "", "enunciado" => "X", "elemento_id" => "25"}}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 103 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Elemento Load (0.4ms)  SELECT `elementos`.* FROM `elementos` WHERE `elementos`.`id` = 25 LIMIT 1
+Campo Exists? (0.2ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 2 AND `campos`.`elemento_id` = 25 LIMIT 1
+TRANSACTION (0.1ms)  ROLLBACK TO SAVEPOINT active_record_1
+Rendering layout layouts/application.html.erb
+Rendering campos/new.html.erb within layouts/application
+Rendered campos/_form.html.erb (Duration: 0.8ms | GC: 0.0ms)
+Rendered campos/new.html.erb within layouts/application (Duration: 0.9ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.1ms | GC: 0.0ms)
+ +

Completed 422 Unprocessable Content in 4ms (Views: 1.3ms | ActiveRecord: 1.2ms (3 queries, 0 cached) | GC: 0.0ms)

+ +
Campo Count (0.2ms)  SELECT COUNT(*) FROM `campos`
+TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:12.300950', 'Ciência da Computação', '2026-06-30 17:32:12.300950')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_campo2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'adm_campo2@unb.br' LIMIT 1
+Administrador Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:12.489784', NULL, NULL, NULL, 114, 'adm_campo2@unb.br', NULL, 'adm_campo2', 'Admin Campo', NULL, NULL, '$2a$12$WU95GizrWJuC1FX0nim9Ve2M2gaaQQQGnf3qcbPYeRyCqVY4P/qyK', 'Administrador', '2026-06-30 17:32:12.489784')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Template Create (0.4ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:32:12.490823', 'Template Campo', '2026-06-30 17:32:12.490823', 104)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Elemento Create (0.4ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:32:12.491601', 'Q1', 1, 27, '2026-06-30 17:32:12.491601')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Campo Exists? (0.4ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` = 26 LIMIT 1
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:12.492893', 26, 'Opção A', 1, 'Multipla Escolha', '2026-06-30 17:32:12.492893')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:12 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "adm_campo2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'adm_campo2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/104/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/campos/9” for 127.0.0.1 at 2026-06-30 14:32:12 -0300 Processing by CamposController#show as HTML

+ +
Parameters: {"id" => "9"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 104 LIMIT 1
+Campo Load (0.2ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`id` = 9 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering campos/show.html.erb within layouts/application
+Rendered campos/_campo.html.erb (Duration: 0.0ms | GC: 0.0ms)
+Rendered campos/show.html.erb within layouts/application (Duration: 0.4ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.6ms | GC: 0.0ms)
+ +

Completed 200 OK in 3ms (Views: 0.7ms | ActiveRecord: 0.5ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:12.687235', 'Ciência da Computação', '2026-06-30 17:32:12.687235')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_campo2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'adm_campo2@unb.br' LIMIT 1
+Administrador Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:12.876510', NULL, NULL, NULL, 115, 'adm_campo2@unb.br', NULL, 'adm_campo2', 'Admin Campo', NULL, NULL, '$2a$12$0NWsZKPzpTO46s4gobbmZe.DIfstr1e17MI.VW67lE.woFb6yOOvG', 'Administrador', '2026-06-30 17:32:12.876510')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Template Create (0.5ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:32:12.878025', 'Template Campo', '2026-06-30 17:32:12.878025', 105)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Elemento Create (0.4ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:32:12.878949', 'Q1', 1, 28, '2026-06-30 17:32:12.878949')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Campo Exists? (0.5ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` = 27 LIMIT 1
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:12.880394', 27, 'Opção A', 1, 'Multipla Escolha', '2026-06-30 17:32:12.880394')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:12 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "adm_campo2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'adm_campo2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/105/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/campos/10/edit” for 127.0.0.1 at 2026-06-30 14:32:13 -0300 Processing by CamposController#edit as HTML

+ +
Parameters: {"id" => "10"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 105 LIMIT 1
+Campo Load (0.2ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`id` = 10 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering campos/edit.html.erb within layouts/application
+Rendered campos/_form.html.erb (Duration: 0.5ms | GC: 0.0ms)
+Rendered campos/edit.html.erb within layouts/application (Duration: 0.8ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.0ms | GC: 0.0ms)
+ +

Completed 200 OK in 3ms (Views: 1.1ms | ActiveRecord: 0.6ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:13.075715', 'Ciência da Computação', '2026-06-30 17:32:13.075715')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_campo2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'adm_campo2@unb.br' LIMIT 1
+Administrador Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:13.264502', NULL, NULL, NULL, 116, 'adm_campo2@unb.br', NULL, 'adm_campo2', 'Admin Campo', NULL, NULL, '$2a$12$ARiz9S/cflbVaxbjW4MnWuqH3KnbJcyVYKnHxPrY050BDbhRSRoum', 'Administrador', '2026-06-30 17:32:13.264502')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Template Create (0.5ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:32:13.265925', 'Template Campo', '2026-06-30 17:32:13.265925', 106)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Elemento Create (0.4ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:32:13.266866', 'Q1', 1, 29, '2026-06-30 17:32:13.266866')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Campo Exists? (0.5ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` = 28 LIMIT 1
+Campo Create (0.3ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:13.268359', 28, 'Opção A', 1, 'Multipla Escolha', '2026-06-30 17:32:13.268359')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:13 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "adm_campo2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'adm_campo2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/106/avaliacoes Completed 302 Found in 190ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started PATCH “/campos/11” for 127.0.0.1 at 2026-06-30 14:32:13 -0300 Processing by CamposController#update as HTML

+ +
Parameters: {"campo" => {"ordem" => "1", "tipo_elemento" => "Texto", "enunciado" => "Atualizado", "elemento_id" => "28"}, "id" => "11"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 106 LIMIT 1
+Campo Load (0.3ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`id` = 11 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Campo Exists? (0.2ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`id` != 11 AND `campos`.`elemento_id` = 28 LIMIT 1
+Campo Update (0.2ms)  UPDATE `campos` SET `campos`.`enunciado` = 'Atualizado', `campos`.`tipo_elemento` = 'Texto', `campos`.`updated_at` = '2026-06-30 17:32:13.464661' WHERE `campos`.`id` = 11
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/campos/11 Completed 303 See Other in 5ms (ActiveRecord: 3.0ms (4 queries, 0 cached) | GC: 0.0ms)

+ +
Campo Load (0.2ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`id` = 11 LIMIT 1
+TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.1ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:13.468133', 'Ciência da Computação', '2026-06-30 17:32:13.468133')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_campo2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'adm_campo2@unb.br' LIMIT 1
+Administrador Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:13.658568', NULL, NULL, NULL, 117, 'adm_campo2@unb.br', NULL, 'adm_campo2', 'Admin Campo', NULL, NULL, '$2a$12$Kgj3FCLwOoJrtoG35caNUO64qz8FDS9.9J.aFryDX1gbqeKPZIudy', 'Administrador', '2026-06-30 17:32:13.658568')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Template Create (0.5ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:32:13.660240', 'Template Campo', '2026-06-30 17:32:13.660240', 107)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Elemento Create (0.5ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:32:13.661193', 'Q1', 1, 30, '2026-06-30 17:32:13.661193')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Campo Exists? (0.5ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` = 29 LIMIT 1
+Campo Create (0.3ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:13.662724', 29, 'Opção A', 1, 'Multipla Escolha', '2026-06-30 17:32:13.662724')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:13 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "adm_campo2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'adm_campo2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/107/avaliacoes Completed 302 Found in 191ms (ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms) Started PATCH “/campos/12” for 127.0.0.1 at 2026-06-30 14:32:13 -0300 Processing by CamposController#update as HTML

+ +
Parameters: {"campo" => {"ordem" => "1", "tipo_elemento" => "", "enunciado" => "X", "elemento_id" => "29"}, "id" => "12"}
+Usuario Load (0.5ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 107 LIMIT 1
+Campo Load (0.3ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`id` = 12 LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Campo Exists? (0.5ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`id` != 12 AND `campos`.`elemento_id` = 29 LIMIT 1
+TRANSACTION (0.2ms)  ROLLBACK TO SAVEPOINT active_record_1
+Rendering layout layouts/application.html.erb
+Rendering campos/edit.html.erb within layouts/application
+Rendered campos/_form.html.erb (Duration: 0.8ms | GC: 0.0ms)
+Rendered campos/edit.html.erb within layouts/application (Duration: 0.9ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.1ms | GC: 0.0ms)
+ +

Completed 422 Unprocessable Content in 4ms (Views: 1.3ms | ActiveRecord: 1.6ms (3 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.2ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:13.868172', 'Ciência da Computação', '2026-06-30 17:32:13.868172')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_campo2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'adm_campo2@unb.br' LIMIT 1
+Administrador Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:14.059043', NULL, NULL, NULL, 118, 'adm_campo2@unb.br', NULL, 'adm_campo2', 'Admin Campo', NULL, NULL, '$2a$12$YQ9kSm4BgrB2b7M2U/QdZ.qb.UFslKNnBxxOMco7A4vnBirnY1ZaO', 'Administrador', '2026-06-30 17:32:14.059043')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Template Create (0.3ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:32:14.060560', 'Template Campo', '2026-06-30 17:32:14.060560', 108)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Elemento Create (0.4ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:32:14.061303', 'Q1', 1, 31, '2026-06-30 17:32:14.061303')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Campo Exists? (0.5ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` = 30 LIMIT 1
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:14.062730', 30, 'Opção A', 1, 'Multipla Escolha', '2026-06-30 17:32:14.062730')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:14 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "adm_campo2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'adm_campo2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/108/avaliacoes Completed 302 Found in 237ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Campo Exists? (0.6ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 50 AND `campos`.`elemento_id` = 30 LIMIT 1
+Campo Create (0.4ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:14.302377', 30, NULL, 50, 'Texto', '2026-06-30 17:32:14.302377')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Campo Count (0.2ms)  SELECT COUNT(*) FROM `campos`
+ +

Started DELETE “/campos/14” for 127.0.0.1 at 2026-06-30 14:32:14 -0300 Processing by CamposController#destroy as HTML

+ +
Parameters: {"id" => "14"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 108 LIMIT 1
+Campo Load (0.2ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`id` = 14 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Campo Destroy (0.4ms)  DELETE FROM `campos` WHERE `campos`.`id` = 14
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/campos Completed 303 See Other in 2ms (ActiveRecord: 1.0ms (3 queries, 0 cached) | GC: 0.0ms)

+ +
Campo Count (0.2ms)  SELECT COUNT(*) FROM `campos`
+TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_cursos' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_cursos@unb.br' LIMIT 1
+Docente Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:14.502301', NULL, NULL, NULL, NULL, 'doc_cursos@unb.br', 'Doutorado', 'doc_cursos', 'Docente Cursos', NULL, NULL, '$2a$12$3TM/onYGWE4IkszoHQb6MObGZEiw3d5BwTtTMEV8MiMRJYp9BeJVW', 'Docente', '2026-06-30 17:32:14.502301')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.5ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.8ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:14.505220', 'Ciência da Computação', '2026-06-30 17:32:14.505220')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Curso Exists? (0.3ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`codigo` = 'ESW01' LIMIT 1
+Curso Create (0.2ms)  INSERT INTO `cursos` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('ESW01', '2026-06-30 17:32:14.506286', 119, 'Engenharia de Software', '2026-06-30 17:32:14.506286')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:14 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_cursos@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_cursos@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/109/avaliacoes Completed 302 Found in 191ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started DELETE “/logout” for 127.0.0.1 at 2026-06-30 14:32:14 -0300 Processing by SessionsController#destroy as HTML Redirected to www.example.com/ Completed 302 Found in 0ms (ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 0.0ms) Started GET “/cursos” for 127.0.0.1 at 2026-06-30 14:32:14 -0300 Processing by CursosController#index as HTML

+ +
Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+ +

Redirected to www.example.com/ Filter chain halted as :require_login rendered or redirected Completed 302 Found in 1ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.5ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_cursos' LIMIT 1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_cursos@unb.br' LIMIT 1
+Docente Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:14.894356', NULL, NULL, NULL, NULL, 'doc_cursos@unb.br', 'Doutorado', 'doc_cursos', 'Docente Cursos', NULL, NULL, '$2a$12$hs7CvRnqmtUSJY3cn/DYSenp7uPoH0NKTUFg2HWKG9XgwKLdfi4ne', 'Docente', '2026-06-30 17:32:14.894356')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:14.896953', 'Ciência da Computação', '2026-06-30 17:32:14.896953')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Curso Exists? (0.4ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`codigo` = 'ESW01' LIMIT 1
+Curso Create (0.2ms)  INSERT INTO `cursos` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('ESW01', '2026-06-30 17:32:14.898179', 120, 'Engenharia de Software', '2026-06-30 17:32:14.898179')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:14 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_cursos@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_cursos@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/110/avaliacoes Completed 302 Found in 190ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/cursos” for 127.0.0.1 at 2026-06-30 14:32:15 -0300 Processing by CursosController#index as HTML

+ +
Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 110 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering cursos/index.html.erb within layouts/application
+Curso Load (0.2ms)  SELECT `cursos`.* FROM `cursos`
+Rendered cursos/_curso.html.erb (Duration: 0.1ms | GC: 0.0ms)
+Rendered cursos/index.html.erb within layouts/application (Duration: 1.5ms | GC: 0.2ms)
+Rendered layout layouts/application.html.erb (Duration: 1.7ms | GC: 0.2ms)
+ +

Completed 200 OK in 4ms (Views: 2.0ms | ActiveRecord: 0.6ms (2 queries, 0 cached) | GC: 0.2ms)

+ +
TRANSACTION (0.3ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_cursos' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_cursos@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:15.309871', NULL, NULL, NULL, NULL, 'doc_cursos@unb.br', 'Doutorado', 'doc_cursos', 'Docente Cursos', NULL, NULL, '$2a$12$q8QBDtarmabf3qP8ut0Zpuv55LxYGH0Omh6xXatp7h2LQbEpXBoma', 'Docente', '2026-06-30 17:32:15.309871')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:15.312261', 'Ciência da Computação', '2026-06-30 17:32:15.312261')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Curso Exists? (0.5ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`codigo` = 'ESW01' LIMIT 1
+Curso Create (0.2ms)  INSERT INTO `cursos` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('ESW01', '2026-06-30 17:32:15.313543', 121, 'Engenharia de Software', '2026-06-30 17:32:15.313543')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:15 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_cursos@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_cursos@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/111/avaliacoes Completed 302 Found in 201ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/cursos/new” for 127.0.0.1 at 2026-06-30 14:32:15 -0300 Processing by CursosController#new as HTML

+ +
Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 111 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering cursos/new.html.erb within layouts/application
+Rendered cursos/_form.html.erb (Duration: 0.7ms | GC: 0.0ms)
+Rendered cursos/new.html.erb within layouts/application (Duration: 1.2ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 3ms (Views: 1.6ms | ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.5ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_cursos' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_cursos@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:15.713256', NULL, NULL, NULL, NULL, 'doc_cursos@unb.br', 'Doutorado', 'doc_cursos', 'Docente Cursos', NULL, NULL, '$2a$12$dEiAD8FNXiv3otI1B6nQiO95zDsPQHA7S0sy24rXXYIrTJGmArsya', 'Docente', '2026-06-30 17:32:15.713256')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Exists? (1.9ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:15.717258', 'Ciência da Computação', '2026-06-30 17:32:15.717258')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Curso Exists? (0.9ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`codigo` = 'ESW01' LIMIT 1
+Curso Create (0.1ms)  INSERT INTO `cursos` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('ESW01', '2026-06-30 17:32:15.721732', 122, 'Engenharia de Software', '2026-06-30 17:32:15.721732')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:15 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_cursos@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_cursos@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/112/avaliacoes Completed 302 Found in 190ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Curso Count (0.4ms)  SELECT COUNT(*) FROM `cursos`
+ +

Started POST “/cursos” for 127.0.0.1 at 2026-06-30 14:32:15 -0300 Processing by CursosController#create as HTML

+ +
Parameters: {"curso" => {"nome" => "Novo Curso", "codigo" => "NC01", "departamento_id" => "122"}}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 112 LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Load (0.5ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`id` = 122 LIMIT 1
+Curso Exists? (0.3ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`codigo` = 'NC01' LIMIT 1
+Curso Create (0.2ms)  INSERT INTO `cursos` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('NC01', '2026-06-30 17:32:15.916832', 122, 'Novo Curso', '2026-06-30 17:32:15.916832')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/cursos/7 Completed 302 Found in 3ms (ActiveRecord: 1.6ms (4 queries, 0 cached) | GC: 0.0ms)

+ +
Curso Count (0.2ms)  SELECT COUNT(*) FROM `cursos`
+Curso Load (0.2ms)  SELECT `cursos`.* FROM `cursos` ORDER BY `cursos`.`id` DESC LIMIT 1
+TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_cursos' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_cursos@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:16.110575', NULL, NULL, NULL, NULL, 'doc_cursos@unb.br', 'Doutorado', 'doc_cursos', 'Docente Cursos', NULL, NULL, '$2a$12$eDVtuLCDOo.LapafweyMmuIPUuymO6l5L9EkAPMBJjSVL8qYhlknK', 'Docente', '2026-06-30 17:32:16.110575')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:16.113003', 'Ciência da Computação', '2026-06-30 17:32:16.113003')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Curso Exists? (0.4ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`codigo` = 'ESW01' LIMIT 1
+Curso Create (0.3ms)  INSERT INTO `cursos` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('ESW01', '2026-06-30 17:32:16.114158', 123, 'Engenharia de Software', '2026-06-30 17:32:16.114158')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:16 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_cursos@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_cursos@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/113/avaliacoes Completed 302 Found in 191ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Curso Count (0.4ms)  SELECT COUNT(*) FROM `cursos`
+ +

Started POST “/cursos” for 127.0.0.1 at 2026-06-30 14:32:16 -0300 Processing by CursosController#create as HTML

+ +
Parameters: {"curso" => {"nome" => "", "codigo" => "", "departamento_id" => "123"}}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 113 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`id` = 123 LIMIT 1
+Curso Exists? (0.2ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`codigo` = '' LIMIT 1
+TRANSACTION (0.1ms)  ROLLBACK TO SAVEPOINT active_record_1
+Rendering layout layouts/application.html.erb
+Rendering cursos/new.html.erb within layouts/application
+Rendered cursos/_form.html.erb (Duration: 1.1ms | GC: 0.1ms)
+Rendered cursos/new.html.erb within layouts/application (Duration: 1.1ms | GC: 0.1ms)
+Rendered layout layouts/application.html.erb (Duration: 1.4ms | GC: 0.1ms)
+ +

Completed 422 Unprocessable Content in 4ms (Views: 1.5ms | ActiveRecord: 1.0ms (3 queries, 0 cached) | GC: 0.1ms)

+ +
Curso Count (0.2ms)  SELECT COUNT(*) FROM `cursos`
+TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_cursos' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_cursos@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:16.503258', NULL, NULL, NULL, NULL, 'doc_cursos@unb.br', 'Doutorado', 'doc_cursos', 'Docente Cursos', NULL, NULL, '$2a$12$D48Dq4fBVlfvwIMchTrRUeX9JlabheUmiu2PCW4lpMRRUrrK7FAya', 'Docente', '2026-06-30 17:32:16.503258')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:16.505824', 'Ciência da Computação', '2026-06-30 17:32:16.505824')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Curso Exists? (0.4ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`codigo` = 'ESW01' LIMIT 1
+Curso Create (0.4ms)  INSERT INTO `cursos` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('ESW01', '2026-06-30 17:32:16.507105', 124, 'Engenharia de Software', '2026-06-30 17:32:16.507105')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:16 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_cursos@unb.br", "senha" => "Senha123"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_cursos@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/114/avaliacoes Completed 302 Found in 191ms (ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/cursos/9” for 127.0.0.1 at 2026-06-30 14:32:16 -0300 Processing by CursosController#show as HTML

+ +
Parameters: {"id" => "9"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 114 LIMIT 1
+Curso Load (0.2ms)  SELECT `cursos`.* FROM `cursos` WHERE `cursos`.`id` = 9 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering cursos/show.html.erb within layouts/application
+Rendered cursos/_curso.html.erb (Duration: 0.0ms | GC: 0.0ms)
+Rendered cursos/show.html.erb within layouts/application (Duration: 0.4ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.6ms | GC: 0.0ms)
+ +

Completed 200 OK in 3ms (Views: 0.8ms | ActiveRecord: 0.5ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_cursos' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_cursos@unb.br' LIMIT 1
+Docente Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:16.896473', NULL, NULL, NULL, NULL, 'doc_cursos@unb.br', 'Doutorado', 'doc_cursos', 'Docente Cursos', NULL, NULL, '$2a$12$xZcYn7OB1CB0O3EvvKLiUuBgm/.Zdk.9D6AmuzX/WhXwTONqgaIci', 'Docente', '2026-06-30 17:32:16.896473')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:16.898931', 'Ciência da Computação', '2026-06-30 17:32:16.898931')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Curso Exists? (0.4ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`codigo` = 'ESW01' LIMIT 1
+Curso Create (0.2ms)  INSERT INTO `cursos` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('ESW01', '2026-06-30 17:32:16.900139', 125, 'Engenharia de Software', '2026-06-30 17:32:16.900139')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:16 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_cursos@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_cursos@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/115/avaliacoes Completed 302 Found in 191ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/cursos/10/edit” for 127.0.0.1 at 2026-06-30 14:32:17 -0300 Processing by CursosController#edit as HTML

+ +
Parameters: {"id" => "10"}
+Usuario Load (0.5ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 115 LIMIT 1
+Curso Load (0.3ms)  SELECT `cursos`.* FROM `cursos` WHERE `cursos`.`id` = 10 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering cursos/edit.html.erb within layouts/application
+Rendered cursos/_form.html.erb (Duration: 0.5ms | GC: 0.0ms)
+Rendered cursos/edit.html.erb within layouts/application (Duration: 0.7ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.0ms | GC: 0.0ms)
+ +

Completed 200 OK in 4ms (Views: 1.2ms | ActiveRecord: 0.7ms (2 queries, 0 cached) | GC: 0.1ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_cursos' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_cursos@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:17.287781', NULL, NULL, NULL, NULL, 'doc_cursos@unb.br', 'Doutorado', 'doc_cursos', 'Docente Cursos', NULL, NULL, '$2a$12$FrMJ0cQ7bq2Feae4BvkHlercORlfgluB2W2Swm5swqO1v4732zSfS', 'Docente', '2026-06-30 17:32:17.287781')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.6ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.5ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:17.290694', 'Ciência da Computação', '2026-06-30 17:32:17.290694')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Curso Exists? (0.2ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`codigo` = 'ESW01' LIMIT 1
+Curso Create (0.1ms)  INSERT INTO `cursos` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('ESW01', '2026-06-30 17:32:17.291706', 126, 'Engenharia de Software', '2026-06-30 17:32:17.291706')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:17 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_cursos@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_cursos@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/116/avaliacoes Completed 302 Found in 197ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started PATCH “/cursos/11” for 127.0.0.1 at 2026-06-30 14:32:17 -0300 Processing by CursosController#update as HTML

+ +
Parameters: {"curso" => {"nome" => "Nome Atualizado", "codigo" => "ESW01", "departamento_id" => "126"}, "id" => "11"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 116 LIMIT 1
+Curso Load (0.1ms)  SELECT `cursos`.* FROM `cursos` WHERE `cursos`.`id` = 11 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Curso Update (0.4ms)  UPDATE `cursos` SET `cursos`.`nome` = 'Nome Atualizado', `cursos`.`updated_at` = '2026-06-30 17:32:17.493790' WHERE `cursos`.`id` = 11
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/cursos/11 Completed 303 See Other in 4ms (ActiveRecord: 3.0ms (3 queries, 0 cached) | GC: 0.0ms)

+ +
Curso Load (0.2ms)  SELECT `cursos`.* FROM `cursos` WHERE `cursos`.`id` = 11 LIMIT 1
+TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_cursos' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_cursos@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:17.688638', NULL, NULL, NULL, NULL, 'doc_cursos@unb.br', 'Doutorado', 'doc_cursos', 'Docente Cursos', NULL, NULL, '$2a$12$kxVY2uK3kLBLAP/dNDWJMeIrbc9Xw6urMvKMbx1eJidYd2RNdPSr6', 'Docente', '2026-06-30 17:32:17.688638')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.5ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:17.691771', 'Ciência da Computação', '2026-06-30 17:32:17.691771')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Curso Exists? (0.4ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`codigo` = 'ESW01' LIMIT 1
+Curso Create (0.3ms)  INSERT INTO `cursos` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('ESW01', '2026-06-30 17:32:17.693022', 127, 'Engenharia de Software', '2026-06-30 17:32:17.693022')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:17 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_cursos@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_cursos@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/117/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started PATCH “/cursos/12” for 127.0.0.1 at 2026-06-30 14:32:17 -0300 Processing by CursosController#update as HTML

+ +
Parameters: {"curso" => {"nome" => "", "codigo" => "", "departamento_id" => "127"}, "id" => "12"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 117 LIMIT 1
+Curso Load (0.2ms)  SELECT `cursos`.* FROM `cursos` WHERE `cursos`.`id` = 12 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Curso Exists? (0.4ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`codigo` = '' AND `cursos`.`id` != 12 LIMIT 1
+TRANSACTION (0.1ms)  ROLLBACK TO SAVEPOINT active_record_1
+Rendering layout layouts/application.html.erb
+Rendering cursos/edit.html.erb within layouts/application
+Rendered cursos/_form.html.erb (Duration: 1.0ms | GC: 0.0ms)
+Rendered cursos/edit.html.erb within layouts/application (Duration: 1.1ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.4ms | GC: 0.0ms)
+ +

Completed 422 Unprocessable Content in 4ms (Views: 1.5ms | ActiveRecord: 1.3ms (3 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_cursos' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_cursos@unb.br' LIMIT 1
+Docente Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:18.078402', NULL, NULL, NULL, NULL, 'doc_cursos@unb.br', 'Doutorado', 'doc_cursos', 'Docente Cursos', NULL, NULL, '$2a$12$ymtQ6Y9F9hlmnp.jrD/ai.aJukJZ1c1EwQkM5SMNo3FwZEY9if7xK', 'Docente', '2026-06-30 17:32:18.078402')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:18.080829', 'Ciência da Computação', '2026-06-30 17:32:18.080829')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Curso Exists? (0.3ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`codigo` = 'ESW01' LIMIT 1
+Curso Create (0.3ms)  INSERT INTO `cursos` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('ESW01', '2026-06-30 17:32:18.081979', 128, 'Engenharia de Software', '2026-06-30 17:32:18.081979')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:18 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_cursos@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_cursos@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/118/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Curso Count (0.3ms)  SELECT COUNT(*) FROM `cursos`
+ +

Started DELETE “/cursos/13” for 127.0.0.1 at 2026-06-30 14:32:18 -0300 Processing by CursosController#destroy as HTML

+ +
Parameters: {"id" => "13"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 118 LIMIT 1
+Curso Load (0.2ms)  SELECT `cursos`.* FROM `cursos` WHERE `cursos`.`id` = 13 LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Curso Destroy (0.5ms)  DELETE FROM `cursos` WHERE `cursos`.`id` = 13
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/cursos Completed 303 See Other in 2ms (ActiveRecord: 1.4ms (3 queries, 0 cached) | GC: 0.1ms)

+ +
Curso Count (0.2ms)  SELECT COUNT(*) FROM `cursos`
+TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.2ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_dep' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_dep@unb.br' LIMIT 1
+Docente Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:18.464973', NULL, NULL, NULL, NULL, 'doc_dep@unb.br', 'Doutorado', 'doc_dep', 'Docente Dep', NULL, NULL, '$2a$12$Fg960E/5qYbDO5T.JajDH.hLs8Apq3uddwxz2GAw0D/i4Nl5QRxSO', 'Docente', '2026-06-30 17:32:18.464973')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.5ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'MAT01' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('MAT01', '2026-06-30 17:32:18.466861', 'Matemática', '2026-06-30 17:32:18.466861')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:18 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_dep@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_dep@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/119/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.1ms) Started DELETE “/logout” for 127.0.0.1 at 2026-06-30 14:32:18 -0300 Processing by SessionsController#destroy as HTML Redirected to www.example.com/ Completed 302 Found in 0ms (ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 0.0ms) Started GET “/departamentos” for 127.0.0.1 at 2026-06-30 14:32:18 -0300 Processing by DepartamentosController#index as HTML

+ +
Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+ +

Redirected to www.example.com/ Filter chain halted as :require_login rendered or redirected Completed 302 Found in 1ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_dep' LIMIT 1
+Usuario Exists? (0.9ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_dep@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:18.850185', NULL, NULL, NULL, NULL, 'doc_dep@unb.br', 'Doutorado', 'doc_dep', 'Docente Dep', NULL, NULL, '$2a$12$0hCe89y7Xa.usZ1pNtifaetD1TzgkRi.MxZYZghU8MA2s/uhYvHz2', 'Docente', '2026-06-30 17:32:18.850185')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.5ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'MAT01' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('MAT01', '2026-06-30 17:32:18.852259', 'Matemática', '2026-06-30 17:32:18.852259')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:18 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_dep@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_dep@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/120/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/departamentos” for 127.0.0.1 at 2026-06-30 14:32:19 -0300 Processing by DepartamentosController#index as HTML

+ +
Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 120 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering departamentos/index.html.erb within layouts/application
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos`
+Rendered departamentos/_departamento.html.erb (Duration: 0.1ms | GC: 0.0ms)
+Rendered departamentos/index.html.erb within layouts/application (Duration: 1.4ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.6ms | GC: 0.0ms)
+ +

Completed 200 OK in 4ms (Views: 1.7ms | ActiveRecord: 0.7ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.2ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_dep' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_dep@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:19.236480', NULL, NULL, NULL, NULL, 'doc_dep@unb.br', 'Doutorado', 'doc_dep', 'Docente Dep', NULL, NULL, '$2a$12$oo9x/ebUnEWsNzOrfH0jfOqS9GiJr34Siw1I1zTzpzR7zIbrLy6Dy', 'Docente', '2026-06-30 17:32:19.236480')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.5ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'MAT01' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('MAT01', '2026-06-30 17:32:19.238287', 'Matemática', '2026-06-30 17:32:19.238287')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:19 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_dep@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_dep@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/121/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/departamentos/new” for 127.0.0.1 at 2026-06-30 14:32:19 -0300 Processing by DepartamentosController#new as HTML

+ +
Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 121 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering departamentos/new.html.erb within layouts/application
+Rendered departamentos/_form.html.erb (Duration: 0.5ms | GC: 0.0ms)
+Rendered departamentos/new.html.erb within layouts/application (Duration: 0.9ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.2ms | GC: 0.1ms)
+ +

Completed 200 OK in 3ms (Views: 1.4ms | ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.1ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_dep' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_dep@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:19.620360', NULL, NULL, NULL, NULL, 'doc_dep@unb.br', 'Doutorado', 'doc_dep', 'Docente Dep', NULL, NULL, '$2a$12$IVj4YRWOhhxFLIGM66BJOuwdlXxfdoNJMB138XJhNbo/qLO5RHFGC', 'Docente', '2026-06-30 17:32:19.620360')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.5ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'MAT01' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('MAT01', '2026-06-30 17:32:19.622305', 'Matemática', '2026-06-30 17:32:19.622305')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:19 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_dep@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_dep@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/122/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Departamento Count (0.3ms)  SELECT COUNT(*) FROM `departamentos`
+ +

Started POST “/departamentos” for 127.0.0.1 at 2026-06-30 14:32:19 -0300 Processing by DepartamentosController#create as HTML

+ +
Parameters: {"departamento" => {"nome" => "Física", "codigo" => "FIS01"}}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 122 LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'FIS01' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('FIS01', '2026-06-30 17:32:19.814911', 'Física', '2026-06-30 17:32:19.814911')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/departamentos/133 Completed 302 Found in 3ms (ActiveRecord: 1.4ms (3 queries, 0 cached) | GC: 0.0ms)

+ +
Departamento Count (0.2ms)  SELECT COUNT(*) FROM `departamentos`
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` ORDER BY `departamentos`.`id` DESC LIMIT 1
+TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_dep' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_dep@unb.br' LIMIT 1
+Docente Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:20.006730', NULL, NULL, NULL, NULL, 'doc_dep@unb.br', 'Doutorado', 'doc_dep', 'Docente Dep', NULL, NULL, '$2a$12$91TkMdCungxztdUvihY6F.KLLaFx3eiXmuklUXUypG/3FXB3wO6VG', 'Docente', '2026-06-30 17:32:20.006730')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'MAT01' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('MAT01', '2026-06-30 17:32:20.008517', 'Matemática', '2026-06-30 17:32:20.008517')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:20 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_dep@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_dep@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/123/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Departamento Count (0.3ms)  SELECT COUNT(*) FROM `departamentos`
+ +

Started POST “/departamentos” for 127.0.0.1 at 2026-06-30 14:32:20 -0300 Processing by DepartamentosController#create as HTML

+ +
Parameters: {"departamento" => {"nome" => "", "codigo" => ""}}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 123 LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = '' LIMIT 1
+TRANSACTION (0.2ms)  ROLLBACK TO SAVEPOINT active_record_1
+Rendering layout layouts/application.html.erb
+Rendering departamentos/new.html.erb within layouts/application
+Rendered departamentos/_form.html.erb (Duration: 0.9ms | GC: 0.0ms)
+Rendered departamentos/new.html.erb within layouts/application (Duration: 1.0ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.2ms | GC: 0.0ms)
+ +

Completed 422 Unprocessable Content in 3ms (Views: 1.4ms | ActiveRecord: 1.0ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
Departamento Count (0.2ms)  SELECT COUNT(*) FROM `departamentos`
+TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_dep' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_dep@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:20.392348', NULL, NULL, NULL, NULL, 'doc_dep@unb.br', 'Doutorado', 'doc_dep', 'Docente Dep', NULL, NULL, '$2a$12$cTEj.27/nCWETqoMwL9Rh.VBhQ2XbNf5lOLq3CcKKEuHkal4j6ytG', 'Docente', '2026-06-30 17:32:20.392348')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.5ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'MAT01' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('MAT01', '2026-06-30 17:32:20.394180', 'Matemática', '2026-06-30 17:32:20.394180')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:20 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_dep@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_dep@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/124/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/departamentos/135” for 127.0.0.1 at 2026-06-30 14:32:20 -0300 Processing by DepartamentosController#show as HTML

+ +
Parameters: {"id" => "135"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 124 LIMIT 1
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`id` = 135 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering departamentos/show.html.erb within layouts/application
+Rendered departamentos/_departamento.html.erb (Duration: 0.0ms | GC: 0.0ms)
+Rendered departamentos/show.html.erb within layouts/application (Duration: 0.3ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.6ms | GC: 0.0ms)
+ +

Completed 200 OK in 2ms (Views: 0.7ms | ActiveRecord: 0.6ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_dep' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_dep@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:20.775466', NULL, NULL, NULL, NULL, 'doc_dep@unb.br', 'Doutorado', 'doc_dep', 'Docente Dep', NULL, NULL, '$2a$12$uS.lLEEYs2XyPSpkdpwj3OQjf/S8D0qtkxgnFZD.c4Laraxvmydk6', 'Docente', '2026-06-30 17:32:20.775466')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.5ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'MAT01' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('MAT01', '2026-06-30 17:32:20.777486', 'Matemática', '2026-06-30 17:32:20.777486')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:20 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_dep@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_dep@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/125/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/departamentos/136/edit” for 127.0.0.1 at 2026-06-30 14:32:20 -0300 Processing by DepartamentosController#edit as HTML

+ +
Parameters: {"id" => "136"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 125 LIMIT 1
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`id` = 136 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering departamentos/edit.html.erb within layouts/application
+Rendered departamentos/_form.html.erb (Duration: 0.4ms | GC: 0.0ms)
+Rendered departamentos/edit.html.erb within layouts/application (Duration: 0.6ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.9ms | GC: 0.0ms)
+ +

Completed 200 OK in 3ms (Views: 1.0ms | ActiveRecord: 0.6ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_dep' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_dep@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:21.160598', NULL, NULL, NULL, NULL, 'doc_dep@unb.br', 'Doutorado', 'doc_dep', 'Docente Dep', NULL, NULL, '$2a$12$Rb1NzbFF2xkLOSjsoWQZhelyBOOkpeTcypH9tXczHGRmt6RMtiBA.', 'Docente', '2026-06-30 17:32:21.160598')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'MAT01' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('MAT01', '2026-06-30 17:32:21.162425', 'Matemática', '2026-06-30 17:32:21.162425')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:21 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_dep@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_dep@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/126/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started PATCH “/departamentos/137” for 127.0.0.1 at 2026-06-30 14:32:21 -0300 Processing by DepartamentosController#update as HTML

+ +
Parameters: {"departamento" => {"nome" => "Matemática Aplicada", "codigo" => "MAT01"}, "id" => "137"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 126 LIMIT 1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`id` = 137 LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Update (0.4ms)  UPDATE `departamentos` SET `departamentos`.`nome` = 'Matemática Aplicada', `departamentos`.`updated_at` = '2026-06-30 17:32:21.355815' WHERE `departamentos`.`id` = 137
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/departamentos/137 Completed 303 See Other in 5ms (ActiveRecord: 3.2ms (3 queries, 0 cached) | GC: 0.0ms)

+ +
Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`id` = 137 LIMIT 1
+TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_dep' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_dep@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:21.547026', NULL, NULL, NULL, NULL, 'doc_dep@unb.br', 'Doutorado', 'doc_dep', 'Docente Dep', NULL, NULL, '$2a$12$NrLYu4EnzZXg9KvzO3AG7uB6yR3ATcvY9QABJ6NX1A7K2ms5EgFhu', 'Docente', '2026-06-30 17:32:21.547026')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'MAT01' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('MAT01', '2026-06-30 17:32:21.548745', 'Matemática', '2026-06-30 17:32:21.548745')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:21 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_dep@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_dep@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/127/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started PATCH “/departamentos/138” for 127.0.0.1 at 2026-06-30 14:32:21 -0300 Processing by DepartamentosController#update as HTML

+ +
Parameters: {"departamento" => {"nome" => "", "codigo" => ""}, "id" => "138"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 127 LIMIT 1
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`id` = 138 LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.6ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = '' AND `departamentos`.`id` != 138 LIMIT 1
+TRANSACTION (0.1ms)  ROLLBACK TO SAVEPOINT active_record_1
+Rendering layout layouts/application.html.erb
+Rendering departamentos/edit.html.erb within layouts/application
+Rendered departamentos/_form.html.erb (Duration: 0.9ms | GC: 0.0ms)
+Rendered departamentos/edit.html.erb within layouts/application (Duration: 1.0ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.2ms | GC: 0.0ms)
+ +

Completed 422 Unprocessable Content in 4ms (Views: 1.4ms | ActiveRecord: 1.5ms (3 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_dep' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_dep@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:21.934959', NULL, NULL, NULL, NULL, 'doc_dep@unb.br', 'Doutorado', 'doc_dep', 'Docente Dep', NULL, NULL, '$2a$12$OnyZBAO4AoK4jkXKVJ39N.ZNoTYjh/Cf.v4ZIMwYPmssxBXFSOMMK', 'Docente', '2026-06-30 17:32:21.934959')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'MAT01' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('MAT01', '2026-06-30 17:32:21.936873', 'Matemática', '2026-06-30 17:32:21.936873')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:21 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_dep@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_dep@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/128/avaliacoes Completed 302 Found in 214ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.5ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'DEL01' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('DEL01', '2026-06-30 17:32:22.153745', 'Para Deletar', '2026-06-30 17:32:22.153745')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Count (0.2ms)  SELECT COUNT(*) FROM `departamentos`
+ +

Started DELETE “/departamentos/140” for 127.0.0.1 at 2026-06-30 14:32:22 -0300 Processing by DepartamentosController#destroy as HTML

+ +
Parameters: {"id" => "140"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 128 LIMIT 1
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`id` = 140 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Curso Exists? (0.3ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`departamento_id` = 140 LIMIT 1
+Disciplina Exists? (0.2ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`departamento_id` = 140 LIMIT 1
+Departamento Destroy (0.3ms)  DELETE FROM `departamentos` WHERE `departamentos`.`id` = 140
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/departamentos Completed 303 See Other in 3ms (ActiveRecord: 1.5ms (5 queries, 0 cached) | GC: 0.0ms)

+ +
Departamento Count (0.2ms)  SELECT COUNT(*) FROM `departamentos`
+TRANSACTION (0.6ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_disc2' LIMIT 1
+Usuario Exists? (0.1ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_disc2@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:22.351311', NULL, NULL, NULL, NULL, 'doc_disc2@unb.br', 'Doutorado', 'doc_disc2', 'Docente Disc2', NULL, NULL, '$2a$12$8fe9OND8IsQxxDPjNz4OteEHXToLPNO23Z2DL00N3EBthlY4qrRre', 'Docente', '2026-06-30 17:32:22.351311')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:22.354813', 'Ciência da Computação', '2026-06-30 17:32:22.354813')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Curso Load (0.2ms)  SELECT `cursos`.* FROM `cursos` WHERE `cursos`.`nome` = 'Engenharia de Software' AND `cursos`.`codigo` = 'ESW_D' AND `cursos`.`departamento_id` = 141 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Curso Exists? (0.4ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`codigo` = 'ESW_D' LIMIT 1
+Curso Create (0.3ms)  INSERT INTO `cursos` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('ESW_D', '2026-06-30 17:32:22.356438', 141, 'Engenharia de Software', '2026-06-30 17:32:22.356438')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.5ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'disc_teste' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'disc_teste@unb.br' LIMIT 1
+Discente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:22.552652', 14, NULL, NULL, NULL, 'disc_teste@unb.br', NULL, 'disc_teste', 'Discente Teste', NULL, NULL, '$2a$12$fCrHVAzexpWVX0ZTzeCH7uSIkOTHTbgDAZV0B52S9VT1smoX9LXJa', 'Discente', '2026-06-30 17:32:22.552652')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:22 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_disc2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_disc2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/129/avaliacoes Completed 302 Found in 191ms (ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms) Started DELETE “/logout” for 127.0.0.1 at 2026-06-30 14:32:22 -0300 Processing by SessionsController#destroy as HTML Redirected to www.example.com/ Completed 302 Found in 0ms (ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 0.0ms) Started GET “/discentes” for 127.0.0.1 at 2026-06-30 14:32:22 -0300 Processing by DiscentesController#index as HTML

+ +
Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+ +

Redirected to www.example.com/ Filter chain halted as :require_login rendered or redirected Completed 302 Found in 1ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.6ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_disc2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_disc2@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:22.942490', NULL, NULL, NULL, NULL, 'doc_disc2@unb.br', 'Doutorado', 'doc_disc2', 'Docente Disc2', NULL, NULL, '$2a$12$Q5IKe4kWCFkzd.mMb37MwuuT1OwiAbIbEeDbgE4qnC7rDtZCqc05a', 'Docente', '2026-06-30 17:32:22.942490')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:22.944830', 'Ciência da Computação', '2026-06-30 17:32:22.944830')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Curso Load (0.2ms)  SELECT `cursos`.* FROM `cursos` WHERE `cursos`.`nome` = 'Engenharia de Software' AND `cursos`.`codigo` = 'ESW_D' AND `cursos`.`departamento_id` = 142 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Curso Exists? (0.3ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`codigo` = 'ESW_D' LIMIT 1
+Curso Create (0.3ms)  INSERT INTO `cursos` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('ESW_D', '2026-06-30 17:32:22.946410', 142, 'Engenharia de Software', '2026-06-30 17:32:22.946410')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'disc_teste' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'disc_teste@unb.br' LIMIT 1
+Discente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:23.136087', 15, NULL, NULL, NULL, 'disc_teste@unb.br', NULL, 'disc_teste', 'Discente Teste', NULL, NULL, '$2a$12$nnZAKoQ4phKsOFpOBQoRrOo86jd/KoCoZrLoUfk0aJmFV06NaR9f2', 'Discente', '2026-06-30 17:32:23.136087')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:23 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_disc2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_disc2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/131/avaliacoes Completed 302 Found in 190ms (ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.3ms) Started GET “/discentes” for 127.0.0.1 at 2026-06-30 14:32:23 -0300 Processing by DiscentesController#index as HTML

+ +
Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 131 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering discentes/index.html.erb within layouts/application
+Discente Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Discente'
+Rendered discentes/_discente.html.erb (Duration: 0.1ms | GC: 0.0ms)
+Rendered discentes/index.html.erb within layouts/application (Duration: 1.3ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.6ms | GC: 0.0ms)
+ +

Completed 200 OK in 3ms (Views: 1.7ms | ActiveRecord: 0.7ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_disc2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_disc2@unb.br' LIMIT 1
+Docente Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:23.522759', NULL, NULL, NULL, NULL, 'doc_disc2@unb.br', 'Doutorado', 'doc_disc2', 'Docente Disc2', NULL, NULL, '$2a$12$a0Nth.GpjtgD84MzqGuyxecVF.lZKvKVQCMwiHHtelQ6LjiUoJBwa', 'Docente', '2026-06-30 17:32:23.522759')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:23.525325', 'Ciência da Computação', '2026-06-30 17:32:23.525325')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Curso Load (0.2ms)  SELECT `cursos`.* FROM `cursos` WHERE `cursos`.`nome` = 'Engenharia de Software' AND `cursos`.`codigo` = 'ESW_D' AND `cursos`.`departamento_id` = 143 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Curso Exists? (0.3ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`codigo` = 'ESW_D' LIMIT 1
+Curso Create (0.2ms)  INSERT INTO `cursos` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('ESW_D', '2026-06-30 17:32:23.526850', 143, 'Engenharia de Software', '2026-06-30 17:32:23.526850')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'disc_teste' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'disc_teste@unb.br' LIMIT 1
+Discente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:23.715512', 16, NULL, NULL, NULL, 'disc_teste@unb.br', NULL, 'disc_teste', 'Discente Teste', NULL, NULL, '$2a$12$PN7.g7ZVsD62/eF/Cc2eDef5O6BHxr53sPDpJcECLM37iHc9wldPa', 'Discente', '2026-06-30 17:32:23.715512')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:23 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_disc2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_disc2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/133/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/discentes/new” for 127.0.0.1 at 2026-06-30 14:32:23 -0300 Processing by DiscentesController#new as HTML

+ +
Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 133 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering discentes/new.html.erb within layouts/application
+Rendered discentes/_form.html.erb (Duration: 0.9ms | GC: 0.0ms)
+Rendered discentes/new.html.erb within layouts/application (Duration: 1.3ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.5ms | GC: 0.0ms)
+ +

Completed 200 OK in 3ms (Views: 1.7ms | ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_disc2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_disc2@unb.br' LIMIT 1
+Docente Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:24.100422', NULL, NULL, NULL, NULL, 'doc_disc2@unb.br', 'Doutorado', 'doc_disc2', 'Docente Disc2', NULL, NULL, '$2a$12$ML.nhsVpoRdAAqyNVxvDwuqYw.Kn7z6BYLwlATcJSJCPOa4/ygHVK', 'Docente', '2026-06-30 17:32:24.100422')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:24.102815', 'Ciência da Computação', '2026-06-30 17:32:24.102815')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Curso Load (0.2ms)  SELECT `cursos`.* FROM `cursos` WHERE `cursos`.`nome` = 'Engenharia de Software' AND `cursos`.`codigo` = 'ESW_D' AND `cursos`.`departamento_id` = 144 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Curso Exists? (0.3ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`codigo` = 'ESW_D' LIMIT 1
+Curso Create (0.2ms)  INSERT INTO `cursos` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('ESW_D', '2026-06-30 17:32:24.104276', 144, 'Engenharia de Software', '2026-06-30 17:32:24.104276')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'disc_teste' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'disc_teste@unb.br' LIMIT 1
+Discente Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:24.292793', 17, NULL, NULL, NULL, 'disc_teste@unb.br', NULL, 'disc_teste', 'Discente Teste', NULL, NULL, '$2a$12$fkDiYHwLt00Ur8/earEPVeKraRk3NCFFavBxXOwEeZxH6t2vV5CUa', 'Discente', '2026-06-30 17:32:24.292793')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:24 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_disc2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_disc2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/135/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Discente Count (0.3ms)  SELECT COUNT(*) FROM `usuarios` WHERE `usuarios`.`type` = 'Discente'
+ +

Started POST “/discentes” for 127.0.0.1 at 2026-06-30 14:32:24 -0300 Processing by DiscentesController#create as HTML

+ +
Parameters: {"discente" => {"nome" => "Novo Aluno", "matricula" => "disc_novo", "email" => "[FILTERED]", "curso_id" => "17"}}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 135 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'disc_novo' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'disc_novo@unb.br' LIMIT 1
+Discente Create (0.3ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:24.485440', 17, NULL, NULL, NULL, 'disc_novo@unb.br', NULL, 'disc_novo', 'Novo Aluno', NULL, NULL, NULL, 'Discente', '2026-06-30 17:32:24.485440')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/discentes/137 Completed 302 Found in 3ms (ActiveRecord: 1.4ms (4 queries, 0 cached) | GC: 0.0ms)

+ +
Discente Count (0.2ms)  SELECT COUNT(*) FROM `usuarios` WHERE `usuarios`.`type` = 'Discente'
+Discente Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Discente' ORDER BY `usuarios`.`id` DESC LIMIT 1
+TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_disc2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_disc2@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:24.677214', NULL, NULL, NULL, NULL, 'doc_disc2@unb.br', 'Doutorado', 'doc_disc2', 'Docente Disc2', NULL, NULL, '$2a$12$YL8qWu/JZW4GW.oCjtNhguLQbTAgFHVDVVJCHeiMfYv2s21qYCtZW', 'Docente', '2026-06-30 17:32:24.677214')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:24.679190', 'Ciência da Computação', '2026-06-30 17:32:24.679190')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Curso Load (0.2ms)  SELECT `cursos`.* FROM `cursos` WHERE `cursos`.`nome` = 'Engenharia de Software' AND `cursos`.`codigo` = 'ESW_D' AND `cursos`.`departamento_id` = 145 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Curso Exists? (0.3ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`codigo` = 'ESW_D' LIMIT 1
+Curso Create (0.2ms)  INSERT INTO `cursos` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('ESW_D', '2026-06-30 17:32:24.680623', 145, 'Engenharia de Software', '2026-06-30 17:32:24.680623')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'disc_teste' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'disc_teste@unb.br' LIMIT 1
+Discente Create (1.3ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:24.869664', 18, NULL, NULL, NULL, 'disc_teste@unb.br', NULL, 'disc_teste', 'Discente Teste', NULL, NULL, '$2a$12$nD3lUUEeE7aTnoq5v4844eqVNd6uBiYGkm5lqMGydbk381Bc0N7Fe', 'Discente', '2026-06-30 17:32:24.869664')
+TRANSACTION (0.5ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:24 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_disc2@unb.br", "senha" => "Senha123"}
+Usuario Load (2.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_disc2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/138/avaliacoes Completed 302 Found in 190ms (ActiveRecord: 2.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Discente Count (0.4ms)  SELECT COUNT(*) FROM `usuarios` WHERE `usuarios`.`type` = 'Discente'
+ +

Started POST “/discentes” for 127.0.0.1 at 2026-06-30 14:32:25 -0300 Processing by DiscentesController#create as HTML

+ +
Parameters: {"discente" => {"nome" => "", "matricula" => "", "email" => "[FILTERED]", "curso_id" => nil}}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 138 LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = '' LIMIT 1
+TRANSACTION (0.1ms)  ROLLBACK TO SAVEPOINT active_record_1
+Rendering layout layouts/application.html.erb
+Rendering discentes/new.html.erb within layouts/application
+Rendered discentes/_form.html.erb (Duration: 2.2ms | GC: 0.1ms)
+Rendered discentes/new.html.erb within layouts/application (Duration: 2.2ms | GC: 0.1ms)
+Rendered layout layouts/application.html.erb (Duration: 2.5ms | GC: 0.1ms)
+ +

Completed 422 Unprocessable Content in 5ms (Views: 2.6ms | ActiveRecord: 1.3ms (3 queries, 0 cached) | GC: 0.1ms)

+ +
Discente Count (0.2ms)  SELECT COUNT(*) FROM `usuarios` WHERE `usuarios`.`type` = 'Discente'
+TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_disc2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_disc2@unb.br' LIMIT 1
+Docente Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:25.261211', NULL, NULL, NULL, NULL, 'doc_disc2@unb.br', 'Doutorado', 'doc_disc2', 'Docente Disc2', NULL, NULL, '$2a$12$9st1uuYPvWc00FnYQjdjgOeRKAA0BiqWRpwA3gvUnOM3RXycp4Iqa', 'Docente', '2026-06-30 17:32:25.261211')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.2ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:25.263606', 'Ciência da Computação', '2026-06-30 17:32:25.263606')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Curso Load (0.2ms)  SELECT `cursos`.* FROM `cursos` WHERE `cursos`.`nome` = 'Engenharia de Software' AND `cursos`.`codigo` = 'ESW_D' AND `cursos`.`departamento_id` = 146 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Curso Exists? (0.3ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`codigo` = 'ESW_D' LIMIT 1
+Curso Create (0.2ms)  INSERT INTO `cursos` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('ESW_D', '2026-06-30 17:32:25.264976', 146, 'Engenharia de Software', '2026-06-30 17:32:25.264976')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'disc_teste' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'disc_teste@unb.br' LIMIT 1
+Discente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:25.457976', 19, NULL, NULL, NULL, 'disc_teste@unb.br', NULL, 'disc_teste', 'Discente Teste', NULL, NULL, '$2a$12$dMOEMAy3GZ2hAnV8jRinwudky08QNOB2AcVSDGD6Ee2DXSKxT.4k2', 'Discente', '2026-06-30 17:32:25.457976')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:25 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_disc2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_disc2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/140/avaliacoes Completed 302 Found in 190ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/discentes/141” for 127.0.0.1 at 2026-06-30 14:32:25 -0300 Processing by DiscentesController#show as HTML

+ +
Parameters: {"id" => "141"}
+Usuario Load (0.6ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 140 LIMIT 1
+Discente Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Discente' AND `usuarios`.`id` = 141 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering discentes/show.html.erb within layouts/application
+Rendered discentes/_discente.html.erb (Duration: 0.0ms | GC: 0.0ms)
+Rendered discentes/show.html.erb within layouts/application (Duration: 0.4ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.7ms | GC: 0.1ms)
+ +

Completed 200 OK in 3ms (Views: 0.8ms | ActiveRecord: 0.9ms (2 queries, 0 cached) | GC: 0.1ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_disc2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_disc2@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:25.845702', NULL, NULL, NULL, NULL, 'doc_disc2@unb.br', 'Doutorado', 'doc_disc2', 'Docente Disc2', NULL, NULL, '$2a$12$cNI/dlgjkgcGoUawgPiPwedNEBxRKioS6EXUIs6ZLrZlljjrbRvSW', 'Docente', '2026-06-30 17:32:25.845702')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:25.847909', 'Ciência da Computação', '2026-06-30 17:32:25.847909')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Curso Load (0.1ms)  SELECT `cursos`.* FROM `cursos` WHERE `cursos`.`nome` = 'Engenharia de Software' AND `cursos`.`codigo` = 'ESW_D' AND `cursos`.`departamento_id` = 147 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Curso Exists? (0.2ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`codigo` = 'ESW_D' LIMIT 1
+Curso Create (0.2ms)  INSERT INTO `cursos` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('ESW_D', '2026-06-30 17:32:25.849172', 147, 'Engenharia de Software', '2026-06-30 17:32:25.849172')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'disc_teste' LIMIT 1
+Usuario Exists? (0.1ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'disc_teste@unb.br' LIMIT 1
+Discente Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:26.040571', 20, NULL, NULL, NULL, 'disc_teste@unb.br', NULL, 'disc_teste', 'Discente Teste', NULL, NULL, '$2a$12$W0ZqaSi19QWpVZkmBxowfuLXP903f4qK5Bs7pbfE7/faIKklx0BGm', 'Discente', '2026-06-30 17:32:26.040571')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:26 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_disc2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_disc2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/142/avaliacoes Completed 302 Found in 190ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/discentes/143/edit” for 127.0.0.1 at 2026-06-30 14:32:26 -0300 Processing by DiscentesController#edit as HTML

+ +
Parameters: {"id" => "143"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 142 LIMIT 1
+Discente Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Discente' AND `usuarios`.`id` = 143 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering discentes/edit.html.erb within layouts/application
+Rendered discentes/_form.html.erb (Duration: 0.7ms | GC: 0.1ms)
+Rendered discentes/edit.html.erb within layouts/application (Duration: 1.0ms | GC: 0.1ms)
+Rendered layout layouts/application.html.erb (Duration: 1.2ms | GC: 0.1ms)
+ +

Completed 200 OK in 3ms (Views: 1.3ms | ActiveRecord: 0.7ms (2 queries, 0 cached) | GC: 0.1ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_disc2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_disc2@unb.br' LIMIT 1
+Docente Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:26.426109', NULL, NULL, NULL, NULL, 'doc_disc2@unb.br', 'Doutorado', 'doc_disc2', 'Docente Disc2', NULL, NULL, '$2a$12$wYayDGuSoHoB4hrKlLI/PuN8P5Y9eEboDJjxheoaN9zI91caXpzTW', 'Docente', '2026-06-30 17:32:26.426109')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:26.428528', 'Ciência da Computação', '2026-06-30 17:32:26.428528')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Curso Load (0.2ms)  SELECT `cursos`.* FROM `cursos` WHERE `cursos`.`nome` = 'Engenharia de Software' AND `cursos`.`codigo` = 'ESW_D' AND `cursos`.`departamento_id` = 148 LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Curso Exists? (0.4ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`codigo` = 'ESW_D' LIMIT 1
+Curso Create (0.3ms)  INSERT INTO `cursos` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('ESW_D', '2026-06-30 17:32:26.430222', 148, 'Engenharia de Software', '2026-06-30 17:32:26.430222')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'disc_teste' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'disc_teste@unb.br' LIMIT 1
+Discente Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:26.619123', 21, NULL, NULL, NULL, 'disc_teste@unb.br', NULL, 'disc_teste', 'Discente Teste', NULL, NULL, '$2a$12$PICMgCVmebCoE.LgCLLQi.GxjhWoqjD6cc8ODwDxrS27m7c1KU4T.', 'Discente', '2026-06-30 17:32:26.619123')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:26 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_disc2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_disc2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/144/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started PATCH “/discentes/145” for 127.0.0.1 at 2026-06-30 14:32:26 -0300 Processing by DiscentesController#update as HTML

+ +
Parameters: {"discente" => {"nome" => "Aluno Atualizado", "matricula" => "disc_teste", "email" => "[FILTERED]", "curso_id" => "21"}, "id" => "145"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 144 LIMIT 1
+Discente Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Discente' AND `usuarios`.`id` = 145 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'disc_teste@unb.br' AND `usuarios`.`id` != 145 LIMIT 1
+Discente Update (0.4ms)  UPDATE `usuarios` SET `usuarios`.`nome` = 'Aluno Atualizado', `usuarios`.`updated_at` = '2026-06-30 17:32:26.812396' WHERE `usuarios`.`id` = 145
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/discentes/145 Completed 303 See Other in 3ms (ActiveRecord: 1.7ms (4 queries, 0 cached) | GC: 0.0ms)

+ +
Discente Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Discente' AND `usuarios`.`id` = 145 LIMIT 1
+TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_disc2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_disc2@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:27.004938', NULL, NULL, NULL, NULL, 'doc_disc2@unb.br', 'Doutorado', 'doc_disc2', 'Docente Disc2', NULL, NULL, '$2a$12$gLiAUwMbi1.cYE2qrhPvWumeFykuZcmcZmiHf5L/PFqLjGdSl375a', 'Docente', '2026-06-30 17:32:27.004938')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:27.007349', 'Ciência da Computação', '2026-06-30 17:32:27.007349')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Curso Load (0.2ms)  SELECT `cursos`.* FROM `cursos` WHERE `cursos`.`nome` = 'Engenharia de Software' AND `cursos`.`codigo` = 'ESW_D' AND `cursos`.`departamento_id` = 149 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Curso Exists? (0.3ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`codigo` = 'ESW_D' LIMIT 1
+Curso Create (0.4ms)  INSERT INTO `cursos` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('ESW_D', '2026-06-30 17:32:27.008866', 149, 'Engenharia de Software', '2026-06-30 17:32:27.008866')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'disc_teste' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'disc_teste@unb.br' LIMIT 1
+Discente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:27.198410', 22, NULL, NULL, NULL, 'disc_teste@unb.br', NULL, 'disc_teste', 'Discente Teste', NULL, NULL, '$2a$12$58WjilK.5Ppj/r/6WN5bNOlFD1GZXYughtveIVrP9aImq3C8oyTXa', 'Discente', '2026-06-30 17:32:27.198410')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:27 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_disc2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_disc2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/146/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.1ms) Started PATCH “/discentes/147” for 127.0.0.1 at 2026-06-30 14:32:27 -0300 Processing by DiscentesController#update as HTML

+ +
Parameters: {"discente" => {"nome" => "", "matricula" => "", "email" => "[FILTERED]", "curso_id" => nil}, "id" => "147"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 146 LIMIT 1
+Discente Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Discente' AND `usuarios`.`id` = 147 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.5ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '' AND `usuarios`.`id` != 147 LIMIT 1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = '' AND `usuarios`.`id` != 147 LIMIT 1
+TRANSACTION (0.1ms)  ROLLBACK TO SAVEPOINT active_record_1
+Rendering layout layouts/application.html.erb
+Rendering discentes/edit.html.erb within layouts/application
+Rendered discentes/_form.html.erb (Duration: 2.1ms | GC: 0.1ms)
+Rendered discentes/edit.html.erb within layouts/application (Duration: 2.2ms | GC: 0.1ms)
+Rendered layout layouts/application.html.erb (Duration: 2.5ms | GC: 0.1ms)
+ +

Completed 422 Unprocessable Content in 6ms (Views: 2.6ms | ActiveRecord: 1.7ms (4 queries, 0 cached) | GC: 0.1ms)

+ +
TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_disc2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_disc2@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:27.586350', NULL, NULL, NULL, NULL, 'doc_disc2@unb.br', 'Doutorado', 'doc_disc2', 'Docente Disc2', NULL, NULL, '$2a$12$OBInM6vnFU6oD9eufQv3X.h6o7OkYq.tKY9jPYkN7xZ3dUWpoocfa', 'Docente', '2026-06-30 17:32:27.586350')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:27.588618', 'Ciência da Computação', '2026-06-30 17:32:27.588618')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Curso Load (0.2ms)  SELECT `cursos`.* FROM `cursos` WHERE `cursos`.`nome` = 'Engenharia de Software' AND `cursos`.`codigo` = 'ESW_D' AND `cursos`.`departamento_id` = 150 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Curso Exists? (0.3ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`codigo` = 'ESW_D' LIMIT 1
+Curso Create (0.2ms)  INSERT INTO `cursos` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('ESW_D', '2026-06-30 17:32:27.590162', 150, 'Engenharia de Software', '2026-06-30 17:32:27.590162')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'disc_teste' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'disc_teste@unb.br' LIMIT 1
+Discente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:27.779555', 23, NULL, NULL, NULL, 'disc_teste@unb.br', NULL, 'disc_teste', 'Discente Teste', NULL, NULL, '$2a$12$IwKBjJEjPHwVjnLAi8LL.eLhXXf2V8tmjRtbBuWqd8qCzHlysirS2', 'Discente', '2026-06-30 17:32:27.779555')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:27 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_disc2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_disc2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/148/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.5ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'del_disc' LIMIT 1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'del_disc@unb.br' LIMIT 1
+Discente Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:27.972174', 23, NULL, NULL, NULL, 'del_disc@unb.br', NULL, 'del_disc', 'Para Deletar', NULL, NULL, NULL, 'Discente', '2026-06-30 17:32:27.972174')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Discente Count (0.2ms)  SELECT COUNT(*) FROM `usuarios` WHERE `usuarios`.`type` = 'Discente'
+ +

Started DELETE “/discentes/150” for 127.0.0.1 at 2026-06-30 14:32:27 -0300 Processing by DiscentesController#destroy as HTML

+ +
Parameters: {"id" => "150"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 148 LIMIT 1
+Discente Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Discente' AND `usuarios`.`id` = 150 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Discente::HABTM_Turmas Delete All (0.6ms)  DELETE FROM `discentes_turmas` WHERE `discentes_turmas`.`discente_id` = 150
+Discente Destroy (0.3ms)  DELETE FROM `usuarios` WHERE `usuarios`.`id` = 150
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/discentes Completed 303 See Other in 8ms (ActiveRecord: 4.9ms (4 queries, 0 cached) | GC: 0.1ms)

+ +
Discente Count (0.2ms)  SELECT COUNT(*) FROM `usuarios` WHERE `usuarios`.`type` = 'Discente'
+TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_disc' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_disc@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:28.172696', NULL, NULL, NULL, NULL, 'doc_disc@unb.br', 'Doutorado', 'doc_disc', 'Docente Disc', NULL, NULL, '$2a$12$RINVVSfAHUuOfhRKd7TMDuoZSOq.mN0Vvym0EJ4gmY9P/lOdfDth6', 'Docente', '2026-06-30 17:32:28.172696')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:28.174862', 'Ciência da Computação', '2026-06-30 17:32:28.174862')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.4ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'MAT001D' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('MAT001D', '2026-06-30 17:32:28.176021', 151, 'Álgebra Linear', '2026-06-30 17:32:28.176021')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:28 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_disc@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_disc@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/151/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.1ms) Started DELETE “/logout” for 127.0.0.1 at 2026-06-30 14:32:28 -0300 Processing by SessionsController#destroy as HTML Redirected to www.example.com/ Completed 302 Found in 0ms (ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 0.0ms) Started GET “/disciplinas” for 127.0.0.1 at 2026-06-30 14:32:28 -0300 Processing by DisciplinasController#index as HTML

+ +
Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+ +

Redirected to www.example.com/ Filter chain halted as :require_login rendered or redirected Completed 302 Found in 1ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.1ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_disc' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_disc@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:28.557392', NULL, NULL, NULL, NULL, 'doc_disc@unb.br', 'Doutorado', 'doc_disc', 'Docente Disc', NULL, NULL, '$2a$12$2N3oat2N/63fdxy8HLUuu.gcm2h2RtGlxL77eQBUFwmwQkWvnV7Uu', 'Docente', '2026-06-30 17:32:28.557392')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:28.559234', 'Ciência da Computação', '2026-06-30 17:32:28.559234')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.4ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'MAT001D' LIMIT 1
+Disciplina Create (0.3ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('MAT001D', '2026-06-30 17:32:28.560363', 152, 'Álgebra Linear', '2026-06-30 17:32:28.560363')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:28 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_disc@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_disc@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/152/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/disciplinas” for 127.0.0.1 at 2026-06-30 14:32:28 -0300 Processing by DisciplinasController#index as HTML

+ +
Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 152 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering disciplinas/index.html.erb within layouts/application
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas`
+Rendered disciplinas/_disciplina.html.erb (Duration: 0.1ms | GC: 0.0ms)
+Rendered disciplinas/index.html.erb within layouts/application (Duration: 1.1ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 3ms (Views: 1.6ms | ActiveRecord: 0.5ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_disc' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_disc@unb.br' LIMIT 1
+Docente Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:28.942630', NULL, NULL, NULL, NULL, 'doc_disc@unb.br', 'Doutorado', 'doc_disc', 'Docente Disc', NULL, NULL, '$2a$12$SZiB0HhjLShNr5sLgnib4eAPjyaNJCpmxzaparNfZVE.9NJaJt/Na', 'Docente', '2026-06-30 17:32:28.942630')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:28.944627', 'Ciência da Computação', '2026-06-30 17:32:28.944627')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'MAT001D' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('MAT001D', '2026-06-30 17:32:28.945713', 153, 'Álgebra Linear', '2026-06-30 17:32:28.945713')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:28 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_disc@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_disc@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/153/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/disciplinas/new” for 127.0.0.1 at 2026-06-30 14:32:29 -0300 Processing by DisciplinasController#new as HTML

+ +
Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 153 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering disciplinas/new.html.erb within layouts/application
+Rendered disciplinas/_form.html.erb (Duration: 0.6ms | GC: 0.0ms)
+Rendered disciplinas/new.html.erb within layouts/application (Duration: 1.0ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.2ms | GC: 0.0ms)
+ +

Completed 200 OK in 3ms (Views: 1.3ms | ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_disc' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_disc@unb.br' LIMIT 1
+Docente Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:29.327682', NULL, NULL, NULL, NULL, 'doc_disc@unb.br', 'Doutorado', 'doc_disc', 'Docente Disc', NULL, NULL, '$2a$12$3s7e5Lf0ZS0gyp8osAu84..waAXz6ss5EULG64SxcObGux37U4evy', 'Docente', '2026-06-30 17:32:29.327682')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:29.329627', 'Ciência da Computação', '2026-06-30 17:32:29.329627')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'MAT001D' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('MAT001D', '2026-06-30 17:32:29.330692', 154, 'Álgebra Linear', '2026-06-30 17:32:29.330692')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:29 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_disc@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_disc@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/154/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Disciplina Count (0.2ms)  SELECT COUNT(*) FROM `disciplinas`
+ +

Started POST “/disciplinas” for 127.0.0.1 at 2026-06-30 14:32:29 -0300 Processing by DisciplinasController#create as HTML

+ +
Parameters: {"disciplina" => {"nome" => "Cálculo 1", "codigo" => "MAT002D", "departamento_id" => "154"}}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 154 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Load (0.4ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`id` = 154 LIMIT 1
+Disciplina Exists? (0.2ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'MAT002D' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('MAT002D', '2026-06-30 17:32:29.522269', 154, 'Cálculo 1', '2026-06-30 17:32:29.522269')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/disciplinas/56 Completed 302 Found in 2ms (ActiveRecord: 1.3ms (4 queries, 0 cached) | GC: 0.0ms)

+ +
Disciplina Count (0.2ms)  SELECT COUNT(*) FROM `disciplinas`
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` ORDER BY `disciplinas`.`id` DESC LIMIT 1
+TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_disc' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_disc@unb.br' LIMIT 1
+Docente Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:29.713242', NULL, NULL, NULL, NULL, 'doc_disc@unb.br', 'Doutorado', 'doc_disc', 'Docente Disc', NULL, NULL, '$2a$12$jebkRqtvPwZv1FjdZ4CTTeRKh3Llh5qY.7BXOuTYBS3NAwrnXVQwu', 'Docente', '2026-06-30 17:32:29.713242')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:29.715055', 'Ciência da Computação', '2026-06-30 17:32:29.715055')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'MAT001D' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('MAT001D', '2026-06-30 17:32:29.716097', 155, 'Álgebra Linear', '2026-06-30 17:32:29.716097')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:29 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_disc@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_disc@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/155/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Disciplina Count (0.3ms)  SELECT COUNT(*) FROM `disciplinas`
+ +

Started POST “/disciplinas” for 127.0.0.1 at 2026-06-30 14:32:29 -0300 Processing by DisciplinasController#create as HTML

+ +
Parameters: {"disciplina" => {"nome" => "", "codigo" => "", "departamento_id" => "155"}}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 155 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Load (0.4ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`id` = 155 LIMIT 1
+Disciplina Exists? (0.2ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = '' LIMIT 1
+TRANSACTION (0.1ms)  ROLLBACK TO SAVEPOINT active_record_1
+Rendering layout layouts/application.html.erb
+Rendering disciplinas/new.html.erb within layouts/application
+Rendered disciplinas/_form.html.erb (Duration: 1.0ms | GC: 0.0ms)
+Rendered disciplinas/new.html.erb within layouts/application (Duration: 1.1ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.3ms | GC: 0.0ms)
+ +

Completed 422 Unprocessable Content in 4ms (Views: 1.5ms | ActiveRecord: 1.1ms (3 queries, 0 cached) | GC: 0.0ms)

+ +
Disciplina Count (0.2ms)  SELECT COUNT(*) FROM `disciplinas`
+TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_disc' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_disc@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:30.101076', NULL, NULL, NULL, NULL, 'doc_disc@unb.br', 'Doutorado', 'doc_disc', 'Docente Disc', NULL, NULL, '$2a$12$KZCWdB6WYX1/56DP47dGPe1StziJClO4rl8jJEAXTaxZMM.JosS8O', 'Docente', '2026-06-30 17:32:30.101076')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:30.103062', 'Ciência da Computação', '2026-06-30 17:32:30.103062')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'MAT001D' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('MAT001D', '2026-06-30 17:32:30.104127', 156, 'Álgebra Linear', '2026-06-30 17:32:30.104127')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:30 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_disc@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_disc@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/156/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/disciplinas/58” for 127.0.0.1 at 2026-06-30 14:32:30 -0300 Processing by DisciplinasController#show as HTML

+ +
Parameters: {"id" => "58"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 156 LIMIT 1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`id` = 58 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering disciplinas/show.html.erb within layouts/application
+Rendered disciplinas/_disciplina.html.erb (Duration: 0.0ms | GC: 0.0ms)
+Rendered disciplinas/show.html.erb within layouts/application (Duration: 0.4ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.6ms | GC: 0.0ms)
+ +

Completed 200 OK in 2ms (Views: 0.7ms | ActiveRecord: 0.5ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_disc' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_disc@unb.br' LIMIT 1
+Docente Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:30.485126', NULL, NULL, NULL, NULL, 'doc_disc@unb.br', 'Doutorado', 'doc_disc', 'Docente Disc', NULL, NULL, '$2a$12$wHWTu79OwavTiLbAPCP9duFq8/hJqiXam6p5bB2ahrDnWfxeERfq2', 'Docente', '2026-06-30 17:32:30.485126')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:30.486839', 'Ciência da Computação', '2026-06-30 17:32:30.486839')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'MAT001D' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('MAT001D', '2026-06-30 17:32:30.487894', 157, 'Álgebra Linear', '2026-06-30 17:32:30.487894')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:30 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_disc@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_disc@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/157/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/disciplinas/59/edit” for 127.0.0.1 at 2026-06-30 14:32:30 -0300 Processing by DisciplinasController#edit as HTML

+ +
Parameters: {"id" => "59"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 157 LIMIT 1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`id` = 59 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering disciplinas/edit.html.erb within layouts/application
+Rendered disciplinas/_form.html.erb (Duration: 0.5ms | GC: 0.0ms)
+Rendered disciplinas/edit.html.erb within layouts/application (Duration: 0.7ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.9ms | GC: 0.0ms)
+ +

Completed 200 OK in 5ms (Views: 1.1ms | ActiveRecord: 0.6ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_disc' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_disc@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:30.872243', NULL, NULL, NULL, NULL, 'doc_disc@unb.br', 'Doutorado', 'doc_disc', 'Docente Disc', NULL, NULL, '$2a$12$k3zKRFYRvCAtplWSrDBZgOZ5i0UTLoFY0w/T4hkaRqBEjnlXuSWlq', 'Docente', '2026-06-30 17:32:30.872243')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:30.874406', 'Ciência da Computação', '2026-06-30 17:32:30.874406')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'MAT001D' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('MAT001D', '2026-06-30 17:32:30.875525', 158, 'Álgebra Linear', '2026-06-30 17:32:30.875525')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:30 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_disc@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_disc@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/158/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started PATCH “/disciplinas/60” for 127.0.0.1 at 2026-06-30 14:32:31 -0300 Processing by DisciplinasController#update as HTML

+ +
Parameters: {"disciplina" => {"nome" => "Álgebra Linear Avançada", "codigo" => "MAT001D", "departamento_id" => "158"}, "id" => "60"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 158 LIMIT 1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`id` = 60 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Update (0.4ms)  UPDATE `disciplinas` SET `disciplinas`.`nome` = 'Álgebra Linear Avançada', `disciplinas`.`updated_at` = '2026-06-30 17:32:31.068978' WHERE `disciplinas`.`id` = 60
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/disciplinas/60 Completed 303 See Other in 4ms (ActiveRecord: 3.0ms (3 queries, 0 cached) | GC: 0.0ms)

+ +
Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`id` = 60 LIMIT 1
+TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_disc' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_disc@unb.br' LIMIT 1
+Docente Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:31.260210', NULL, NULL, NULL, NULL, 'doc_disc@unb.br', 'Doutorado', 'doc_disc', 'Docente Disc', NULL, NULL, '$2a$12$x.VE16PZ06hu8elYGEDGiuTF6qUcfkvgsEP9fV3orIYS3Z4j8n4my', 'Docente', '2026-06-30 17:32:31.260210')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:31.262048', 'Ciência da Computação', '2026-06-30 17:32:31.262048')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'MAT001D' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('MAT001D', '2026-06-30 17:32:31.263136', 159, 'Álgebra Linear', '2026-06-30 17:32:31.263136')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:31 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_disc@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_disc@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/159/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started PATCH “/disciplinas/61” for 127.0.0.1 at 2026-06-30 14:32:31 -0300 Processing by DisciplinasController#update as HTML

+ +
Parameters: {"disciplina" => {"nome" => "", "codigo" => "", "departamento_id" => "159"}, "id" => "61"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 159 LIMIT 1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`id` = 61 LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.4ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = '' AND `disciplinas`.`id` != 61 LIMIT 1
+TRANSACTION (0.2ms)  ROLLBACK TO SAVEPOINT active_record_1
+Rendering layout layouts/application.html.erb
+Rendering disciplinas/edit.html.erb within layouts/application
+Rendered disciplinas/_form.html.erb (Duration: 1.0ms | GC: 0.0ms)
+Rendered disciplinas/edit.html.erb within layouts/application (Duration: 1.1ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.3ms | GC: 0.0ms)
+ +

Completed 422 Unprocessable Content in 7ms (Views: 1.5ms | ActiveRecord: 1.2ms (3 queries, 0 cached) | GC: 2.9ms)

+ +
TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_disc' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_disc@unb.br' LIMIT 1
+Docente Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:31.649108', NULL, NULL, NULL, NULL, 'doc_disc@unb.br', 'Doutorado', 'doc_disc', 'Docente Disc', NULL, NULL, '$2a$12$naBqvWh4zz5gyn7ALxnXyeCUUu08bPpfwKhBAvLVqiayHglhgV79q', 'Docente', '2026-06-30 17:32:31.649108')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:31.650942', 'Ciência da Computação', '2026-06-30 17:32:31.650942')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'MAT001D' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('MAT001D', '2026-06-30 17:32:31.652019', 160, 'Álgebra Linear', '2026-06-30 17:32:31.652019')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:31 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_disc@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_disc@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/160/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.5ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'DEL001D' LIMIT 1
+Disciplina Create (0.3ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('DEL001D', '2026-06-30 17:32:31.843283', 160, 'Para Deletar', '2026-06-30 17:32:31.843283')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Count (0.2ms)  SELECT COUNT(*) FROM `disciplinas`
+ +

Started DELETE “/disciplinas/63” for 127.0.0.1 at 2026-06-30 14:32:31 -0300 Processing by DisciplinasController#destroy as HTML

+ +
Parameters: {"id" => "63"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 160 LIMIT 1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`id` = 63 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Load (0.4ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`disciplina_id` = 63
+Disciplina Destroy (0.3ms)  DELETE FROM `disciplinas` WHERE `disciplinas`.`id` = 63
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/disciplinas Completed 303 See Other in 3ms (ActiveRecord: 1.4ms (4 queries, 0 cached) | GC: 0.0ms)

+ +
Disciplina Count (0.2ms)  SELECT COUNT(*) FROM `disciplinas`
+TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_princ' LIMIT 1
+Usuario Exists? (0.1ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_princ@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:32.039182', NULL, NULL, NULL, NULL, 'doc_princ@unb.br', 'Doutorado', 'doc_princ', 'Docente Principal', NULL, NULL, '$2a$12$R0zrrPoUtCuMZVEAXg7eoeMoCN0Ux7WHRm1vriEj/cDSYJsNKmHxS', 'Docente', '2026-06-30 17:32:32.039182')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:32 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_princ@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_princ@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/161/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started DELETE “/logout” for 127.0.0.1 at 2026-06-30 14:32:32 -0300 Processing by SessionsController#destroy as HTML Redirected to www.example.com/ Completed 302 Found in 0ms (ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 0.0ms) Started GET “/docentes” for 127.0.0.1 at 2026-06-30 14:32:32 -0300 Processing by DocentesController#index as HTML

+ +
Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+ +

Redirected to www.example.com/ Filter chain halted as :require_login rendered or redirected Completed 302 Found in 1ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_princ' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_princ@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:32.423840', NULL, NULL, NULL, NULL, 'doc_princ@unb.br', 'Doutorado', 'doc_princ', 'Docente Principal', NULL, NULL, '$2a$12$ErMqtoUOMGDPov9uiF79LOL2N/H9NCFRXasQzQy9VlfaMqSrqoATG', 'Docente', '2026-06-30 17:32:32.423840')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:32 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_princ@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_princ@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/162/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/docentes” for 127.0.0.1 at 2026-06-30 14:32:32 -0300 Processing by DocentesController#index as HTML

+ +
Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 162 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering docentes/index.html.erb within layouts/application
+Docente Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Docente'
+Rendered docentes/_docente.html.erb (Duration: 0.1ms | GC: 0.0ms)
+Rendered docentes/index.html.erb within layouts/application (Duration: 1.4ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.6ms | GC: 0.0ms)
+ +

Completed 200 OK in 4ms (Views: 1.7ms | ActiveRecord: 0.6ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_princ' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_princ@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:32.808765', NULL, NULL, NULL, NULL, 'doc_princ@unb.br', 'Doutorado', 'doc_princ', 'Docente Principal', NULL, NULL, '$2a$12$r.mPQYzfIwKnEmQm/N3Mt.IDpmBZNwLjnIM92D3cCGxBtARxmTj2q', 'Docente', '2026-06-30 17:32:32.808765')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:32 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_princ@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_princ@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/163/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/docentes/new” for 127.0.0.1 at 2026-06-30 14:32:32 -0300 Processing by DocentesController#new as HTML

+ +
Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 163 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering docentes/new.html.erb within layouts/application
+Rendered docentes/_form.html.erb (Duration: 0.9ms | GC: 0.2ms)
+Rendered docentes/new.html.erb within layouts/application (Duration: 1.3ms | GC: 0.2ms)
+Rendered layout layouts/application.html.erb (Duration: 1.5ms | GC: 0.2ms)
+ +

Completed 200 OK in 3ms (Views: 1.7ms | ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.2ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_princ' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_princ@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:33.192331', NULL, NULL, NULL, NULL, 'doc_princ@unb.br', 'Doutorado', 'doc_princ', 'Docente Principal', NULL, NULL, '$2a$12$j8TorHoVhoaL.WLzyTHhrulnuv1EUqab4uQEXzlYBupmzcjUtRXPq', 'Docente', '2026-06-30 17:32:33.192331')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:33 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_princ@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_princ@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/164/avaliacoes Completed 302 Found in 187ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Docente Count (0.5ms)  SELECT COUNT(*) FROM `usuarios` WHERE `usuarios`.`type` = 'Docente'
+ +

Started POST “/docentes” for 127.0.0.1 at 2026-06-30 14:32:33 -0300 Processing by DocentesController#create as HTML

+ +
Parameters: {"docente" => {"nome" => "Novo Docente", "matricula" => "doc_novo", "email" => "[FILTERED]", "formacao" => "Mestrado"}}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 164 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_novo' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_novo@unb.br' LIMIT 1
+Docente Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:33.384638', NULL, NULL, NULL, NULL, 'doc_novo@unb.br', 'Mestrado', 'doc_novo', 'Novo Docente', NULL, NULL, NULL, 'Docente', '2026-06-30 17:32:33.384638')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/docentes/165 Completed 302 Found in 3ms (ActiveRecord: 1.5ms (4 queries, 0 cached) | GC: 0.0ms)

+ +
Docente Count (0.2ms)  SELECT COUNT(*) FROM `usuarios` WHERE `usuarios`.`type` = 'Docente'
+Docente Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Docente' ORDER BY `usuarios`.`id` DESC LIMIT 1
+TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_princ' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_princ@unb.br' LIMIT 1
+Docente Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:33.575634', NULL, NULL, NULL, NULL, 'doc_princ@unb.br', 'Doutorado', 'doc_princ', 'Docente Principal', NULL, NULL, '$2a$12$n2n54R5NXi4qhq1j6n6XqOsFb5aKuChpBR3whT03V6xbKq/Fwu3VO', 'Docente', '2026-06-30 17:32:33.575634')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:33 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_princ@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_princ@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/166/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Docente Count (0.4ms)  SELECT COUNT(*) FROM `usuarios` WHERE `usuarios`.`type` = 'Docente'
+ +

Started POST “/docentes” for 127.0.0.1 at 2026-06-30 14:32:33 -0300 Processing by DocentesController#create as HTML

+ +
Parameters: {"docente" => {"nome" => "", "matricula" => "", "email" => "[FILTERED]", "formacao" => ""}}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 166 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '' LIMIT 1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = '' LIMIT 1
+TRANSACTION (0.2ms)  ROLLBACK TO SAVEPOINT active_record_1
+Rendering layout layouts/application.html.erb
+Rendering docentes/new.html.erb within layouts/application
+Rendered docentes/_form.html.erb (Duration: 2.0ms | GC: 0.0ms)
+Rendered docentes/new.html.erb within layouts/application (Duration: 2.1ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 2.4ms | GC: 0.1ms)
+ +

Completed 422 Unprocessable Content in 5ms (Views: 2.6ms | ActiveRecord: 1.3ms (3 queries, 0 cached) | GC: 0.2ms)

+ +
Docente Count (0.3ms)  SELECT COUNT(*) FROM `usuarios` WHERE `usuarios`.`type` = 'Docente'
+TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_princ' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_princ@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:33.962624', NULL, NULL, NULL, NULL, 'doc_princ@unb.br', 'Doutorado', 'doc_princ', 'Docente Principal', NULL, NULL, '$2a$12$tGR5PH.GD/RqNZejnpSTFOOiS3GadlBetBI/CjRwPn9ByMhflslXy', 'Docente', '2026-06-30 17:32:33.962624')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:33 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_princ@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_princ@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/167/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/docentes/167” for 127.0.0.1 at 2026-06-30 14:32:34 -0300 Processing by DocentesController#show as HTML

+ +
Parameters: {"id" => "167"}
+Usuario Load (0.5ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 167 LIMIT 1
+Docente Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Docente' AND `usuarios`.`id` = 167 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering docentes/show.html.erb within layouts/application
+Rendered docentes/_docente.html.erb (Duration: 0.0ms | GC: 0.0ms)
+Rendered docentes/show.html.erb within layouts/application (Duration: 0.5ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.9ms | GC: 0.1ms)
+ +

Completed 200 OK in 3ms (Views: 1.1ms | ActiveRecord: 0.8ms (2 queries, 0 cached) | GC: 0.1ms)

+ +
TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_princ' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_princ@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:34.346321', NULL, NULL, NULL, NULL, 'doc_princ@unb.br', 'Doutorado', 'doc_princ', 'Docente Principal', NULL, NULL, '$2a$12$Xnxxk4Wes9w/CI23QjbNwuyZy41QSRbTeIUYNSJXawsrE5.Jcv1VC', 'Docente', '2026-06-30 17:32:34.346321')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:34 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_princ@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_princ@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/168/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/docentes/168/edit” for 127.0.0.1 at 2026-06-30 14:32:34 -0300 Processing by DocentesController#edit as HTML

+ +
Parameters: {"id" => "168"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 168 LIMIT 1
+Docente Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Docente' AND `usuarios`.`id` = 168 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering docentes/edit.html.erb within layouts/application
+Rendered docentes/_form.html.erb (Duration: 0.6ms | GC: 0.0ms)
+Rendered docentes/edit.html.erb within layouts/application (Duration: 0.8ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.0ms | GC: 0.0ms)
+ +

Completed 200 OK in 3ms (Views: 1.1ms | ActiveRecord: 0.6ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.9ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_princ' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_princ@unb.br' LIMIT 1
+Docente Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:34.729031', NULL, NULL, NULL, NULL, 'doc_princ@unb.br', 'Doutorado', 'doc_princ', 'Docente Principal', NULL, NULL, '$2a$12$CJmiF0Fg9M21nRPcBKjiE.10AHAtrjwaK55/V4gOsLaAYnJWzCktW', 'Docente', '2026-06-30 17:32:34.729031')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:34 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_princ@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_princ@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/169/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started PATCH “/docentes/169” for 127.0.0.1 at 2026-06-30 14:32:34 -0300 Processing by DocentesController#update as HTML

+ +
Parameters: {"docente" => {"nome" => "Nome Atualizado", "matricula" => "doc_princ", "email" => "[FILTERED]", "formacao" => "PhD"}, "id" => "169"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 169 LIMIT 1
+Docente Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Docente' AND `usuarios`.`id` = 169 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.5ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_princ@unb.br' AND `usuarios`.`id` != 169 LIMIT 1
+Docente Update (0.4ms)  UPDATE `usuarios` SET `usuarios`.`formacao` = 'PhD', `usuarios`.`nome` = 'Nome Atualizado', `usuarios`.`updated_at` = '2026-06-30 17:32:34.921633' WHERE `usuarios`.`id` = 169
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/docentes/169 Completed 303 See Other in 3ms (ActiveRecord: 1.7ms (4 queries, 0 cached) | GC: 0.0ms)

+ +
Docente Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Docente' AND `usuarios`.`id` = 169 LIMIT 1
+TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_princ' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_princ@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:35.112950', NULL, NULL, NULL, NULL, 'doc_princ@unb.br', 'Doutorado', 'doc_princ', 'Docente Principal', NULL, NULL, '$2a$12$pw5HpkESf25sCb1Rugov6.Why3baua5GZJNiCR5FGKkpcPxTPK0Bu', 'Docente', '2026-06-30 17:32:35.112950')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:35 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_princ@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_princ@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/170/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started PATCH “/docentes/170” for 127.0.0.1 at 2026-06-30 14:32:35 -0300 Processing by DocentesController#update as HTML

+ +
Parameters: {"docente" => {"nome" => "", "matricula" => "", "email" => "[FILTERED]", "formacao" => ""}, "id" => "170"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 170 LIMIT 1
+Docente Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Docente' AND `usuarios`.`id` = 170 LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '' AND `usuarios`.`id` != 170 LIMIT 1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = '' AND `usuarios`.`id` != 170 LIMIT 1
+TRANSACTION (0.2ms)  ROLLBACK TO SAVEPOINT active_record_1
+Rendering layout layouts/application.html.erb
+Rendering docentes/edit.html.erb within layouts/application
+Rendered docentes/_form.html.erb (Duration: 2.1ms | GC: 0.1ms)
+Rendered docentes/edit.html.erb within layouts/application (Duration: 2.2ms | GC: 0.1ms)
+Rendered layout layouts/application.html.erb (Duration: 2.4ms | GC: 0.1ms)
+ +

Completed 422 Unprocessable Content in 6ms (Views: 2.6ms | ActiveRecord: 1.6ms (4 queries, 0 cached) | GC: 0.1ms)

+ +
TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_princ' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_princ@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:35.498189', NULL, NULL, NULL, NULL, 'doc_princ@unb.br', 'Doutorado', 'doc_princ', 'Docente Principal', NULL, NULL, '$2a$12$qZNGGZsAy5PoM1ku15jkPO6vPoY3zTYaxPLgg1akWQou0hkC8aJTW', 'Docente', '2026-06-30 17:32:35.498189')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:35 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_princ@unb.br", "senha" => "Senha123"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_princ@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/171/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.1ms)

+ +
TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.6ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'del_doc' LIMIT 1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'del_doc@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:35.689391', NULL, NULL, NULL, NULL, 'del_doc@unb.br', 'Grad', 'del_doc', 'Para Deletar', NULL, NULL, NULL, 'Docente', '2026-06-30 17:32:35.689391')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Docente Count (0.3ms)  SELECT COUNT(*) FROM `usuarios` WHERE `usuarios`.`type` = 'Docente'
+ +

Started DELETE “/docentes/172” for 127.0.0.1 at 2026-06-30 14:32:35 -0300 Processing by DocentesController#destroy as HTML

+ +
Parameters: {"id" => "172"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 171 LIMIT 1
+Docente Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Docente' AND `usuarios`.`id` = 172 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Docente::HABTM_Turmas Delete All (0.7ms)  DELETE FROM `docentes_turmas` WHERE `docentes_turmas`.`docente_id` = 172
+Docente Destroy (0.4ms)  DELETE FROM `usuarios` WHERE `usuarios`.`id` = 172
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/docentes Completed 303 See Other in 6ms (ActiveRecord: 5.1ms (4 queries, 0 cached) | GC: 0.0ms)

+ +
Docente Count (0.2ms)  SELECT COUNT(*) FROM `usuarios` WHERE `usuarios`.`type` = 'Docente'
+TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_ef' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_ef@unb.br' LIMIT 1
+Docente Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:35.888418', NULL, NULL, NULL, NULL, 'doc_ef@unb.br', 'Doutorado', 'doc_ef', 'Docente EF', NULL, NULL, '$2a$12$FIn/pnDuQ470iYsuA46d5ePRylb7xVphOnAfS7nDp7WT/LLqvDpRe', 'Docente', '2026-06-30 17:32:35.888418')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:35.890593', 'Ciência da Computação', '2026-06-30 17:32:35.890593')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 161 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:32:35.892127', 161, 'Engenharia de Software', '2026-06-30 17:32:35.892127')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 64 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 64 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:32:35.893699', 64, NULL, 'TA', '2026.1', '2026-06-30 17:32:35.893699')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:32:35.894330', NULL, NULL, NULL, NULL, 49, '2026-06-30 17:32:35.894330')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:32:35.895121', 'Questão EF', 39, 1, NULL, '2026-06-30 17:32:35.895121')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:35 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_ef@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_ef@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/173/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started DELETE “/logout” for 127.0.0.1 at 2026-06-30 14:32:36 -0300 Processing by SessionsController#destroy as HTML Redirected to www.example.com/ Completed 302 Found in 0ms (ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 0.0ms) Started GET “/elemento_forms” for 127.0.0.1 at 2026-06-30 14:32:36 -0300 Processing by ElementoFormsController#index as HTML

+ +
Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+ +

Redirected to www.example.com/ Filter chain halted as :require_login rendered or redirected Completed 302 Found in 1ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_ef' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_ef@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:36.276995', NULL, NULL, NULL, NULL, 'doc_ef@unb.br', 'Doutorado', 'doc_ef', 'Docente EF', NULL, NULL, '$2a$12$Wf.hshCludELRS1gGjQxxuBR4IuQA.jP2jacAYMbKKDR9U.QXtbgu', 'Docente', '2026-06-30 17:32:36.276995')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:36.278995', 'Ciência da Computação', '2026-06-30 17:32:36.278995')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 162 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:32:36.280440', 162, 'Engenharia de Software', '2026-06-30 17:32:36.280440')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 65 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 65 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:32:36.281966', 65, NULL, 'TA', '2026.1', '2026-06-30 17:32:36.281966')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:32:36.282613', NULL, NULL, NULL, NULL, 50, '2026-06-30 17:32:36.282613')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:32:36.283483', 'Questão EF', 40, 1, NULL, '2026-06-30 17:32:36.283483')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:36 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_ef@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_ef@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/174/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/elemento_forms” for 127.0.0.1 at 2026-06-30 14:32:36 -0300 Processing by ElementoFormsController#index as HTML

+ +
Usuario Load (0.5ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 174 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering elemento_forms/index.html.erb within layouts/application
+ElementoForm Load (0.3ms)  SELECT `elemento_forms`.* FROM `elemento_forms`
+Rendered elemento_forms/_elemento_form.html.erb (Duration: 0.1ms | GC: 0.0ms)
+Rendered elemento_forms/index.html.erb within layouts/application (Duration: 1.1ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 3ms (Views: 1.4ms | ActiveRecord: 0.8ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_ef' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_ef@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:36.665870', NULL, NULL, NULL, NULL, 'doc_ef@unb.br', 'Doutorado', 'doc_ef', 'Docente EF', NULL, NULL, '$2a$12$l1AtZ6nDmZ82u1XghOxtheCGM4Uqxsi2hN5Zs8lh1xUqX6sbq2oGS', 'Docente', '2026-06-30 17:32:36.665870')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:36.667969', 'Ciência da Computação', '2026-06-30 17:32:36.667969')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 163 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:32:36.669448', 163, 'Engenharia de Software', '2026-06-30 17:32:36.669448')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 66 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 66 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:32:36.670956', 66, NULL, 'TA', '2026.1', '2026-06-30 17:32:36.670956')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:32:36.671569', NULL, NULL, NULL, NULL, 51, '2026-06-30 17:32:36.671569')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:32:36.672307', 'Questão EF', 41, 1, NULL, '2026-06-30 17:32:36.672307')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:36 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_ef@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_ef@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/175/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/elemento_forms/new” for 127.0.0.1 at 2026-06-30 14:32:36 -0300 Processing by ElementoFormsController#new as HTML

+ +
Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 175 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering elemento_forms/new.html.erb within layouts/application
+Rendered elemento_forms/_form.html.erb (Duration: 0.6ms | GC: 0.0ms)
+Rendered elemento_forms/new.html.erb within layouts/application (Duration: 0.9ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.2ms | GC: 0.0ms)
+ +

Completed 200 OK in 3ms (Views: 1.3ms | ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.6ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_ef' LIMIT 1
+Usuario Exists? (0.1ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_ef@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:37.055801', NULL, NULL, NULL, NULL, 'doc_ef@unb.br', 'Doutorado', 'doc_ef', 'Docente EF', NULL, NULL, '$2a$12$wFlHheKUe2iZLv9v/hzcuO.44puYSetyvrO0HU4MIrQn4rXmYk0lK', 'Docente', '2026-06-30 17:32:37.055801')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:37.058123', 'Ciência da Computação', '2026-06-30 17:32:37.058123')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.3ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 164 LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.4ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:32:37.059730', 164, 'Engenharia de Software', '2026-06-30 17:32:37.059730')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 67 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.3ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 67 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:32:37.061263', 67, NULL, 'TA', '2026.1', '2026-06-30 17:32:37.061263')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.3ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:32:37.061869', NULL, NULL, NULL, NULL, 52, '2026-06-30 17:32:37.061869')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.3ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:32:37.062596', 'Questão EF', 42, 1, NULL, '2026-06-30 17:32:37.062596')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:37 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_ef@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_ef@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/176/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms)

+ +
ElementoForm Count (0.3ms)  SELECT COUNT(*) FROM `elemento_forms`
+ +

Started POST “/elemento_forms” for 127.0.0.1 at 2026-06-30 14:32:37 -0300 Processing by ElementoFormsController#create as HTML

+ +
Parameters: {"elemento_form" => {"ordem" => "99", "enunciado" => "Novo EF", "formulario_id" => "42"}}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 176 LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Formulario Load (0.4ms)  SELECT `formularios`.* FROM `formularios` WHERE `formularios`.`id` = 42 LIMIT 1
+ElementoForm Create (0.3ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:32:37.255710', 'Novo EF', 42, 99, NULL, '2026-06-30 17:32:37.255710')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/elemento_forms/29 Completed 302 Found in 3ms (ActiveRecord: 1.4ms (3 queries, 0 cached) | GC: 0.0ms)

+ +
ElementoForm Count (0.2ms)  SELECT COUNT(*) FROM `elemento_forms`
+ElementoForm Load (0.3ms)  SELECT `elemento_forms`.* FROM `elemento_forms` ORDER BY `elemento_forms`.`id` DESC LIMIT 1
+TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_ef' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_ef@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:37.447950', NULL, NULL, NULL, NULL, 'doc_ef@unb.br', 'Doutorado', 'doc_ef', 'Docente EF', NULL, NULL, '$2a$12$cIFxgWZvN5ovMYZsn1qMUOXDYe6RMiS5xip3aCA2OAdAd9fIbSvXq', 'Docente', '2026-06-30 17:32:37.447950')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:37.450097', 'Ciência da Computação', '2026-06-30 17:32:37.450097')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 165 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:32:37.451656', 165, 'Engenharia de Software', '2026-06-30 17:32:37.451656')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 68 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 68 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:32:37.453270', 68, NULL, 'TA', '2026.1', '2026-06-30 17:32:37.453270')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:32:37.453916', NULL, NULL, NULL, NULL, 53, '2026-06-30 17:32:37.453916')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:32:37.454706', 'Questão EF', 43, 1, NULL, '2026-06-30 17:32:37.454706')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:37 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_ef@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_ef@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/177/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms)

+ +
ElementoForm Count (0.3ms)  SELECT COUNT(*) FROM `elemento_forms`
+ +

Started POST “/elemento_forms” for 127.0.0.1 at 2026-06-30 14:32:37 -0300 Processing by ElementoFormsController#create as HTML

+ +
Parameters: {"elemento_form" => {"ordem" => nil, "enunciado" => "EF", "formulario_id" => "43"}}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 177 LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Formulario Load (0.4ms)  SELECT `formularios`.* FROM `formularios` WHERE `formularios`.`id` = 43 LIMIT 1
+TRANSACTION (0.1ms)  ROLLBACK TO SAVEPOINT active_record_1
+Rendering layout layouts/application.html.erb
+Rendering elemento_forms/new.html.erb within layouts/application
+Rendered elemento_forms/_form.html.erb (Duration: 0.7ms | GC: 0.0ms)
+Rendered elemento_forms/new.html.erb within layouts/application (Duration: 0.8ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.0ms | GC: 0.0ms)
+ +

Completed 422 Unprocessable Content in 3ms (Views: 1.2ms | ActiveRecord: 1.0ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
ElementoForm Count (0.2ms)  SELECT COUNT(*) FROM `elemento_forms`
+TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_ef' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_ef@unb.br' LIMIT 1
+Docente Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:37.839560', NULL, NULL, NULL, NULL, 'doc_ef@unb.br', 'Doutorado', 'doc_ef', 'Docente EF', NULL, NULL, '$2a$12$NAwxlQ7oHemMfA2H4.Yi/ebpM8fN.eOSb76tqDGT.0ChZmV.PyXfW', 'Docente', '2026-06-30 17:32:37.839560')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:37.842170', 'Ciência da Computação', '2026-06-30 17:32:37.842170')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 166 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:32:37.843701', 166, 'Engenharia de Software', '2026-06-30 17:32:37.843701')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 69 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 69 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:32:37.845221', 69, NULL, 'TA', '2026.1', '2026-06-30 17:32:37.845221')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:32:37.845842', NULL, NULL, NULL, NULL, 54, '2026-06-30 17:32:37.845842')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:32:37.846600', 'Questão EF', 44, 1, NULL, '2026-06-30 17:32:37.846600')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:37 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_ef@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_ef@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/178/avaliacoes Completed 302 Found in 190ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/elemento_forms/31” for 127.0.0.1 at 2026-06-30 14:32:38 -0300 Processing by ElementoFormsController#show as HTML

+ +
Parameters: {"id" => "31"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 178 LIMIT 1
+ElementoForm Load (0.2ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`id` = 31 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering elemento_forms/show.html.erb within layouts/application
+Rendered elemento_forms/_elemento_form.html.erb (Duration: 0.0ms | GC: 0.0ms)
+Rendered elemento_forms/show.html.erb within layouts/application (Duration: 0.4ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.6ms | GC: 0.0ms)
+ +

Completed 200 OK in 2ms (Views: 0.7ms | ActiveRecord: 0.5ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_ef' LIMIT 1
+Usuario Exists? (0.1ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_ef@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:38.230680', NULL, NULL, NULL, NULL, 'doc_ef@unb.br', 'Doutorado', 'doc_ef', 'Docente EF', NULL, NULL, '$2a$12$OcGF.3U3RzWOvI2VnL5K1.oyfEAVaUuXt9/a7Z0gLPqxdKV6ku9gK', 'Docente', '2026-06-30 17:32:38.230680')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:38.232719', 'Ciência da Computação', '2026-06-30 17:32:38.232719')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 167 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:32:38.234142', 167, 'Engenharia de Software', '2026-06-30 17:32:38.234142')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 70 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 70 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:32:38.235654', 70, NULL, 'TA', '2026.1', '2026-06-30 17:32:38.235654')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:32:38.236274', NULL, NULL, NULL, NULL, 55, '2026-06-30 17:32:38.236274')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:32:38.237061', 'Questão EF', 45, 1, NULL, '2026-06-30 17:32:38.237061')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:38 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_ef@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_ef@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/179/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/elemento_forms/32/edit” for 127.0.0.1 at 2026-06-30 14:32:38 -0300 Processing by ElementoFormsController#edit as HTML

+ +
Parameters: {"id" => "32"}
+Usuario Load (0.5ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 179 LIMIT 1
+ElementoForm Load (0.3ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`id` = 32 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering elemento_forms/edit.html.erb within layouts/application
+Rendered elemento_forms/_form.html.erb (Duration: 0.4ms | GC: 0.0ms)
+Rendered elemento_forms/edit.html.erb within layouts/application (Duration: 0.6ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.9ms | GC: 0.0ms)
+ +

Completed 200 OK in 3ms (Views: 1.0ms | ActiveRecord: 0.7ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_ef' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_ef@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:38.619104', NULL, NULL, NULL, NULL, 'doc_ef@unb.br', 'Doutorado', 'doc_ef', 'Docente EF', NULL, NULL, '$2a$12$vckjn2M3qk2KWikHizPUB.NwGDHnkwA7.OdQm2vOAxFhaA8vT7wXi', 'Docente', '2026-06-30 17:32:38.619104')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:38.620950', 'Ciência da Computação', '2026-06-30 17:32:38.620950')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 168 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:32:38.622392', 168, 'Engenharia de Software', '2026-06-30 17:32:38.622392')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 71 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.3ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 71 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:32:38.623886', 71, NULL, 'TA', '2026.1', '2026-06-30 17:32:38.623886')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:32:38.624481', NULL, NULL, NULL, NULL, 56, '2026-06-30 17:32:38.624481')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:32:38.625227', 'Questão EF', 46, 1, NULL, '2026-06-30 17:32:38.625227')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:38 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_ef@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_ef@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/180/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started PATCH “/elemento_forms/33” for 127.0.0.1 at 2026-06-30 14:32:38 -0300 Processing by ElementoFormsController#update as HTML

+ +
Parameters: {"elemento_form" => {"ordem" => "1", "enunciado" => "EF Atualizado", "formulario_id" => "46"}, "id" => "33"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 180 LIMIT 1
+ElementoForm Load (0.2ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`id` = 33 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Update (0.6ms)  UPDATE `elemento_forms` SET `elemento_forms`.`enunciado` = 'EF Atualizado', `elemento_forms`.`updated_at` = '2026-06-30 17:32:38.816674' WHERE `elemento_forms`.`id` = 33
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/elemento_forms/33 Completed 303 See Other in 3ms (ActiveRecord: 1.5ms (3 queries, 0 cached) | GC: 0.0ms)

+ +
ElementoForm Load (0.2ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`id` = 33 LIMIT 1
+TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_ef' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_ef@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:39.008625', NULL, NULL, NULL, NULL, 'doc_ef@unb.br', 'Doutorado', 'doc_ef', 'Docente EF', NULL, NULL, '$2a$12$cJ.mey41rA0vb.lm3F2r2uGzMDn8CsGRwF9xItNJKGQh1QevJVJGm', 'Docente', '2026-06-30 17:32:39.008625')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:39.013612', 'Ciência da Computação', '2026-06-30 17:32:39.013612')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 169 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:32:39.015094', 169, 'Engenharia de Software', '2026-06-30 17:32:39.015094')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 72 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 72 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:32:39.016672', 72, NULL, 'TA', '2026.1', '2026-06-30 17:32:39.016672')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:32:39.017309', NULL, NULL, NULL, NULL, 57, '2026-06-30 17:32:39.017309')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:32:39.018094', 'Questão EF', 47, 1, NULL, '2026-06-30 17:32:39.018094')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:39 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_ef@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_ef@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/181/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started PATCH “/elemento_forms/34” for 127.0.0.1 at 2026-06-30 14:32:39 -0300 Processing by ElementoFormsController#update as HTML

+ +
Parameters: {"elemento_form" => {"ordem" => nil, "enunciado" => "EF", "formulario_id" => "47"}, "id" => "34"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 181 LIMIT 1
+ElementoForm Load (0.2ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`id` = 34 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering elemento_forms/edit.html.erb within layouts/application
+Rendered elemento_forms/_form.html.erb (Duration: 0.7ms | GC: 0.0ms)
+Rendered elemento_forms/edit.html.erb within layouts/application (Duration: 0.8ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.1ms | GC: 0.0ms)
+ +

Completed 422 Unprocessable Content in 3ms (Views: 1.2ms | ActiveRecord: 0.5ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_ef' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_ef@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:39.402860', NULL, NULL, NULL, NULL, 'doc_ef@unb.br', 'Doutorado', 'doc_ef', 'Docente EF', NULL, NULL, '$2a$12$ESlCEJq5qXNZq1N1RMBXJes.eOjQoLgi06eKIW5CTDQHI4lkI47gy', 'Docente', '2026-06-30 17:32:39.402860')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:39.405404', 'Ciência da Computação', '2026-06-30 17:32:39.405404')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 170 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:32:39.406955', 170, 'Engenharia de Software', '2026-06-30 17:32:39.406955')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 73 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 73 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:32:39.408533', 73, NULL, 'TA', '2026.1', '2026-06-30 17:32:39.408533')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.5ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:32:39.409446', NULL, NULL, NULL, NULL, 58, '2026-06-30 17:32:39.409446')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:32:39.410291', 'Questão EF', 48, 1, NULL, '2026-06-30 17:32:39.410291')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:39 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_ef@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_ef@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/182/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.5ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:32:39.600121', NULL, 48, 50, NULL, '2026-06-30 17:32:39.600121')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ElementoForm Count (0.2ms)  SELECT COUNT(*) FROM `elemento_forms`
+ +

Started DELETE “/elemento_forms/36” for 127.0.0.1 at 2026-06-30 14:32:39 -0300 Processing by ElementoFormsController#destroy as HTML

+ +
Parameters: {"id" => "36"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 182 LIMIT 1
+ElementoForm Load (0.2ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`id` = 36 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Load (0.5ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` = 36
+ElementoForm Destroy (0.3ms)  DELETE FROM `elemento_forms` WHERE `elemento_forms`.`id` = 36
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/elemento_forms Completed 303 See Other in 3ms (ActiveRecord: 1.5ms (4 queries, 0 cached) | GC: 0.2ms)

+ +
ElementoForm Count (0.2ms)  SELECT COUNT(*) FROM `elemento_forms`
+TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:39.607911', 'Ciência da Computação', '2026-06-30 17:32:39.607911')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_elem2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'adm_elem2@unb.br' LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:39.796858', NULL, NULL, NULL, 171, 'adm_elem2@unb.br', NULL, 'adm_elem2', 'Admin Elem', NULL, NULL, '$2a$12$YbaAI5pVNTeSHYOiH7jeVug7/IoZuDWb1j2EKm5MrxctejxRk3Ese', 'Administrador', '2026-06-30 17:32:39.796858')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Administrador Load (0.7ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 183 LIMIT 1
+Template Create (0.3ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:32:39.799365', 'Template Elem', '2026-06-30 17:32:39.799365', 183)
+Elemento Create (0.2ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:32:39.799828', 'Q Setup', 1, 32, '2026-06-30 17:32:39.799828')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:39 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "adm_elem2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'adm_elem2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/183/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started DELETE “/logout” for 127.0.0.1 at 2026-06-30 14:32:39 -0300 Processing by SessionsController#destroy as HTML Redirected to www.example.com/ Completed 302 Found in 0ms (ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 0.0ms) Started GET “/elementos” for 127.0.0.1 at 2026-06-30 14:32:39 -0300 Processing by ElementosController#index as HTML

+ +
Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+ +

Redirected to www.example.com/ Filter chain halted as :require_login rendered or redirected Completed 302 Found in 1ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.2ms)

+ +
TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:39.995238', 'Ciência da Computação', '2026-06-30 17:32:39.995238')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_elem2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'adm_elem2@unb.br' LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:40.184066', NULL, NULL, NULL, 172, 'adm_elem2@unb.br', NULL, 'adm_elem2', 'Admin Elem', NULL, NULL, '$2a$12$cwuJeOxlkvFvTh8tvJAQNe0EEQXUOIeLaBC0/lgkOIirm.Its9PLu', 'Administrador', '2026-06-30 17:32:40.184066')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Administrador Load (0.5ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 184 LIMIT 1
+Template Create (0.3ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:32:40.186277', 'Template Elem', '2026-06-30 17:32:40.186277', 184)
+Elemento Create (0.2ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:32:40.186736', 'Q Setup', 1, 33, '2026-06-30 17:32:40.186736')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:40 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "adm_elem2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'adm_elem2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/184/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.2ms) Started GET “/elementos” for 127.0.0.1 at 2026-06-30 14:32:40 -0300 Processing by ElementosController#index as HTML

+ +
Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 184 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering elementos/index.html.erb within layouts/application
+Elemento Load (0.2ms)  SELECT `elementos`.* FROM `elementos`
+Rendered elementos/_elemento.html.erb (Duration: 0.1ms | GC: 0.0ms)
+Rendered elementos/index.html.erb within layouts/application (Duration: 1.1ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 3ms (Views: 1.6ms | ActiveRecord: 0.5ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:40.381923', 'Ciência da Computação', '2026-06-30 17:32:40.381923')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_elem2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'adm_elem2@unb.br' LIMIT 1
+Administrador Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:40.570309', NULL, NULL, NULL, 173, 'adm_elem2@unb.br', NULL, 'adm_elem2', 'Admin Elem', NULL, NULL, '$2a$12$7ChPDlF.01n2yYJ9Rcw9YO0Kc7Ic2J5/mPsqxf2fUYGKcf08rNhdK', 'Administrador', '2026-06-30 17:32:40.570309')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Administrador Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 185 LIMIT 1
+Template Create (0.2ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:32:40.572132', 'Template Elem', '2026-06-30 17:32:40.572132', 185)
+Elemento Create (0.2ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:32:40.572552', 'Q Setup', 1, 34, '2026-06-30 17:32:40.572552')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:40 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "adm_elem2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'adm_elem2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/185/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/elementos/new” for 127.0.0.1 at 2026-06-30 14:32:40 -0300 Processing by ElementosController#new as HTML

+ +
Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 185 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering elementos/new.html.erb within layouts/application
+Rendered elementos/_form.html.erb (Duration: 0.6ms | GC: 0.0ms)
+Rendered elementos/new.html.erb within layouts/application (Duration: 1.0ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.3ms | GC: 0.1ms)
+ +

Completed 200 OK in 3ms (Views: 1.4ms | ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.1ms)

+ +
TRANSACTION (0.6ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:40.767639', 'Ciência da Computação', '2026-06-30 17:32:40.767639')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_elem2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'adm_elem2@unb.br' LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:40.956380', NULL, NULL, NULL, 174, 'adm_elem2@unb.br', NULL, 'adm_elem2', 'Admin Elem', NULL, NULL, '$2a$12$GP//ttLo1V3.kR5PcZrKeezvstuiEMDPDtve3OX77Woeie5iIfQEG', 'Administrador', '2026-06-30 17:32:40.956380')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Administrador Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 186 LIMIT 1
+Template Create (0.2ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:32:40.958567', 'Template Elem', '2026-06-30 17:32:40.958567', 186)
+Elemento Create (0.2ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:32:40.958987', 'Q Setup', 1, 35, '2026-06-30 17:32:40.958987')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:40 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "adm_elem2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'adm_elem2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/186/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.1ms)

+ +
Elemento Count (0.3ms)  SELECT COUNT(*) FROM `elementos`
+ +

Started POST “/elementos” for 127.0.0.1 at 2026-06-30 14:32:41 -0300 Processing by ElementosController#create as HTML

+ +
Parameters: {"elemento" => {"enunciado" => "Nova Questão", "ordem" => "99", "template_id" => "35"}}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 186 LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Template Load (0.4ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`id` = 35 LIMIT 1
+Elemento Create (0.3ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:32:41.150935', 'Nova Questão', 99, 35, '2026-06-30 17:32:41.150935')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/elementos/35 Completed 302 Found in 2ms (ActiveRecord: 1.3ms (3 queries, 0 cached) | GC: 0.0ms)

+ +
Elemento Count (0.2ms)  SELECT COUNT(*) FROM `elementos`
+Elemento Load (0.2ms)  SELECT `elementos`.* FROM `elementos` ORDER BY `elementos`.`id` DESC LIMIT 1
+TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:41.155120', 'Ciência da Computação', '2026-06-30 17:32:41.155120')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_elem2' LIMIT 1
+Usuario Exists? (0.1ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'adm_elem2@unb.br' LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:41.343763', NULL, NULL, NULL, 175, 'adm_elem2@unb.br', NULL, 'adm_elem2', 'Admin Elem', NULL, NULL, '$2a$12$7l5WCOjAerytGIOHok1KueHlckr8/L.kNMAD2gCWcW1UAhnJGIgHq', 'Administrador', '2026-06-30 17:32:41.343763')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Administrador Load (0.5ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 187 LIMIT 1
+Template Create (0.3ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:32:41.345964', 'Template Elem', '2026-06-30 17:32:41.345964', 187)
+Elemento Create (0.3ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:32:41.346408', 'Q Setup', 1, 36, '2026-06-30 17:32:41.346408')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:41 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "adm_elem2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'adm_elem2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/187/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Elemento Count (0.2ms)  SELECT COUNT(*) FROM `elementos`
+ +

Started POST “/elementos” for 127.0.0.1 at 2026-06-30 14:32:41 -0300 Processing by ElementosController#create as HTML

+ +
Parameters: {"elemento" => {"enunciado" => "Questão", "ordem" => "1", "template_id" => nil}}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 187 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering elementos/new.html.erb within layouts/application
+Rendered elementos/_form.html.erb (Duration: 0.6ms | GC: 0.0ms)
+Rendered elementos/new.html.erb within layouts/application (Duration: 0.7ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.0ms | GC: 0.0ms)
+ +

Completed 422 Unprocessable Content in 2ms (Views: 1.2ms | ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Elemento Count (0.2ms)  SELECT COUNT(*) FROM `elementos`
+TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:41.541605', 'Ciência da Computação', '2026-06-30 17:32:41.541605')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_elem2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'adm_elem2@unb.br' LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:41.730324', NULL, NULL, NULL, 176, 'adm_elem2@unb.br', NULL, 'adm_elem2', 'Admin Elem', NULL, NULL, '$2a$12$Pjk5PMmhdKbCfC0kJCqDkuD5BQe/WwUFW/P6pTxkSWOfpkl89Is02', 'Administrador', '2026-06-30 17:32:41.730324')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Administrador Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 188 LIMIT 1
+Template Create (0.2ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:32:41.732568', 'Template Elem', '2026-06-30 17:32:41.732568', 188)
+Elemento Create (0.2ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:32:41.733025', 'Q Setup', 1, 37, '2026-06-30 17:32:41.733025')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:41 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "adm_elem2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'adm_elem2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/188/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/elementos/37” for 127.0.0.1 at 2026-06-30 14:32:41 -0300 Processing by ElementosController#show as HTML

+ +
Parameters: {"id" => "37"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 188 LIMIT 1
+Elemento Load (0.3ms)  SELECT `elementos`.* FROM `elementos` WHERE `elementos`.`id` = 37 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering elementos/show.html.erb within layouts/application
+Rendered elementos/_elemento.html.erb (Duration: 0.0ms | GC: 0.0ms)
+Rendered elementos/show.html.erb within layouts/application (Duration: 0.3ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.6ms | GC: 0.0ms)
+ +

Completed 200 OK in 3ms (Views: 0.7ms | ActiveRecord: 0.6ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:41.928935', 'Ciência da Computação', '2026-06-30 17:32:41.928935')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_elem2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'adm_elem2@unb.br' LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:42.118267', NULL, NULL, NULL, 177, 'adm_elem2@unb.br', NULL, 'adm_elem2', 'Admin Elem', NULL, NULL, '$2a$12$OjeHoYyuQUx/YpKSt47XpujJwJZB6JJ3b4a5LBVcuHVzU/Dbq90OS', 'Administrador', '2026-06-30 17:32:42.118267')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Administrador Load (0.5ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 189 LIMIT 1
+Template Create (0.3ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:32:42.120656', 'Template Elem', '2026-06-30 17:32:42.120656', 189)
+Elemento Create (0.3ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:32:42.121124', 'Q Setup', 1, 38, '2026-06-30 17:32:42.121124')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:42 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "adm_elem2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'adm_elem2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/189/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/elementos/38/edit” for 127.0.0.1 at 2026-06-30 14:32:42 -0300 Processing by ElementosController#edit as HTML

+ +
Parameters: {"id" => "38"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 189 LIMIT 1
+Elemento Load (0.3ms)  SELECT `elementos`.* FROM `elementos` WHERE `elementos`.`id` = 38 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering elementos/edit.html.erb within layouts/application
+Rendered elementos/_form.html.erb (Duration: 0.5ms | GC: 0.1ms)
+Rendered elementos/edit.html.erb within layouts/application (Duration: 0.8ms | GC: 0.1ms)
+Rendered layout layouts/application.html.erb (Duration: 1.0ms | GC: 0.1ms)
+ +

Completed 200 OK in 3ms (Views: 1.1ms | ActiveRecord: 0.6ms (2 queries, 0 cached) | GC: 0.1ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:42.317590', 'Ciência da Computação', '2026-06-30 17:32:42.317590')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_elem2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'adm_elem2@unb.br' LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:42.507009', NULL, NULL, NULL, 178, 'adm_elem2@unb.br', NULL, 'adm_elem2', 'Admin Elem', NULL, NULL, '$2a$12$JPTXIOk8JHmFFUo.jFh0xex7ttoodNJ2lQL6GYzauOEEH3Ad65aCu', 'Administrador', '2026-06-30 17:32:42.507009')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Administrador Load (0.5ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 190 LIMIT 1
+Template Create (0.3ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:32:42.509398', 'Template Elem', '2026-06-30 17:32:42.509398', 190)
+Elemento Create (0.2ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:32:42.509860', 'Q Setup', 1, 39, '2026-06-30 17:32:42.509860')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:42 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "adm_elem2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'adm_elem2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/190/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started PATCH “/elementos/39” for 127.0.0.1 at 2026-06-30 14:32:42 -0300 Processing by ElementosController#update as HTML

+ +
Parameters: {"elemento" => {"enunciado" => "Questão Atualizada", "ordem" => "1", "template_id" => "39"}, "id" => "39"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 190 LIMIT 1
+Elemento Load (0.2ms)  SELECT `elementos`.* FROM `elementos` WHERE `elementos`.`id` = 39 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Elemento Update (0.5ms)  UPDATE `elementos` SET `elementos`.`enunciado` = 'Questão Atualizada', `elementos`.`updated_at` = '2026-06-30 17:32:42.701872' WHERE `elementos`.`id` = 39
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/elementos/39 Completed 303 See Other in 3ms (ActiveRecord: 1.5ms (3 queries, 0 cached) | GC: 0.0ms)

+ +
Elemento Load (0.2ms)  SELECT `elementos`.* FROM `elementos` WHERE `elementos`.`id` = 39 LIMIT 1
+TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:42.706364', 'Ciência da Computação', '2026-06-30 17:32:42.706364')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_elem2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'adm_elem2@unb.br' LIMIT 1
+Administrador Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:42.895719', NULL, NULL, NULL, 179, 'adm_elem2@unb.br', NULL, 'adm_elem2', 'Admin Elem', NULL, NULL, '$2a$12$WYrylceBnGmFtFEzE.jXv.80j4JnaYjTAtgrwI0zfT03IPQZ3f3Ku', 'Administrador', '2026-06-30 17:32:42.895719')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Administrador Load (0.5ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 191 LIMIT 1
+Template Create (0.3ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:32:42.898069', 'Template Elem', '2026-06-30 17:32:42.898069', 191)
+Elemento Create (0.2ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:32:42.898531', 'Q Setup', 1, 40, '2026-06-30 17:32:42.898531')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:42 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "adm_elem2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'adm_elem2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/191/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.1ms) Started PATCH “/elementos/40” for 127.0.0.1 at 2026-06-30 14:32:43 -0300 Processing by ElementosController#update as HTML

+ +
Parameters: {"elemento" => {"enunciado" => "Q", "ordem" => "1", "template_id" => nil}, "id" => "40"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 191 LIMIT 1
+Elemento Load (0.2ms)  SELECT `elementos`.* FROM `elementos` WHERE `elementos`.`id` = 40 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering elementos/edit.html.erb within layouts/application
+Rendered elementos/_form.html.erb (Duration: 0.6ms | GC: 0.0ms)
+Rendered elementos/edit.html.erb within layouts/application (Duration: 0.6ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.9ms | GC: 0.0ms)
+ +

Completed 422 Unprocessable Content in 3ms (Views: 1.0ms | ActiveRecord: 0.6ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:43.094102', 'Ciência da Computação', '2026-06-30 17:32:43.094102')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm_elem2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'adm_elem2@unb.br' LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:43.282824', NULL, NULL, NULL, 180, 'adm_elem2@unb.br', NULL, 'adm_elem2', 'Admin Elem', NULL, NULL, '$2a$12$DhTiLH4x20yJEdk1k1Ji5O3x48VdneeMuGrvwivH3879E/Q8oYsgO', 'Administrador', '2026-06-30 17:32:43.282824')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Administrador Load (0.5ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 192 LIMIT 1
+Template Create (0.3ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:32:43.284911', 'Template Elem', '2026-06-30 17:32:43.284911', 192)
+Elemento Create (0.2ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:32:43.285354', 'Q Setup', 1, 41, '2026-06-30 17:32:43.285354')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:43 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "adm_elem2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'adm_elem2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/192/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Elemento Create (0.5ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:32:43.474516', 'Para Deletar', 50, 41, '2026-06-30 17:32:43.474516')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Elemento Count (0.2ms)  SELECT COUNT(*) FROM `elementos`
+ +

Started DELETE “/elementos/42” for 127.0.0.1 at 2026-06-30 14:32:43 -0300 Processing by ElementosController#destroy as HTML

+ +
Parameters: {"id" => "42"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 192 LIMIT 1
+Elemento Load (0.2ms)  SELECT `elementos`.* FROM `elementos` WHERE `elementos`.`id` = 42 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Campo Load (0.4ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` = 42
+Elemento Destroy (0.3ms)  DELETE FROM `elementos` WHERE `elementos`.`id` = 42
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/elementos Completed 303 See Other in 2ms (ActiveRecord: 1.4ms (4 queries, 0 cached) | GC: 0.0ms)

+ +
Elemento Count (0.2ms)  SELECT COUNT(*) FROM `elementos`
+TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:43.481730', 'Ciência da Computação', '2026-06-30 17:32:43.481730')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '123' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:43.670076', NULL, NULL, NULL, 181, 'admin@unb.br', NULL, '123', 'Admin', NULL, NULL, '$2a$12$2ucR26yQMupncKMUbolo1.PaM/5WLC.gAMAXrrQiKPJkFIPvmVlEy', 'Administrador', '2026-06-30 17:32:43.670076')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:43 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/193/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Formulario Count (0.3ms)  SELECT COUNT(*) FROM `formularios`
+Disciplina Load (0.3ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 181 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.4ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.3ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:32:43.862056', 181, 'Engenharia de Software', '2026-06-30 17:32:43.862056')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 74 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 74 LIMIT 1
+Turma Create (0.3ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:32:43.864022', 74, NULL, 'TA', '2026.1', '2026-06-30 17:32:43.864022')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/formularios” for 127.0.0.1 at 2026-06-30 14:32:43 -0300 Processing by FormulariosController#create as HTML

+ +
Parameters: {"formulario" => {"turma_id" => "59"}}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 193 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Load (0.4ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`id` = 59 LIMIT 1
+Formulario Create (0.2ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:32:43.867094', NULL, NULL, NULL, NULL, 59, '2026-06-30 17:32:43.867094')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/formularios/49 Completed 302 Found in 2ms (ActiveRecord: 1.1ms (3 queries, 0 cached) | GC: 0.0ms)

+ +
Formulario Count (0.2ms)  SELECT COUNT(*) FROM `formularios`
+TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:43.870782', 'Ciência da Computação', '2026-06-30 17:32:43.870782')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 182 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:32:43.872144', 182, 'Engenharia de Software', '2026-06-30 17:32:43.872144')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 75 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 75 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:32:43.873637', 75, NULL, 'TA', '2026.1', '2026-06-30 17:32:43.873637')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:32:43.874245', NULL, NULL, NULL, NULL, 60, '2026-06-30 17:32:43.874245')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Curso Load (0.2ms)  SELECT `cursos`.* FROM `cursos` WHERE `cursos`.`nome` = 'Ciência da Computação' AND `cursos`.`codigo` = 'CIC' AND `cursos`.`departamento_id` = 182 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Curso Exists? (0.3ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`codigo` = 'CIC' LIMIT 1
+Curso Create (0.2ms)  INSERT INTO `cursos` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:43.875797', 182, 'Ciência da Computação', '2026-06-30 17:32:43.875797')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '241000' LIMIT 1
+Usuario Exists? (0.1ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'aluno@unb.br' LIMIT 1
+Discente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:44.064536', 24, NULL, NULL, NULL, 'aluno@unb.br', NULL, '241000', 'Aluno Teste', NULL, NULL, '$2a$12$ijcAwq1khK9ZlyOGkuR9tuHOXjfY/XP6CO6t5Xt7xqplahJ/GdSOC', 'Discente', '2026-06-30 17:32:44.064536')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:44 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "aluno@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'aluno@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/194/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/formularios” for 127.0.0.1 at 2026-06-30 14:32:44 -0300 Processing by FormulariosController#index as HTML

+ +
Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 194 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering formularios/index.html.erb within layouts/application
+Formulario Load (0.2ms)  SELECT `formularios`.* FROM `formularios`
+Rendered formularios/_formulario.html.erb (Duration: 0.1ms | GC: 0.0ms)
+Rendered formularios/index.html.erb within layouts/application (Duration: 1.1ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.3ms | GC: 0.0ms)
+ +

Completed 200 OK in 3ms (Views: 1.5ms | ActiveRecord: 0.6ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.9ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:44.261137', 'Ciência da Computação', '2026-06-30 17:32:44.261137')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 183 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:32:44.262658', 183, 'Engenharia de Software', '2026-06-30 17:32:44.262658')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TB' AND `turmas`.`disciplina_id` = 76 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TB' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 76 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:32:44.264210', 76, NULL, 'TB', '2026.1', '2026-06-30 17:32:44.264210')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 76 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 76 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:32:44.265708', 76, NULL, 'TA', '2026.1', '2026-06-30 17:32:44.265708')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:32:44.266321', NULL, NULL, NULL, NULL, 62, '2026-06-30 17:32:44.266321')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '123' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:44.455099', NULL, NULL, NULL, 183, 'admin@unb.br', NULL, '123', 'Admin', NULL, NULL, '$2a$12$K9NX8pAGMkOuOOR3YGqDbeQDgF4wPIgnc3WMAToVhE4kh35ETi7xK', 'Administrador', '2026-06-30 17:32:44.455099')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:44 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/195/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/formularios/51” for 127.0.0.1 at 2026-06-30 14:32:44 -0300 Processing by FormulariosController#show as HTML

+ +
Parameters: {"id" => "51"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 195 LIMIT 1
+Formulario Load (0.2ms)  SELECT `formularios`.* FROM `formularios` WHERE `formularios`.`id` = 51 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering formularios/show.html.erb within layouts/application
+Rendered formularios/_formulario.html.erb (Duration: 0.0ms | GC: 0.0ms)
+Rendered formularios/show.html.erb within layouts/application (Duration: 0.3ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.5ms | GC: 0.0ms)
+ +

Completed 200 OK in 2ms (Views: 0.7ms | ActiveRecord: 0.5ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:44.649393', 'Ciência da Computação', '2026-06-30 17:32:44.649393')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 184 LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.4ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:32:44.650890', 184, 'Engenharia de Software', '2026-06-30 17:32:44.650890')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TB' AND `turmas`.`disciplina_id` = 77 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TB' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 77 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:32:44.652371', 77, NULL, 'TB', '2026.1', '2026-06-30 17:32:44.652371')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 77 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 77 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:32:44.653813', 77, NULL, 'TA', '2026.1', '2026-06-30 17:32:44.653813')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:32:44.654404', NULL, NULL, NULL, NULL, 64, '2026-06-30 17:32:44.654404')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '123' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:44.843492', NULL, NULL, NULL, 184, 'admin@unb.br', NULL, '123', 'Admin', NULL, NULL, '$2a$12$nX16ksq.IrbaZHnVQByx6eCCBqD/V2D7RNaSTeByPZ5/Bt5cLtdvu', 'Administrador', '2026-06-30 17:32:44.843492')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:44 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/196/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/formularios/new” for 127.0.0.1 at 2026-06-30 14:32:45 -0300 Processing by FormulariosController#new as HTML

+ +
Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 196 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering formularios/new.html.erb within layouts/application
+Rendered formularios/_form.html.erb (Duration: 0.5ms | GC: 0.0ms)
+Rendered formularios/new.html.erb within layouts/application (Duration: 0.8ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.1ms | GC: 0.0ms)
+ +

Completed 200 OK in 3ms (Views: 1.2ms | ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.6ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:45.039990', 'Ciência da Computação', '2026-06-30 17:32:45.039990')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 185 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:32:45.041473', 185, 'Engenharia de Software', '2026-06-30 17:32:45.041473')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TB' AND `turmas`.`disciplina_id` = 78 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.3ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TB' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 78 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:32:45.042960', 78, NULL, 'TB', '2026.1', '2026-06-30 17:32:45.042960')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 78 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.3ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 78 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:32:45.044380', 78, NULL, 'TA', '2026.1', '2026-06-30 17:32:45.044380')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:32:45.044959', NULL, NULL, NULL, NULL, 66, '2026-06-30 17:32:45.044959')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '123' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:45.233547', NULL, NULL, NULL, 185, 'admin@unb.br', NULL, '123', 'Admin', NULL, NULL, '$2a$12$SD8mus4Y8/RVvpQfXMaQD.Af58.KMy5nKSWWpu1uH0mxNhNDU0WP.', 'Administrador', '2026-06-30 17:32:45.233547')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:45 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/197/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/formularios/53/edit” for 127.0.0.1 at 2026-06-30 14:32:45 -0300 Processing by FormulariosController#edit as HTML

+ +
Parameters: {"id" => "53"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 197 LIMIT 1
+Formulario Load (0.2ms)  SELECT `formularios`.* FROM `formularios` WHERE `formularios`.`id` = 53 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering formularios/edit.html.erb within layouts/application
+Rendered formularios/_form.html.erb (Duration: 0.3ms | GC: 0.0ms)
+Rendered formularios/edit.html.erb within layouts/application (Duration: 0.5ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.7ms | GC: 0.0ms)
+ +

Completed 200 OK in 2ms (Views: 0.8ms | ActiveRecord: 0.5ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:45.428173', 'Ciência da Computação', '2026-06-30 17:32:45.428173')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 186 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:32:45.429550', 186, 'Engenharia de Software', '2026-06-30 17:32:45.429550')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TB' AND `turmas`.`disciplina_id` = 79 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.3ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TB' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 79 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:32:45.430994', 79, NULL, 'TB', '2026.1', '2026-06-30 17:32:45.430994')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 79 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 79 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:32:45.432413', 79, NULL, 'TA', '2026.1', '2026-06-30 17:32:45.432413')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:32:45.433000', NULL, NULL, NULL, NULL, 68, '2026-06-30 17:32:45.433000')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '123' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:45.621447', NULL, NULL, NULL, 186, 'admin@unb.br', NULL, '123', 'Admin', NULL, NULL, '$2a$12$3kJL1dx3NBSc2afDTcgK.OsZoDnFXDrc/r2bi6qgm/.zRqkdHxQty', 'Administrador', '2026-06-30 17:32:45.621447')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:45 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/198/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Formulario Count (0.3ms)  SELECT COUNT(*) FROM `formularios`
+ +

Started POST “/formularios” for 127.0.0.1 at 2026-06-30 14:32:45 -0300 Processing by FormulariosController#create as HTML

+ +
Parameters: {"formulario" => {"turma_id" => nil}}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 198 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering formularios/new.html.erb within layouts/application
+Rendered formularios/_form.html.erb (Duration: 0.4ms | GC: 0.0ms)
+Rendered formularios/new.html.erb within layouts/application (Duration: 0.5ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.8ms | GC: 0.0ms)
+ +

Completed 422 Unprocessable Content in 2ms (Views: 0.9ms | ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Formulario Count (0.2ms)  SELECT COUNT(*) FROM `formularios`
+TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:45.817814', 'Ciência da Computação', '2026-06-30 17:32:45.817814')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 187 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.3ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:32:45.819387', 187, 'Engenharia de Software', '2026-06-30 17:32:45.819387')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TB' AND `turmas`.`disciplina_id` = 80 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TB' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 80 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:32:45.820976', 80, NULL, 'TB', '2026.1', '2026-06-30 17:32:45.820976')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 80 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 80 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:32:45.822573', 80, NULL, 'TA', '2026.1', '2026-06-30 17:32:45.822573')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.5ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:32:45.823185', NULL, NULL, NULL, NULL, 70, '2026-06-30 17:32:45.823185')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '123' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:46.012235', NULL, NULL, NULL, 187, 'admin@unb.br', NULL, '123', 'Admin', NULL, NULL, '$2a$12$SIUz0007sbCYl5VqxtRFweCI4CEawBX0w5iA//yYgHMqKEE9rDacC', 'Administrador', '2026-06-30 17:32:46.012235')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:46 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/199/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started PATCH “/formularios/55” for 127.0.0.1 at 2026-06-30 14:32:46 -0300 Processing by FormulariosController#update as HTML

+ +
Parameters: {"formulario" => {"turma_id" => "69"}, "id" => "55"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 199 LIMIT 1
+Formulario Load (0.2ms)  SELECT `formularios`.* FROM `formularios` WHERE `formularios`.`id` = 55 LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Turma Load (0.4ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`id` = 69 LIMIT 1
+Formulario Update (0.4ms)  UPDATE `formularios` SET `formularios`.`turma_id` = 69, `formularios`.`updated_at` = '2026-06-30 17:32:46.207076' WHERE `formularios`.`id` = 55
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/formularios/55 Completed 303 See Other in 5ms (ActiveRecord: 1.6ms (4 queries, 0 cached) | GC: 2.3ms)

+ +
Formulario Load (0.2ms)  SELECT `formularios`.* FROM `formularios` WHERE `formularios`.`id` = 55 LIMIT 1
+TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:46.211268', 'Ciência da Computação', '2026-06-30 17:32:46.211268')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 188 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:32:46.212693', 188, 'Engenharia de Software', '2026-06-30 17:32:46.212693')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TB' AND `turmas`.`disciplina_id` = 81 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TB' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 81 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:32:46.214566', 81, NULL, 'TB', '2026.1', '2026-06-30 17:32:46.214566')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 81 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 81 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:32:46.216071', 81, NULL, 'TA', '2026.1', '2026-06-30 17:32:46.216071')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:32:46.216676', NULL, NULL, NULL, NULL, 72, '2026-06-30 17:32:46.216676')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '123' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:46.405350', NULL, NULL, NULL, 188, 'admin@unb.br', NULL, '123', 'Admin', NULL, NULL, '$2a$12$.5tqGmpsYx28x/UCFgPyMe5LEjwcEIuAkYLU1NwOOgLT5wbZn8gd6', 'Administrador', '2026-06-30 17:32:46.405350')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:46 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/200/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started PATCH “/formularios/56” for 127.0.0.1 at 2026-06-30 14:32:46 -0300 Processing by FormulariosController#update as HTML

+ +
Parameters: {"formulario" => {"turma_id" => nil}, "id" => "56"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 200 LIMIT 1
+Formulario Load (0.2ms)  SELECT `formularios`.* FROM `formularios` WHERE `formularios`.`id` = 56 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering formularios/edit.html.erb within layouts/application
+Rendered formularios/_form.html.erb (Duration: 0.5ms | GC: 0.0ms)
+Rendered formularios/edit.html.erb within layouts/application (Duration: 0.6ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.8ms | GC: 0.0ms)
+ +

Completed 422 Unprocessable Content in 3ms (Views: 1.0ms | ActiveRecord: 0.5ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.2ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:46.602301', 'Ciência da Computação', '2026-06-30 17:32:46.602301')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.1ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 189 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:32:46.603562', 189, 'Engenharia de Software', '2026-06-30 17:32:46.603562')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TB' AND `turmas`.`disciplina_id` = 82 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.3ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TB' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 82 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:32:46.605034', 82, NULL, 'TB', '2026.1', '2026-06-30 17:32:46.605034')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 82 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 82 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:32:46.606505', 82, NULL, 'TA', '2026.1', '2026-06-30 17:32:46.606505')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:32:46.607126', NULL, NULL, NULL, NULL, 74, '2026-06-30 17:32:46.607126')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '123' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:46.799844', NULL, NULL, NULL, 189, 'admin@unb.br', NULL, '123', 'Admin', NULL, NULL, '$2a$12$LZwEYB4zqkPVxcBaY85rqOLokNNfzCguDEnXUFdy2k2EA.trniyMe', 'Administrador', '2026-06-30 17:32:46.799844')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:46 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/201/avaliacoes Completed 302 Found in 190ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Formulario Count (0.3ms)  SELECT COUNT(*) FROM `formularios`
+ +

Started DELETE “/formularios/57” for 127.0.0.1 at 2026-06-30 14:32:46 -0300 Processing by FormulariosController#destroy as HTML

+ +
Parameters: {"id" => "57"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 201 LIMIT 1
+Formulario Load (0.2ms)  SELECT `formularios`.* FROM `formularios` WHERE `formularios`.`id` = 57 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Load (0.4ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`formulario_id` = 57
+RespostaForm Load (0.2ms)  SELECT `resposta_forms`.* FROM `resposta_forms` WHERE `resposta_forms`.`formulario_id` = 57
+Formulario Destroy (0.2ms)  DELETE FROM `formularios` WHERE `formularios`.`id` = 57
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/formularios Completed 303 See Other in 3ms (ActiveRecord: 1.6ms (5 queries, 0 cached) | GC: 0.0ms)

+ +
Formulario Count (0.1ms)  SELECT COUNT(*) FROM `formularios`
+TRANSACTION (0.6ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_home' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_home@unb.br' LIMIT 1
+Docente Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:47.190850', NULL, NULL, NULL, NULL, 'doc_home@unb.br', 'Doutorado', 'doc_home', 'Docente Home', NULL, NULL, '$2a$12$gKY/6nRTd5o84IednAom1eEl12XVh/f8wEJlxBcPTMiw.86SVQ3La', 'Docente', '2026-06-30 17:32:47.190850')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/inicio” for 127.0.0.1 at 2026-06-30 14:32:47 -0300 Processing by HomeController#index as HTML

+ +
Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+ +

Redirected to www.example.com/ Filter chain halted as :require_login rendered or redirected Completed 302 Found in 1ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.3ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_home' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_home@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:47.384888', NULL, NULL, NULL, NULL, 'doc_home@unb.br', 'Doutorado', 'doc_home', 'Docente Home', NULL, NULL, '$2a$12$vf72MItsXvQaJWOjSgwKEe5vsmhjehpJnkHAZFmeWQNHOfQbR4a/.', 'Docente', '2026-06-30 17:32:47.384888')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:47 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_home@unb.br", "senha" => "Senha123"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_home@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/203/avaliacoes Completed 302 Found in 190ms (ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/inicio” for 127.0.0.1 at 2026-06-30 14:32:47 -0300 Processing by HomeController#index as HTML

+ +
Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 203 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering home/index.html.erb within layouts/application
+Rendered home/index.html.erb within layouts/application (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 2ms (Views: 0.7ms | ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:47.582149', 'Ciência da Computação', '2026-06-30 17:32:47.582149')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '123' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:47.771903', NULL, NULL, NULL, 190, 'admin@unb.br', NULL, '123', 'Admin', NULL, NULL, '$2a$12$ILnQeT5UC0SK7biwq28I8u8C62U7yT50xJktoebhdQhnr30eqcGp.', 'Administrador', '2026-06-30 17:32:47.771903')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:47 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin@unb.br", "senha" => "Senha123"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/204/avaliacoes Completed 302 Found in 204ms (ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms) Started POST “/admin/204/sincronizar_sigaa” for 127.0.0.1 at 2026-06-30 14:32:47 -0300 Processing by AdminController#sincronizar_sigaa as HTML

+ +
Parameters: {"acao" => "importar", "arquivo_classes" => #<ActionDispatch::Http::UploadedFile:0x0000000127444a80 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-99492-boh5z3.json>, @content_type="application/json", @original_filename="class_members.json", @headers="content-disposition: form-data; name=\"arquivo_classes\"; filename=\"class_members.json\"\r\ncontent-type: application/json\r\ncontent-length: 16065\r\n">, "arquivo_membros" => #<ActionDispatch::Http::UploadedFile:0x0000000127444a30 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-99492-457e66.json>, @content_type="application/json", @original_filename="class_members.json", @headers="content-disposition: form-data; name=\"arquivo_membros\"; filename=\"class_members.json\"\r\ncontent-type: application/json\r\ncontent-length: 16065\r\n">, "admin_id" => "204"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 204 LIMIT 1
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 204 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`codigo` = 'NAO_ESP' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_2
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'NAO_ESP' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('NAO_ESP', '2026-06-30 17:32:47.982292', 'Não especificado', '2026-06-30 17:32:47.982292')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_2
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_2
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+TRANSACTION (0.1ms)  ROLLBACK TO SAVEPOINT active_record_2
+TRANSACTION (0.1ms)  ROLLBACK TO SAVEPOINT active_record_1
+ +

Redirected to www.example.com/admin/204/gerenciamento Completed 302 Found in 5ms (ActiveRecord: 2.5ms (7 queries, 0 cached) | GC: 0.1ms)

+ +
TRANSACTION (0.3ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_re2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_re2@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:48.176219', NULL, NULL, NULL, NULL, 'doc_re2@unb.br', 'Doutorado', 'doc_re2', 'Docente RE2', NULL, NULL, '$2a$12$P0De/6OL8qXitH4aaijl6evVgIgaf182mmVPCB7aV/.Z/TrpD9pv.', 'Docente', '2026-06-30 17:32:48.176219')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:48.178621', 'Ciência da Computação', '2026-06-30 17:32:48.178621')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 192 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:32:48.180250', 192, 'Engenharia de Software', '2026-06-30 17:32:48.180250')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 83 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 83 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:32:48.181818', 83, NULL, 'TA', '2026.1', '2026-06-30 17:32:48.181818')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:32:48.182442', NULL, NULL, NULL, NULL, 75, '2026-06-30 17:32:48.182442')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaForm Exists? (0.4ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 205 AND `resposta_forms`.`formulario_id` = 58 LIMIT 1
+RespostaForm Create (0.2ms)  INSERT INTO `resposta_forms` (`created_at`, `data_submissao`, `formulario_id`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:32:48.183886', '2026-06-30', 58, '2026-06-30 17:32:48.183886', 205)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.2ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:32:48.184467', NULL, 58, 1, 'Texto', '2026-06-30 17:32:48.184467')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaElem Create (0.4ms)  INSERT INTO `resposta_elems` (`campo_form_id`, `created_at`, `elemento_form_id`, `resposta_form_id`, `texto_resposta`, `updated_at`) VALUES (NULL, '2026-06-30 17:32:48.185135', 37, 9, 'Resposta inicial', '2026-06-30 17:32:48.185135')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:48 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_re2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_re2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/205/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started DELETE “/logout” for 127.0.0.1 at 2026-06-30 14:32:48 -0300 Processing by SessionsController#destroy as HTML Redirected to www.example.com/ Completed 302 Found in 0ms (ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 0.0ms) Started GET “/resposta_elems” for 127.0.0.1 at 2026-06-30 14:32:48 -0300 Processing by RespostaElemsController#index as HTML

+ +
Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+ +

Redirected to www.example.com/ Filter chain halted as :require_login rendered or redirected Completed 302 Found in 1ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.9ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_re2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_re2@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:48.568851', NULL, NULL, NULL, NULL, 'doc_re2@unb.br', 'Doutorado', 'doc_re2', 'Docente RE2', NULL, NULL, '$2a$12$btyPbvpwmzkSULSlU4s8JueBS/3ZfCY/qfkJrEsUBMM/9SshcREj.', 'Docente', '2026-06-30 17:32:48.568851')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:48.571300', 'Ciência da Computação', '2026-06-30 17:32:48.571300')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 193 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:32:48.572790', 193, 'Engenharia de Software', '2026-06-30 17:32:48.572790')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 84 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 84 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:32:48.574422', 84, NULL, 'TA', '2026.1', '2026-06-30 17:32:48.574422')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:32:48.575046', NULL, NULL, NULL, NULL, 76, '2026-06-30 17:32:48.575046')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaForm Exists? (0.4ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 206 AND `resposta_forms`.`formulario_id` = 59 LIMIT 1
+RespostaForm Create (0.2ms)  INSERT INTO `resposta_forms` (`created_at`, `data_submissao`, `formulario_id`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:32:48.576318', '2026-06-30', 59, '2026-06-30 17:32:48.576318', 206)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:32:48.576932', NULL, 59, 1, 'Texto', '2026-06-30 17:32:48.576932')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaElem Create (0.4ms)  INSERT INTO `resposta_elems` (`campo_form_id`, `created_at`, `elemento_form_id`, `resposta_form_id`, `texto_resposta`, `updated_at`) VALUES (NULL, '2026-06-30 17:32:48.577694', 38, 10, 'Resposta inicial', '2026-06-30 17:32:48.577694')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:48 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_re2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_re2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/206/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/resposta_elems” for 127.0.0.1 at 2026-06-30 14:32:48 -0300 Processing by RespostaElemsController#index as HTML

+ +
Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 206 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering resposta_elems/index.html.erb within layouts/application
+RespostaElem Load (0.2ms)  SELECT `resposta_elems`.* FROM `resposta_elems`
+Rendered resposta_elems/_resposta_elem.html.erb (Duration: 0.1ms | GC: 0.0ms)
+Rendered resposta_elems/index.html.erb within layouts/application (Duration: 1.1ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 3ms (Views: 1.5ms | ActiveRecord: 0.6ms (2 queries, 0 cached) | GC: 0.1ms)

+ +
TRANSACTION (0.6ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_re2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_re2@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:48.962739', NULL, NULL, NULL, NULL, 'doc_re2@unb.br', 'Doutorado', 'doc_re2', 'Docente RE2', NULL, NULL, '$2a$12$qEjATjb3w0uOIIo0LznMYux/m.pG2ru.YAb1f9NfEMISteuf0.k1K', 'Docente', '2026-06-30 17:32:48.962739')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:48.965047', 'Ciência da Computação', '2026-06-30 17:32:48.965047')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 194 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.3ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:32:48.966675', 194, 'Engenharia de Software', '2026-06-30 17:32:48.966675')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 85 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 85 LIMIT 1
+Turma Create (0.3ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:32:48.968315', 85, NULL, 'TA', '2026.1', '2026-06-30 17:32:48.968315')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:32:48.968995', NULL, NULL, NULL, NULL, 77, '2026-06-30 17:32:48.968995')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaForm Exists? (0.4ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 207 AND `resposta_forms`.`formulario_id` = 60 LIMIT 1
+RespostaForm Create (0.2ms)  INSERT INTO `resposta_forms` (`created_at`, `data_submissao`, `formulario_id`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:32:48.970309', '2026-06-30', 60, '2026-06-30 17:32:48.970309', 207)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:32:48.970942', NULL, 60, 1, 'Texto', '2026-06-30 17:32:48.970942')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaElem Create (0.4ms)  INSERT INTO `resposta_elems` (`campo_form_id`, `created_at`, `elemento_form_id`, `resposta_form_id`, `texto_resposta`, `updated_at`) VALUES (NULL, '2026-06-30 17:32:48.971722', 39, 11, 'Resposta inicial', '2026-06-30 17:32:48.971722')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:48 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_re2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_re2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/207/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/resposta_elems/new” for 127.0.0.1 at 2026-06-30 14:32:49 -0300 Processing by RespostaElemsController#new as HTML

+ +
Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 207 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering resposta_elems/new.html.erb within layouts/application
+Rendered resposta_elems/_form.html.erb (Duration: 1.1ms | GC: 0.0ms)
+Rendered resposta_elems/new.html.erb within layouts/application (Duration: 1.5ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.7ms | GC: 0.0ms)
+ +

Completed 200 OK in 3ms (Views: 1.9ms | ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.6ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_re2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_re2@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:49.354305', NULL, NULL, NULL, NULL, 'doc_re2@unb.br', 'Doutorado', 'doc_re2', 'Docente RE2', NULL, NULL, '$2a$12$T8V3M09nZ9j1zbqyW0ePYOGGs0q9lUiA2bgmjX1LU9mFuXcII2U8i', 'Docente', '2026-06-30 17:32:49.354305')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:49.356514', 'Ciência da Computação', '2026-06-30 17:32:49.356514')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 195 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:32:49.358033', 195, 'Engenharia de Software', '2026-06-30 17:32:49.358033')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 86 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 86 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:32:49.359526', 86, NULL, 'TA', '2026.1', '2026-06-30 17:32:49.359526')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:32:49.360135', NULL, NULL, NULL, NULL, 78, '2026-06-30 17:32:49.360135')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaForm Exists? (0.4ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 208 AND `resposta_forms`.`formulario_id` = 61 LIMIT 1
+RespostaForm Create (0.2ms)  INSERT INTO `resposta_forms` (`created_at`, `data_submissao`, `formulario_id`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:32:49.361387', '2026-06-30', 61, '2026-06-30 17:32:49.361387', 208)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:32:49.362045', NULL, 61, 1, 'Texto', '2026-06-30 17:32:49.362045')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaElem Create (0.4ms)  INSERT INTO `resposta_elems` (`campo_form_id`, `created_at`, `elemento_form_id`, `resposta_form_id`, `texto_resposta`, `updated_at`) VALUES (NULL, '2026-06-30 17:32:49.362789', 40, 12, 'Resposta inicial', '2026-06-30 17:32:49.362789')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:49 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_re2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_re2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/208/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms)

+ +
RespostaElem Count (0.3ms)  SELECT COUNT(*) FROM `resposta_elems`
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.5ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:32:49.553951', NULL, 61, 2, NULL, '2026-06-30 17:32:49.553951')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/resposta_elems” for 127.0.0.1 at 2026-06-30 14:32:49 -0300 Processing by RespostaElemsController#create as HTML

+ +
Parameters: {"resposta_elem" => {"texto_resposta" => "Nova Resposta", "resposta_form_id" => "12", "elemento_form_id" => "41"}}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 208 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaForm Load (0.5ms)  SELECT `resposta_forms`.* FROM `resposta_forms` WHERE `resposta_forms`.`id` = 12 LIMIT 1
+ElementoForm Load (0.2ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`id` = 41 LIMIT 1
+RespostaElem Create (0.3ms)  INSERT INTO `resposta_elems` (`campo_form_id`, `created_at`, `elemento_form_id`, `resposta_form_id`, `texto_resposta`, `updated_at`) VALUES (NULL, '2026-06-30 17:32:49.557592', 41, 12, 'Nova Resposta', '2026-06-30 17:32:49.557592')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/resposta_elems/5 Completed 302 Found in 3ms (ActiveRecord: 1.6ms (4 queries, 0 cached) | GC: 0.1ms)

+ +
RespostaElem Count (0.2ms)  SELECT COUNT(*) FROM `resposta_elems`
+RespostaElem Load (0.2ms)  SELECT `resposta_elems`.* FROM `resposta_elems` ORDER BY `resposta_elems`.`id` DESC LIMIT 1
+TRANSACTION (0.9ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_re2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_re2@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:49.749712', NULL, NULL, NULL, NULL, 'doc_re2@unb.br', 'Doutorado', 'doc_re2', 'Docente RE2', NULL, NULL, '$2a$12$ACjFEmDau3MOKBIr.YPVbODdbB.eZ1LnfPOeWDf7RP0fP66/yPMEC', 'Docente', '2026-06-30 17:32:49.749712')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:49.752030', 'Ciência da Computação', '2026-06-30 17:32:49.752030')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 196 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:32:49.753557', 196, 'Engenharia de Software', '2026-06-30 17:32:49.753557')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 87 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 87 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:32:49.755238', 87, NULL, 'TA', '2026.1', '2026-06-30 17:32:49.755238')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:32:49.755871', NULL, NULL, NULL, NULL, 79, '2026-06-30 17:32:49.755871')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaForm Exists? (0.4ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 209 AND `resposta_forms`.`formulario_id` = 62 LIMIT 1
+RespostaForm Create (0.2ms)  INSERT INTO `resposta_forms` (`created_at`, `data_submissao`, `formulario_id`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:32:49.757179', '2026-06-30', 62, '2026-06-30 17:32:49.757179', 209)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:32:49.757811', NULL, 62, 1, 'Texto', '2026-06-30 17:32:49.757811')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaElem Create (0.4ms)  INSERT INTO `resposta_elems` (`campo_form_id`, `created_at`, `elemento_form_id`, `resposta_form_id`, `texto_resposta`, `updated_at`) VALUES (NULL, '2026-06-30 17:32:49.758587', 42, 13, 'Resposta inicial', '2026-06-30 17:32:49.758587')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:49 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_re2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_re2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/209/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms)

+ +
RespostaElem Count (0.2ms)  SELECT COUNT(*) FROM `resposta_elems`
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.5ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:32:49.949766', NULL, 62, 2, NULL, '2026-06-30 17:32:49.949766')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/resposta_elems” for 127.0.0.1 at 2026-06-30 14:32:49 -0300 Processing by RespostaElemsController#create as HTML

+ +
Parameters: {"resposta_elem" => {"texto_resposta" => "", "resposta_form_id" => "13", "elemento_form_id" => "43"}}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 209 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaForm Load (0.4ms)  SELECT `resposta_forms`.* FROM `resposta_forms` WHERE `resposta_forms`.`id` = 13 LIMIT 1
+ElementoForm Load (0.2ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`id` = 43 LIMIT 1
+TRANSACTION (0.1ms)  ROLLBACK TO SAVEPOINT active_record_1
+Rendering layout layouts/application.html.erb
+Rendering resposta_elems/new.html.erb within layouts/application
+Rendered resposta_elems/_form.html.erb (Duration: 0.8ms | GC: 0.0ms)
+Rendered resposta_elems/new.html.erb within layouts/application (Duration: 0.8ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.1ms | GC: 0.0ms)
+ +

Completed 422 Unprocessable Content in 3ms (Views: 1.2ms | ActiveRecord: 1.1ms (3 queries, 0 cached) | GC: 0.0ms)

+ +
RespostaElem Count (0.2ms)  SELECT COUNT(*) FROM `resposta_elems`
+TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_re2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_re2@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:50.193110', NULL, NULL, NULL, NULL, 'doc_re2@unb.br', 'Doutorado', 'doc_re2', 'Docente RE2', NULL, NULL, '$2a$12$ZMp.P67dqJI5jGe0Ood1tOmR/WELWHGvx4kVXIaVK67ZxRxZKq32a', 'Docente', '2026-06-30 17:32:50.193110')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:50.195882', 'Ciência da Computação', '2026-06-30 17:32:50.195882')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 197 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:32:50.197471', 197, 'Engenharia de Software', '2026-06-30 17:32:50.197471')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 88 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 88 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:32:50.199110', 88, NULL, 'TA', '2026.1', '2026-06-30 17:32:50.199110')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.2ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:32:50.199872', NULL, NULL, NULL, NULL, 80, '2026-06-30 17:32:50.199872')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaForm Exists? (0.3ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 210 AND `resposta_forms`.`formulario_id` = 63 LIMIT 1
+RespostaForm Create (0.2ms)  INSERT INTO `resposta_forms` (`created_at`, `data_submissao`, `formulario_id`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:32:50.201038', '2026-06-30', 63, '2026-06-30 17:32:50.201038', 210)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:32:50.201688', NULL, 63, 1, 'Texto', '2026-06-30 17:32:50.201688')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+RespostaElem Create (0.3ms)  INSERT INTO `resposta_elems` (`campo_form_id`, `created_at`, `elemento_form_id`, `resposta_form_id`, `texto_resposta`, `updated_at`) VALUES (NULL, '2026-06-30 17:32:50.202457', 44, 14, 'Resposta inicial', '2026-06-30 17:32:50.202457')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:50 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_re2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.1ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_re2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/210/avaliacoes Completed 302 Found in 190ms (ActiveRecord: 0.1ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/resposta_elems/7” for 127.0.0.1 at 2026-06-30 14:32:50 -0300 Processing by RespostaElemsController#show as HTML

+ +
Parameters: {"id" => "7"}
+Usuario Load (0.5ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 210 LIMIT 1
+RespostaElem Load (0.3ms)  SELECT `resposta_elems`.* FROM `resposta_elems` WHERE `resposta_elems`.`id` = 7 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering resposta_elems/show.html.erb within layouts/application
+Rendered resposta_elems/_resposta_elem.html.erb (Duration: 0.0ms | GC: 0.0ms)
+Rendered resposta_elems/show.html.erb within layouts/application (Duration: 0.4ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.6ms | GC: 0.0ms)
+ +

Completed 200 OK in 3ms (Views: 0.7ms | ActiveRecord: 0.7ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_re2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_re2@unb.br' LIMIT 1
+Docente Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:50.588243', NULL, NULL, NULL, NULL, 'doc_re2@unb.br', 'Doutorado', 'doc_re2', 'Docente RE2', NULL, NULL, '$2a$12$B21zQRxXE9uLypZZJ.DOBuQEw0CNZUkTul3IPdbMqLiqPcLgs2XxG', 'Docente', '2026-06-30 17:32:50.588243')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:50.590844', 'Ciência da Computação', '2026-06-30 17:32:50.590844')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 198 LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.5ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.3ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:32:50.592606', 198, 'Engenharia de Software', '2026-06-30 17:32:50.592606')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 89 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 89 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:32:50.594140', 89, NULL, 'TA', '2026.1', '2026-06-30 17:32:50.594140')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:32:50.594744', NULL, NULL, NULL, NULL, 81, '2026-06-30 17:32:50.594744')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaForm Exists? (0.4ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 211 AND `resposta_forms`.`formulario_id` = 64 LIMIT 1
+RespostaForm Create (0.2ms)  INSERT INTO `resposta_forms` (`created_at`, `data_submissao`, `formulario_id`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:32:50.595977', '2026-06-30', 64, '2026-06-30 17:32:50.595977', 211)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:32:50.596576', NULL, 64, 1, 'Texto', '2026-06-30 17:32:50.596576')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaElem Create (0.4ms)  INSERT INTO `resposta_elems` (`campo_form_id`, `created_at`, `elemento_form_id`, `resposta_form_id`, `texto_resposta`, `updated_at`) VALUES (NULL, '2026-06-30 17:32:50.597324', 45, 15, 'Resposta inicial', '2026-06-30 17:32:50.597324')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:50 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_re2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_re2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/211/avaliacoes Completed 302 Found in 207ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/resposta_elems/8/edit” for 127.0.0.1 at 2026-06-30 14:32:50 -0300 Processing by RespostaElemsController#edit as HTML

+ +
Parameters: {"id" => "8"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 211 LIMIT 1
+RespostaElem Load (0.3ms)  SELECT `resposta_elems`.* FROM `resposta_elems` WHERE `resposta_elems`.`id` = 8 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering resposta_elems/edit.html.erb within layouts/application
+Rendered resposta_elems/_form.html.erb (Duration: 0.6ms | GC: 0.0ms)
+Rendered resposta_elems/edit.html.erb within layouts/application (Duration: 0.9ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.2ms | GC: 0.0ms)
+ +

Completed 200 OK in 3ms (Views: 1.4ms | ActiveRecord: 0.7ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_re2' LIMIT 1
+Usuario Exists? (0.1ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_re2@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:51.007072', NULL, NULL, NULL, NULL, 'doc_re2@unb.br', 'Doutorado', 'doc_re2', 'Docente RE2', NULL, NULL, '$2a$12$lQFblYHkp.7O24rL/0Vio.2xpX0cGyJFHCK/3T8rchoLmYSYPi.V.', 'Docente', '2026-06-30 17:32:51.007072')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:51.009535', 'Ciência da Computação', '2026-06-30 17:32:51.009535')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 199 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:32:51.011024', 199, 'Engenharia de Software', '2026-06-30 17:32:51.011024')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 90 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 90 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:32:51.012540', 90, NULL, 'TA', '2026.1', '2026-06-30 17:32:51.012540')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.3ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:32:51.013192', NULL, NULL, NULL, NULL, 82, '2026-06-30 17:32:51.013192')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaForm Exists? (0.4ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 212 AND `resposta_forms`.`formulario_id` = 65 LIMIT 1
+RespostaForm Create (0.3ms)  INSERT INTO `resposta_forms` (`created_at`, `data_submissao`, `formulario_id`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:32:51.015404', '2026-06-30', 65, '2026-06-30 17:32:51.015404', 212)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.2ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:32:51.018358', NULL, 65, 1, 'Texto', '2026-06-30 17:32:51.018358')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaElem Create (0.4ms)  INSERT INTO `resposta_elems` (`campo_form_id`, `created_at`, `elemento_form_id`, `resposta_form_id`, `texto_resposta`, `updated_at`) VALUES (NULL, '2026-06-30 17:32:51.018963', 46, 16, 'Resposta inicial', '2026-06-30 17:32:51.018963')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:51 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_re2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_re2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/212/avaliacoes Completed 302 Found in 190ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started PATCH “/resposta_elems/9” for 127.0.0.1 at 2026-06-30 14:32:51 -0300 Processing by RespostaElemsController#update as HTML

+ +
Parameters: {"resposta_elem" => {"texto_resposta" => "Texto Atualizado", "resposta_form_id" => "16", "elemento_form_id" => "46"}, "id" => "9"}
+Usuario Load (0.5ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 212 LIMIT 1
+RespostaElem Load (0.3ms)  SELECT `resposta_elems`.* FROM `resposta_elems` WHERE `resposta_elems`.`id` = 9 LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+RespostaElem Update (0.6ms)  UPDATE `resposta_elems` SET `resposta_elems`.`texto_resposta` = 'Texto Atualizado', `resposta_elems`.`updated_at` = '2026-06-30 17:32:51.213152' WHERE `resposta_elems`.`id` = 9
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/resposta_elems/9 Completed 303 See Other in 3ms (ActiveRecord: 1.7ms (3 queries, 0 cached) | GC: 0.0ms)

+ +
RespostaElem Load (0.2ms)  SELECT `resposta_elems`.* FROM `resposta_elems` WHERE `resposta_elems`.`id` = 9 LIMIT 1
+TRANSACTION (1.3ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_re2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_re2@unb.br' LIMIT 1
+Docente Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:51.407405', NULL, NULL, NULL, NULL, 'doc_re2@unb.br', 'Doutorado', 'doc_re2', 'Docente RE2', NULL, NULL, '$2a$12$KmdF6Ie/RQ0/rDFoag3oau7VREo22ljEU25l8oGhowh3q6SJbWQMK', 'Docente', '2026-06-30 17:32:51.407405')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:51.409633', 'Ciência da Computação', '2026-06-30 17:32:51.409633')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 200 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.3ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:32:51.411085', 200, 'Engenharia de Software', '2026-06-30 17:32:51.411085')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 91 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 91 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:32:51.412676', 91, NULL, 'TA', '2026.1', '2026-06-30 17:32:51.412676')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:32:51.413279', NULL, NULL, NULL, NULL, 83, '2026-06-30 17:32:51.413279')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaForm Exists? (0.4ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 213 AND `resposta_forms`.`formulario_id` = 66 LIMIT 1
+RespostaForm Create (0.2ms)  INSERT INTO `resposta_forms` (`created_at`, `data_submissao`, `formulario_id`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:32:51.414512', '2026-06-30', 66, '2026-06-30 17:32:51.414512', 213)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:32:51.415115', NULL, 66, 1, 'Texto', '2026-06-30 17:32:51.415115')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaElem Create (0.4ms)  INSERT INTO `resposta_elems` (`campo_form_id`, `created_at`, `elemento_form_id`, `resposta_form_id`, `texto_resposta`, `updated_at`) VALUES (NULL, '2026-06-30 17:32:51.415892', 47, 17, 'Resposta inicial', '2026-06-30 17:32:51.415892')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:51 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_re2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_re2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/213/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started PATCH “/resposta_elems/10” for 127.0.0.1 at 2026-06-30 14:32:51 -0300 Processing by RespostaElemsController#update as HTML

+ +
Parameters: {"resposta_elem" => {"texto_resposta" => "", "resposta_form_id" => "17", "elemento_form_id" => "47"}, "id" => "10"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 213 LIMIT 1
+RespostaElem Load (0.3ms)  SELECT `resposta_elems`.* FROM `resposta_elems` WHERE `resposta_elems`.`id` = 10 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering resposta_elems/edit.html.erb within layouts/application
+Rendered resposta_elems/_form.html.erb (Duration: 0.8ms | GC: 0.0ms)
+Rendered resposta_elems/edit.html.erb within layouts/application (Duration: 0.9ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.2ms | GC: 0.0ms)
+ +

Completed 422 Unprocessable Content in 3ms (Views: 1.3ms | ActiveRecord: 0.7ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.9ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_re2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_re2@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:51.805730', NULL, NULL, NULL, NULL, 'doc_re2@unb.br', 'Doutorado', 'doc_re2', 'Docente RE2', NULL, NULL, '$2a$12$pHY3s2zTxVyzET5uysVRKOygRaKlLMOJ8Ta.9Dteo1hIXVGUBVnte', 'Docente', '2026-06-30 17:32:51.805730')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:51.808032', 'Ciência da Computação', '2026-06-30 17:32:51.808032')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.3ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 201 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:32:51.809709', 201, 'Engenharia de Software', '2026-06-30 17:32:51.809709')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 92 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 92 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:32:51.811331', 92, NULL, 'TA', '2026.1', '2026-06-30 17:32:51.811331')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Formulario Create (0.5ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:32:51.811952', NULL, NULL, NULL, NULL, 84, '2026-06-30 17:32:51.811952')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaForm Exists? (0.4ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 214 AND `resposta_forms`.`formulario_id` = 67 LIMIT 1
+RespostaForm Create (0.3ms)  INSERT INTO `resposta_forms` (`created_at`, `data_submissao`, `formulario_id`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:32:51.813350', '2026-06-30', 67, '2026-06-30 17:32:51.813350', 214)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.2ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:32:51.814061', NULL, 67, 1, 'Texto', '2026-06-30 17:32:51.814061')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaElem Create (0.4ms)  INSERT INTO `resposta_elems` (`campo_form_id`, `created_at`, `elemento_form_id`, `resposta_form_id`, `texto_resposta`, `updated_at`) VALUES (NULL, '2026-06-30 17:32:51.814697', 48, 18, 'Resposta inicial', '2026-06-30 17:32:51.814697')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:51 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_re2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_re2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/214/avaliacoes Completed 302 Found in 190ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.6ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'del_re' LIMIT 1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'del_re@unb.br' LIMIT 1
+Docente Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:52.008091', NULL, NULL, NULL, NULL, 'del_re@unb.br', 'Grad', 'del_re', 'Del RE', NULL, NULL, NULL, 'Docente', '2026-06-30 17:32:52.008091')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:32:52.009244', NULL, NULL, NULL, NULL, 84, '2026-06-30 17:32:52.009244')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:32:52.010228', NULL, 68, 1, NULL, '2026-06-30 17:32:52.010228')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+RespostaForm Exists? (0.5ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 215 AND `resposta_forms`.`formulario_id` = 68 LIMIT 1
+RespostaForm Create (0.3ms)  INSERT INTO `resposta_forms` (`created_at`, `data_submissao`, `formulario_id`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:32:52.011897', '2026-06-30', 68, '2026-06-30 17:32:52.011897', 215)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaElem Create (0.4ms)  INSERT INTO `resposta_elems` (`campo_form_id`, `created_at`, `elemento_form_id`, `resposta_form_id`, `texto_resposta`, `updated_at`) VALUES (NULL, '2026-06-30 17:32:52.012705', 49, 19, 'Para Deletar', '2026-06-30 17:32:52.012705')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+RespostaElem Count (0.2ms)  SELECT COUNT(*) FROM `resposta_elems`
+ +

Started DELETE “/resposta_elems/12” for 127.0.0.1 at 2026-06-30 14:32:52 -0300 Processing by RespostaElemsController#destroy as HTML

+ +
Parameters: {"id" => "12"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 214 LIMIT 1
+RespostaElem Load (0.2ms)  SELECT `resposta_elems`.* FROM `resposta_elems` WHERE `resposta_elems`.`id` = 12 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaElem Destroy (0.4ms)  DELETE FROM `resposta_elems` WHERE `resposta_elems`.`id` = 12
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/resposta_elems Completed 303 See Other in 2ms (ActiveRecord: 1.1ms (3 queries, 0 cached) | GC: 0.0ms)

+ +
RespostaElem Count (0.2ms)  SELECT COUNT(*) FROM `resposta_elems`
+TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_rf2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_rf2@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:52.209074', NULL, NULL, NULL, NULL, 'doc_rf2@unb.br', 'Doutorado', 'doc_rf2', 'Docente RF2', NULL, NULL, '$2a$12$Lech4w0kmi647fIL.LouW.SEu347wfkTAFLd1un3VkdFPbFjpFjMK', 'Docente', '2026-06-30 17:32:52.209074')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:52.211393', 'Ciência da Computação', '2026-06-30 17:32:52.211393')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 202 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:32:52.212807', 202, 'Engenharia de Software', '2026-06-30 17:32:52.212807')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 93 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 93 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:32:52.214303', 93, NULL, 'TA', '2026.1', '2026-06-30 17:32:52.214303')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:32:52.214907', NULL, NULL, NULL, NULL, 85, '2026-06-30 17:32:52.214907')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaForm Exists? (0.4ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 216 AND `resposta_forms`.`formulario_id` = 69 LIMIT 1
+RespostaForm Create (0.2ms)  INSERT INTO `resposta_forms` (`created_at`, `data_submissao`, `formulario_id`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:32:52.216264', '2026-06-30', 69, '2026-06-30 17:32:52.216264', 216)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:52 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_rf2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_rf2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/216/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started DELETE “/logout” for 127.0.0.1 at 2026-06-30 14:32:52 -0300 Processing by SessionsController#destroy as HTML Redirected to www.example.com/ Completed 302 Found in 0ms (ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 0.0ms) Started GET “/resposta_forms” for 127.0.0.1 at 2026-06-30 14:32:52 -0300 Processing by RespostaFormsController#index as HTML

+ +
Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+ +

Redirected to www.example.com/ Filter chain halted as :require_login rendered or redirected Completed 302 Found in 1ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.9ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_rf2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_rf2@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:52.600455', NULL, NULL, NULL, NULL, 'doc_rf2@unb.br', 'Doutorado', 'doc_rf2', 'Docente RF2', NULL, NULL, '$2a$12$wRpHdgDMoCexG4UtjXii2OkHuWC6/LBBCFc0QFmnaWI4hWXcA20J6', 'Docente', '2026-06-30 17:32:52.600455')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:52.602802', 'Ciência da Computação', '2026-06-30 17:32:52.602802')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 203 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:32:52.604330', 203, 'Engenharia de Software', '2026-06-30 17:32:52.604330')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 94 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 94 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:32:52.605914', 94, NULL, 'TA', '2026.1', '2026-06-30 17:32:52.605914')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:32:52.606555', NULL, NULL, NULL, NULL, 86, '2026-06-30 17:32:52.606555')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaForm Exists? (0.2ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 217 AND `resposta_forms`.`formulario_id` = 70 LIMIT 1
+RespostaForm Create (0.1ms)  INSERT INTO `resposta_forms` (`created_at`, `data_submissao`, `formulario_id`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:32:52.607793', '2026-06-30', 70, '2026-06-30 17:32:52.607793', 217)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:52 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_rf2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_rf2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/217/avaliacoes Completed 302 Found in 190ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/resposta_forms” for 127.0.0.1 at 2026-06-30 14:32:52 -0300 Processing by RespostaFormsController#index as HTML

+ +
Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 217 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering resposta_forms/index.html.erb within layouts/application
+RespostaForm Load (0.2ms)  SELECT `resposta_forms`.* FROM `resposta_forms`
+Rendered resposta_forms/_resposta_form.html.erb (Duration: 0.2ms | GC: 0.0ms)
+Rendered resposta_forms/index.html.erb within layouts/application (Duration: 1.3ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.6ms | GC: 0.0ms)
+ +

Completed 200 OK in 4ms (Views: 1.7ms | ActiveRecord: 0.6ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.6ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_rf2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_rf2@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:52.998896', NULL, NULL, NULL, NULL, 'doc_rf2@unb.br', 'Doutorado', 'doc_rf2', 'Docente RF2', NULL, NULL, '$2a$12$ChoHabOgH8K6QMwA.jS/SeDIMTQJibcR3WnwhuGIqOLLa5TYZNQBa', 'Docente', '2026-06-30 17:32:52.998896')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:53.001231', 'Ciência da Computação', '2026-06-30 17:32:53.001231')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 204 LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.4ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.3ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:32:53.002953', 204, 'Engenharia de Software', '2026-06-30 17:32:53.002953')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 95 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 95 LIMIT 1
+Turma Create (0.3ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:32:53.004655', 95, NULL, 'TA', '2026.1', '2026-06-30 17:32:53.004655')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:32:53.005637', NULL, NULL, NULL, NULL, 87, '2026-06-30 17:32:53.005637')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaForm Exists? (0.4ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 218 AND `resposta_forms`.`formulario_id` = 71 LIMIT 1
+RespostaForm Create (0.3ms)  INSERT INTO `resposta_forms` (`created_at`, `data_submissao`, `formulario_id`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:32:53.007029', '2026-06-30', 71, '2026-06-30 17:32:53.007029', 218)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:53 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_rf2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_rf2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/218/avaliacoes Completed 302 Found in 190ms (ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/resposta_forms/new” for 127.0.0.1 at 2026-06-30 14:32:53 -0300 Processing by RespostaFormsController#new as HTML

+ +
Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 218 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering resposta_forms/new.html.erb within layouts/application
+Rendered resposta_forms/_form.html.erb (Duration: 1.6ms | GC: 0.2ms)
+Rendered resposta_forms/new.html.erb within layouts/application (Duration: 1.9ms | GC: 0.2ms)
+Rendered layout layouts/application.html.erb (Duration: 2.2ms | GC: 0.2ms)
+ +

Completed 200 OK in 4ms (Views: 2.3ms | ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.2ms)

+ +
TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_rf2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_rf2@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:53.394591', NULL, NULL, NULL, NULL, 'doc_rf2@unb.br', 'Doutorado', 'doc_rf2', 'Docente RF2', NULL, NULL, '$2a$12$.MjfRyZRcTDRp/FI/A7ki.fTVdQ28hBjXP8Iom1oGOInGlatxfFQq', 'Docente', '2026-06-30 17:32:53.394591')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:53.397047', 'Ciência da Computação', '2026-06-30 17:32:53.397047')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 205 LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.4ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.3ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:32:53.398878', 205, 'Engenharia de Software', '2026-06-30 17:32:53.398878')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 96 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 96 LIMIT 1
+Turma Create (0.3ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:32:53.400565', 96, NULL, 'TA', '2026.1', '2026-06-30 17:32:53.400565')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:32:53.401223', NULL, NULL, NULL, NULL, 88, '2026-06-30 17:32:53.401223')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaForm Exists? (0.4ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 219 AND `resposta_forms`.`formulario_id` = 72 LIMIT 1
+RespostaForm Create (0.2ms)  INSERT INTO `resposta_forms` (`created_at`, `data_submissao`, `formulario_id`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:32:53.402550', '2026-06-30', 72, '2026-06-30 17:32:53.402550', 219)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:53 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_rf2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_rf2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/219/avaliacoes Completed 302 Found in 210ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms)

+ +
RespostaForm Count (0.3ms)  SELECT COUNT(*) FROM `resposta_forms`
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.9ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:32:53.615187', NULL, NULL, NULL, NULL, 88, '2026-06-30 17:32:53.615187')
+TRANSACTION (0.4ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/resposta_forms” for 127.0.0.1 at 2026-06-30 14:32:53 -0300 Processing by RespostaFormsController#create as HTML

+ +
Parameters: {"resposta_form" => {"data_submissao" => "2026-06-30", "formulario_id" => "73", "usuario_id" => "219"}}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 219 LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Formulario Load (0.5ms)  SELECT `formularios`.* FROM `formularios` WHERE `formularios`.`id` = 73 LIMIT 1
+CACHE Usuario Load (0.0ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 219 LIMIT 1
+RespostaForm Exists? (0.3ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 219 AND `resposta_forms`.`formulario_id` = 73 LIMIT 1
+RespostaForm Create (0.3ms)  INSERT INTO `resposta_forms` (`created_at`, `data_submissao`, `formulario_id`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:32:53.623430', '2026-06-30', 73, '2026-06-30 17:32:53.623430', 219)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/resposta_forms/24 Completed 302 Found in 5ms (ActiveRecord: 1.7ms (5 queries, 1 cached) | GC: 0.0ms)

+ +
RespostaForm Count (0.2ms)  SELECT COUNT(*) FROM `resposta_forms`
+RespostaForm Load (0.2ms)  SELECT `resposta_forms`.* FROM `resposta_forms` ORDER BY `resposta_forms`.`id` DESC LIMIT 1
+TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_rf2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_rf2@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:53.816327', NULL, NULL, NULL, NULL, 'doc_rf2@unb.br', 'Doutorado', 'doc_rf2', 'Docente RF2', NULL, NULL, '$2a$12$kZr6B75KIke9ydRFXQwJVO5czDyjqly7IeDsp7bRzhBBCz/GdTtaq', 'Docente', '2026-06-30 17:32:53.816327')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:53.818795', 'Ciência da Computação', '2026-06-30 17:32:53.818795')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 206 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:32:53.820319', 206, 'Engenharia de Software', '2026-06-30 17:32:53.820319')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 97 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 97 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:32:53.821896', 97, NULL, 'TA', '2026.1', '2026-06-30 17:32:53.821896')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:32:53.822530', NULL, NULL, NULL, NULL, 89, '2026-06-30 17:32:53.822530')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaForm Exists? (0.4ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 220 AND `resposta_forms`.`formulario_id` = 74 LIMIT 1
+RespostaForm Create (0.2ms)  INSERT INTO `resposta_forms` (`created_at`, `data_submissao`, `formulario_id`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:32:53.823795', '2026-06-30', 74, '2026-06-30 17:32:53.823795', 220)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:53 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_rf2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_rf2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/220/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
RespostaForm Count (0.3ms)  SELECT COUNT(*) FROM `resposta_forms`
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_rf3' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_rf3@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:54.204648', NULL, NULL, NULL, NULL, 'doc_rf3@unb.br', 'Mestrado', 'doc_rf3', 'Docente RF3', NULL, NULL, '$2a$12$OC9JHuOnFM56coq1gZAJFe.g604pRwN24CbGNQhFyqtxhO0dRvo.G', 'Docente', '2026-06-30 17:32:54.204648')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/resposta_forms” for 127.0.0.1 at 2026-06-30 14:32:54 -0300 Processing by RespostaFormsController#create as HTML

+ +
Parameters: {"resposta_form" => {"data_submissao" => nil, "formulario_id" => "74", "usuario_id" => "221"}}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 220 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Load (0.4ms)  SELECT `formularios`.* FROM `formularios` WHERE `formularios`.`id` = 74 LIMIT 1
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 221 LIMIT 1
+RespostaForm Exists? (0.3ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 221 AND `resposta_forms`.`formulario_id` = 74 LIMIT 1
+TRANSACTION (0.1ms)  ROLLBACK TO SAVEPOINT active_record_1
+Rendering layout layouts/application.html.erb
+Rendering resposta_forms/new.html.erb within layouts/application
+Rendered resposta_forms/_form.html.erb (Duration: 0.8ms | GC: 0.1ms)
+Rendered resposta_forms/new.html.erb within layouts/application (Duration: 0.9ms | GC: 0.1ms)
+Rendered layout layouts/application.html.erb (Duration: 1.2ms | GC: 0.1ms)
+ +

Completed 422 Unprocessable Content in 4ms (Views: 1.3ms | ActiveRecord: 1.5ms (4 queries, 0 cached) | GC: 0.1ms)

+ +
RespostaForm Count (0.2ms)  SELECT COUNT(*) FROM `resposta_forms`
+TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_rf2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_rf2@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:54.402743', NULL, NULL, NULL, NULL, 'doc_rf2@unb.br', 'Doutorado', 'doc_rf2', 'Docente RF2', NULL, NULL, '$2a$12$ywpggYmcWfi8umQpvL2xLe2oUtyxbZaAtS0BHbca.pYvpHaupfd12', 'Docente', '2026-06-30 17:32:54.402743')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:54.405150', 'Ciência da Computação', '2026-06-30 17:32:54.405150')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 207 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.4ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.3ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:32:54.406736', 207, 'Engenharia de Software', '2026-06-30 17:32:54.406736')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 98 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 98 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:32:54.408520', 98, NULL, 'TA', '2026.1', '2026-06-30 17:32:54.408520')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:32:54.409178', NULL, NULL, NULL, NULL, 90, '2026-06-30 17:32:54.409178')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaForm Exists? (0.4ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 222 AND `resposta_forms`.`formulario_id` = 75 LIMIT 1
+RespostaForm Create (0.2ms)  INSERT INTO `resposta_forms` (`created_at`, `data_submissao`, `formulario_id`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:32:54.410529', '2026-06-30', 75, '2026-06-30 17:32:54.410529', 222)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:54 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_rf2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_rf2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/222/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/resposta_forms/26” for 127.0.0.1 at 2026-06-30 14:32:54 -0300 Processing by RespostaFormsController#show as HTML

+ +
Parameters: {"id" => "26"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 222 LIMIT 1
+RespostaForm Load (0.3ms)  SELECT `resposta_forms`.* FROM `resposta_forms` WHERE `resposta_forms`.`id` = 26 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering resposta_forms/show.html.erb within layouts/application
+Rendered resposta_forms/_resposta_form.html.erb (Duration: 0.0ms | GC: 0.0ms)
+Rendered resposta_forms/show.html.erb within layouts/application (Duration: 0.4ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.7ms | GC: 0.1ms)
+ +

Completed 200 OK in 3ms (Views: 0.9ms | ActiveRecord: 0.6ms (2 queries, 0 cached) | GC: 0.1ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_rf2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_rf2@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:54.809888', NULL, NULL, NULL, NULL, 'doc_rf2@unb.br', 'Doutorado', 'doc_rf2', 'Docente RF2', NULL, NULL, '$2a$12$HEpDO7toM87M99Vq8XHiB.z1xWE9YDjTar.yRMsfVnYPk1cFUNZ6a', 'Docente', '2026-06-30 17:32:54.809888')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:54.812349', 'Ciência da Computação', '2026-06-30 17:32:54.812349')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 208 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.4ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:32:54.813923', 208, 'Engenharia de Software', '2026-06-30 17:32:54.813923')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 99 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 99 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:32:54.815593', 99, NULL, 'TA', '2026.1', '2026-06-30 17:32:54.815593')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:32:54.816260', NULL, NULL, NULL, NULL, 91, '2026-06-30 17:32:54.816260')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaForm Exists? (0.4ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 223 AND `resposta_forms`.`formulario_id` = 76 LIMIT 1
+RespostaForm Create (0.2ms)  INSERT INTO `resposta_forms` (`created_at`, `data_submissao`, `formulario_id`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:32:54.817616', '2026-06-30', 76, '2026-06-30 17:32:54.817616', 223)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:54 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_rf2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_rf2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/223/avaliacoes Completed 302 Found in 206ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/resposta_forms/27/edit” for 127.0.0.1 at 2026-06-30 14:32:55 -0300 Processing by RespostaFormsController#edit as HTML

+ +
Parameters: {"id" => "27"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 223 LIMIT 1
+RespostaForm Load (0.2ms)  SELECT `resposta_forms`.* FROM `resposta_forms` WHERE `resposta_forms`.`id` = 27 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering resposta_forms/edit.html.erb within layouts/application
+Rendered resposta_forms/_form.html.erb (Duration: 0.5ms | GC: 0.0ms)
+Rendered resposta_forms/edit.html.erb within layouts/application (Duration: 0.8ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.0ms | GC: 0.0ms)
+ +

Completed 200 OK in 3ms (Views: 1.2ms | ActiveRecord: 0.5ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_rf2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_rf2@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:55.238587', NULL, NULL, NULL, NULL, 'doc_rf2@unb.br', 'Doutorado', 'doc_rf2', 'Docente RF2', NULL, NULL, '$2a$12$K6orUQKeaDWk2KES6gLO6eWaiIQTAWE.ULcSWn1smhNS9S.OBHqdK', 'Docente', '2026-06-30 17:32:55.238587')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:55.241056', 'Ciência da Computação', '2026-06-30 17:32:55.241056')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 209 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:32:55.242586', 209, 'Engenharia de Software', '2026-06-30 17:32:55.242586')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 100 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 100 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:32:55.244143', 100, NULL, 'TA', '2026.1', '2026-06-30 17:32:55.244143')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:32:55.244790', NULL, NULL, NULL, NULL, 92, '2026-06-30 17:32:55.244790')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaForm Exists? (0.4ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 224 AND `resposta_forms`.`formulario_id` = 77 LIMIT 1
+RespostaForm Create (0.2ms)  INSERT INTO `resposta_forms` (`created_at`, `data_submissao`, `formulario_id`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:32:55.246153', '2026-06-30', 77, '2026-06-30 17:32:55.246153', 224)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:55 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_rf2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_rf2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/224/avaliacoes Completed 302 Found in 205ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started PATCH “/resposta_forms/28” for 127.0.0.1 at 2026-06-30 14:32:55 -0300 Processing by RespostaFormsController#update as HTML

+ +
Parameters: {"resposta_form" => {"data_submissao" => "2026-06-29", "formulario_id" => "77", "usuario_id" => "224"}, "id" => "28"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 224 LIMIT 1
+RespostaForm Load (0.2ms)  SELECT `resposta_forms`.* FROM `resposta_forms` WHERE `resposta_forms`.`id` = 28 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaForm Exists? (0.3ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 224 AND `resposta_forms`.`id` != 28 AND `resposta_forms`.`formulario_id` = 77 LIMIT 1
+RespostaForm Update (0.3ms)  UPDATE `resposta_forms` SET `resposta_forms`.`data_submissao` = '2026-06-29', `resposta_forms`.`updated_at` = '2026-06-30 17:32:55.457682' WHERE `resposta_forms`.`id` = 28
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/resposta_forms/28 Completed 303 See Other in 5ms (ActiveRecord: 3.2ms (4 queries, 0 cached) | GC: 0.0ms)

+ +
RespostaForm Load (0.2ms)  SELECT `resposta_forms`.* FROM `resposta_forms` WHERE `resposta_forms`.`id` = 28 LIMIT 1
+TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_rf2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_rf2@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:55.668274', NULL, NULL, NULL, NULL, 'doc_rf2@unb.br', 'Doutorado', 'doc_rf2', 'Docente RF2', NULL, NULL, '$2a$12$LXIUZaLuJcSRmdrywRrCaOJB808w7hXK/NHo42VdTRXipj2KiGJvG', 'Docente', '2026-06-30 17:32:55.668274')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:55.670643', 'Ciência da Computação', '2026-06-30 17:32:55.670643')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 210 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:32:55.672166', 210, 'Engenharia de Software', '2026-06-30 17:32:55.672166')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 101 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 101 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:32:55.673822', 101, NULL, 'TA', '2026.1', '2026-06-30 17:32:55.673822')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.2ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:32:55.674577', NULL, NULL, NULL, NULL, 93, '2026-06-30 17:32:55.674577')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaForm Exists? (0.4ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 225 AND `resposta_forms`.`formulario_id` = 78 LIMIT 1
+RespostaForm Create (0.2ms)  INSERT INTO `resposta_forms` (`created_at`, `data_submissao`, `formulario_id`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:32:55.675757', '2026-06-30', 78, '2026-06-30 17:32:55.675757', 225)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:55 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_rf2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.1ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_rf2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/225/avaliacoes Completed 302 Found in 207ms (ActiveRecord: 0.1ms (1 query, 0 cached) | GC: 0.0ms) Started PATCH “/resposta_forms/29” for 127.0.0.1 at 2026-06-30 14:32:55 -0300 Processing by RespostaFormsController#update as HTML

+ +
Parameters: {"resposta_form" => {"data_submissao" => nil, "formulario_id" => "78", "usuario_id" => "225"}, "id" => "29"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 225 LIMIT 1
+RespostaForm Load (0.2ms)  SELECT `resposta_forms`.* FROM `resposta_forms` WHERE `resposta_forms`.`id` = 29 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaForm Exists? (0.5ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 225 AND `resposta_forms`.`id` != 29 AND `resposta_forms`.`formulario_id` = 78 LIMIT 1
+TRANSACTION (0.1ms)  ROLLBACK TO SAVEPOINT active_record_1
+Rendering layout layouts/application.html.erb
+Rendering resposta_forms/edit.html.erb within layouts/application
+Rendered resposta_forms/_form.html.erb (Duration: 0.8ms | GC: 0.0ms)
+Rendered resposta_forms/edit.html.erb within layouts/application (Duration: 0.9ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.2ms | GC: 0.0ms)
+ +

Completed 422 Unprocessable Content in 4ms (Views: 1.3ms | ActiveRecord: 1.3ms (3 queries, 0 cached) | GC: 0.1ms)

+ +
TRANSACTION (0.3ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_rf2' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_rf2@unb.br' LIMIT 1
+ActiveRecord::InternalMetadata Load (0.4ms)  SELECT * FROM `ar_internal_metadata` WHERE `ar_internal_metadata`.`key` = 'schema_sha1' ORDER BY `ar_internal_metadata`.`key` ASC LIMIT 1
+ActiveRecord::SchemaMigration Load (0.3ms)  SELECT `schema_migrations`.`version` FROM `schema_migrations` ORDER BY `schema_migrations`.`version` ASC
+TRANSACTION (0.3ms)  BEGIN
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` ORDER BY `departamentos`.`id` ASC LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:56.051507', 'Ciência da Computação', '2026-06-30 17:32:56.051507')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Administrador Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' ORDER BY `usuarios`.`id` ASC LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'admin' LIMIT 1
+Usuario Exists? (0.1ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@teste.com' LIMIT 1
+Docente Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:56.092940', NULL, NULL, NULL, NULL, 'doc_rf2@unb.br', 'Doutorado', 'doc_rf2', 'Docente RF2', NULL, NULL, '$2a$12$h55cV0IxYvMPPI9JMxYBCupWw2pXBjQ9a8rQLOhi6bdvPvak7igxC', 'Docente', '2026-06-30 17:32:56.092940')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Administrador Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:56.252318', NULL, NULL, NULL, 211, 'admin@teste.com', NULL, 'admin', 'Admin Teste', NULL, NULL, '$2a$12$PXjYwym5kigQ1Kkue/0Ibui1J.hAht/KdlYCq6oKWlnIQkAurBnR.', 'Administrador', '2026-06-30 17:32:56.252318')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/admin/227/gerenciamento” for 127.0.0.1 at 2026-06-30 14:32:56 -0300 Processing by AdminController#gerenciamento as HTML

+ +
Parameters: {"admin_id" => "227"}
+Administrador Load (0.5ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 227 LIMIT 1
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/gerenciamento.html.erb within layouts/gerenciamento
+Rendered admin/gerenciamento.html.erb within layouts/gerenciamento (Duration: 0.4ms | GC: 0.1ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 3.4ms | GC: 0.2ms)
+ +

Completed 200 OK in 14ms (Views: 5.2ms | ActiveRecord: 0.5ms (1 query, 0 cached) | GC: 0.4ms) Started POST “/admin/227/sincronizar_sigaa” for 127.0.0.1 at 2026-06-30 14:32:56 -0300 Processing by AdminController#sincronizar_sigaa as HTML

+ +
Parameters: {"acao" => "importar", "arquivo_classes" => #<ActionDispatch::Http::UploadedFile:0x0000000119e88860 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-99683-vsxeb.json>, @content_type="application/json", @original_filename="classes.json", @headers="content-disposition: form-data; name=\"arquivo_classes\"; filename=\"classes.json\"\r\ncontent-type: application/json\r\ncontent-length: 611\r\n">, "arquivo_membros" => #<ActionDispatch::Http::UploadedFile:0x0000000119e884a0 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-99683-fjw5wr.json>, @content_type="application/json", @original_filename="classes.json", @headers="content-disposition: form-data; name=\"arquivo_membros\"; filename=\"classes.json\"\r\ncontent-type: application/json\r\ncontent-length: 611\r\n">, "admin_id" => "227"}
+Administrador Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 227 LIMIT 1
+ +

Redirected to www.example.com/admin/227/gerenciamento Completed 302 Found in 1ms (ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.1ms) Started GET “/admin/227/gerenciamento” for 127.0.0.1 at 2026-06-30 14:32:56 -0300 Processing by AdminController#gerenciamento as HTML

+ +
Parameters: {"admin_id" => "227"}
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 227 LIMIT 1
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/gerenciamento.html.erb within layouts/gerenciamento
+Rendered admin/gerenciamento.html.erb within layouts/gerenciamento (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 2.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 3ms (Views: 2.5ms | ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started POST “/admin/227/sincronizar_sigaa” for 127.0.0.1 at 2026-06-30 14:32:56 -0300 Processing by AdminController#sincronizar_sigaa as HTML

+ +
Parameters: {"acao" => "atualizar", "arquivo_classes" => #<ActionDispatch::Http::UploadedFile:0x0000000119b42b38 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-99683-ev2u2e.json>, @content_type="application/json", @original_filename="classes.json", @headers="content-disposition: form-data; name=\"arquivo_classes\"; filename=\"classes.json\"\r\ncontent-type: application/json\r\ncontent-length: 611\r\n">, "arquivo_membros" => #<ActionDispatch::Http::UploadedFile:0x0000000119b42ae8 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-99683-cbo2ue.json>, @content_type="application/json", @original_filename="classes.json", @headers="content-disposition: form-data; name=\"arquivo_membros\"; filename=\"classes.json\"\r\ncontent-type: application/json\r\ncontent-length: 611\r\n">, "admin_id" => "227"}
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 227 LIMIT 1
+ +

Redirected to www.example.com/admin/227/gerenciamento Completed 302 Found in 1ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/admin/227/gerenciamento” for 127.0.0.1 at 2026-06-30 14:32:56 -0300 Processing by AdminController#gerenciamento as HTML

+ +
Parameters: {"admin_id" => "227"}
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 227 LIMIT 1
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/gerenciamento.html.erb within layouts/gerenciamento
+Rendered admin/gerenciamento.html.erb within layouts/gerenciamento (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 0.4ms | GC: 0.1ms)
+ +

Completed 200 OK in 1ms (Views: 0.5ms | ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.1ms)

+ +
Departamento Create (231.8ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:56.095003', 'Ciência da Computação', '2026-06-30 17:32:56.095003')
+TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.1ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 212 LIMIT 1
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` ORDER BY `departamentos`.`id` ASC LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Disciplina Create (0.3ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:32:56.328534', 212, 'Engenharia de Software', '2026-06-30 17:32:56.328534')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 102 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 102 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:32:56.330265', 102, NULL, 'TA', '2026.1', '2026-06-30 17:32:56.330265')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:32:56.330913', NULL, NULL, NULL, NULL, 94, '2026-06-30 17:32:56.330913')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaForm Exists? (0.4ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 226 AND `resposta_forms`.`formulario_id` = 79 LIMIT 1
+RespostaForm Create (0.2ms)  INSERT INTO `resposta_forms` (`created_at`, `data_submissao`, `formulario_id`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:32:56.332189', '2026-06-30', 79, '2026-06-30 17:32:56.332189', 226)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:56 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_rf2@unb.br", "senha" => "Senha123"}
+Usuario Load (0.1ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_rf2@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/226/avaliacoes Completed 302 Found in 193ms (ActiveRecord: 0.1ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.6ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'del_rf' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'del_rf@unb.br' LIMIT 1
+Docente Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:56.528757', NULL, NULL, NULL, NULL, 'del_rf@unb.br', 'Grad', 'del_rf', 'Del RF', NULL, NULL, NULL, 'Docente', '2026-06-30 17:32:56.528757')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:32:56.529814', NULL, NULL, NULL, NULL, 94, '2026-06-30 17:32:56.529814')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaForm Exists? (0.4ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 228 AND `resposta_forms`.`formulario_id` = 80 LIMIT 1
+RespostaForm Create (0.2ms)  INSERT INTO `resposta_forms` (`created_at`, `data_submissao`, `formulario_id`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:32:56.531290', '2026-06-30', 80, '2026-06-30 17:32:56.531290', 228)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+RespostaForm Count (0.2ms)  SELECT COUNT(*) FROM `resposta_forms`
+ +

Started DELETE “/resposta_forms/31” for 127.0.0.1 at 2026-06-30 14:32:56 -0300 Processing by RespostaFormsController#destroy as HTML

+ +
Parameters: {"id" => "31"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 226 LIMIT 1
+RespostaForm Load (0.2ms)  SELECT `resposta_forms`.* FROM `resposta_forms` WHERE `resposta_forms`.`id` = 31 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaElem Load (0.4ms)  SELECT `resposta_elems`.* FROM `resposta_elems` WHERE `resposta_elems`.`resposta_form_id` = 31
+RespostaForm Destroy (0.2ms)  DELETE FROM `resposta_forms` WHERE `resposta_forms`.`id` = 31
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/resposta_forms Completed 303 See Other in 2ms (ActiveRecord: 1.3ms (4 queries, 0 cached) | GC: 0.0ms)

+ +
RespostaForm Count (0.2ms)  SELECT COUNT(*) FROM `resposta_forms`
+Departamento Create (207.4ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:56.328722', 'Ciência da Computação', '2026-06-30 17:32:56.328722')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.8ms)  ROLLBACK
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' ORDER BY `usuarios`.`id` ASC LIMIT 1
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'admin' LIMIT 1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc002' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@teste.com' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'novo@unb.br' LIMIT 1
+Docente Create (0.3ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:56.538273', NULL, NULL, 'token_definicao_123', NULL, 'novo@unb.br', 'Mestrado', 'doc002', 'Novo Professor', NULL, NULL, NULL, 'Docente', '2026-06-30 17:32:56.538273')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/definir_senha/token_definicao_123” for 127.0.0.1 at 2026-06-30 14:32:56 -0300 Processing by DefinicaoSenhasController#edit as HTML

+ +
Parameters: {"token" => "[FILTERED]"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`definicao_senha_token` = 'token_definicao_123' LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering definicao_senhas/edit.html.erb within layouts/application
+Rendered definicao_senhas/edit.html.erb within layouts/application (Duration: 0.3ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.6ms | GC: 0.0ms)
+ +

Completed 200 OK in 2ms (Views: 1.0ms | ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.3ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+ +

Started GET “/definir_senha/token_inexistente” for 127.0.0.1 at 2026-06-30 14:32:56 -0300 Processing by DefinicaoSenhasController#edit as HTML

+ +
Parameters: {"token" => "[FILTERED]"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`definicao_senha_token` = 'token_inexistente' LIMIT 1
+ +

Redirected to www.example.com/ Completed 302 Found in 0ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc002' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'novo@unb.br' LIMIT 1
+Docente Create (0.3ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:56.545417', NULL, NULL, 'token_definicao_123', NULL, 'novo@unb.br', 'Mestrado', 'doc002', 'Novo Professor', NULL, NULL, NULL, 'Docente', '2026-06-30 17:32:56.545417')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started PATCH “/definir_senha/token_definicao_123” for 127.0.0.1 at 2026-06-30 14:32:56 -0300 Processing by DefinicaoSenhasController#update as HTML

+ +
Parameters: {"senha" => "NovaSenhaSegura123", "senha_confirmation" => "NovaSenhaSegura123", "token" => "[FILTERED]"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`definicao_senha_token` = 'token_definicao_123' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'novo@unb.br' AND `usuarios`.`id` != 230 LIMIT 1
+Administrador Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:56.733029', NULL, NULL, NULL, 213, 'admin@teste.com', NULL, 'admin', 'Admin Teste', NULL, NULL, '$2a$12$OLtVj6OWQvhg9JwK/p.If.DAmW2X34RKrQEVHztUUhka2d34GVAny', 'Administrador', '2026-06-30 17:32:56.733029')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/admin/231/gerenciamento” for 127.0.0.1 at 2026-06-30 14:32:56 -0300 Processing by AdminController#gerenciamento as HTML

+ +
Parameters: {"admin_id" => "231"}
+Administrador Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 231 LIMIT 1
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/gerenciamento.html.erb within layouts/gerenciamento
+Rendered admin/gerenciamento.html.erb within layouts/gerenciamento (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 0.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.5ms | ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.1ms) Started POST “/admin/231/sincronizar_sigaa” for 127.0.0.1 at 2026-06-30 14:32:56 -0300 Processing by AdminController#sincronizar_sigaa as HTML

+ +
Parameters: {"acao" => "importar", "arquivo_classes" => #<ActionDispatch::Http::UploadedFile:0x00000001199e0560 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-99683-h9wxxs.json>, @content_type="application/json", @original_filename="classes.json", @headers="content-disposition: form-data; name=\"arquivo_classes\"; filename=\"classes.json\"\r\ncontent-type: application/json\r\ncontent-length: 611\r\n">, "arquivo_membros" => #<ActionDispatch::Http::UploadedFile:0x00000001199e0510 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-99683-myj9x7.json>, @content_type="application/json", @original_filename="classes.json", @headers="content-disposition: form-data; name=\"arquivo_membros\"; filename=\"classes.json\"\r\ncontent-type: application/json\r\ncontent-length: 611\r\n">, "admin_id" => "231"}
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 231 LIMIT 1
+ +

Redirected to www.example.com/admin/231/gerenciamento Completed 302 Found in 1ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/admin/231/gerenciamento” for 127.0.0.1 at 2026-06-30 14:32:56 -0300 Processing by AdminController#gerenciamento as HTML

+ +
Parameters: {"admin_id" => "231"}
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 231 LIMIT 1
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/gerenciamento.html.erb within layouts/gerenciamento
+Rendered admin/gerenciamento.html.erb within layouts/gerenciamento (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 0.3ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.4ms | ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.1ms) Started POST “/admin/231/sincronizar_sigaa” for 127.0.0.1 at 2026-06-30 14:32:56 -0300 Processing by AdminController#sincronizar_sigaa as HTML

+ +
Parameters: {"acao" => "atualizar", "arquivo_classes" => #<ActionDispatch::Http::UploadedFile:0x000000011006c140 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-99683-ubqt7l.json>, @content_type="application/json", @original_filename="classes.json", @headers="content-disposition: form-data; name=\"arquivo_classes\"; filename=\"classes.json\"\r\ncontent-type: application/json\r\ncontent-length: 611\r\n">, "arquivo_membros" => #<ActionDispatch::Http::UploadedFile:0x000000011006c000 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-99683-lmj1a8.json>, @content_type="application/json", @original_filename="classes.json", @headers="content-disposition: form-data; name=\"arquivo_membros\"; filename=\"classes.json\"\r\ncontent-type: application/json\r\ncontent-length: 611\r\n">, "admin_id" => "231"}
+Docente Update (0.6ms)  UPDATE `usuarios` SET `usuarios`.`definicao_senha_token` = NULL, `usuarios`.`senha_hash` = '$2a$12$entVexC3PzGtKp4accnCIO/mY9K3cOd.cTyrJHSyxjwV7CLkEgDlC', `usuarios`.`updated_at` = '2026-06-30 17:32:56.742021' WHERE `usuarios`.`id` = 230
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 231 LIMIT 1
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/admin/231/gerenciamento Completed 302 Found in 1ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Redirected to www.example.com/ Completed 302 Found in 197ms (ActiveRecord: 1.5ms (3 queries, 0 cached) | GC: 0.0ms) Started GET “/admin/231/gerenciamento” for 127.0.0.1 at 2026-06-30 14:32:56 -0300 Processing by AdminController#gerenciamento as HTML

+ +
Parameters: {"admin_id" => "231"}
+Docente Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Docente' AND `usuarios`.`id` = 230 LIMIT 1
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 231 LIMIT 1
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/gerenciamento.html.erb within layouts/gerenciamento
+Rendered admin/gerenciamento.html.erb within layouts/gerenciamento (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 0.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.5ms | ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.1ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.4ms)  ROLLBACK
+ +

Started PATCH “/definir_senha/token_inexistente” for 127.0.0.1 at 2026-06-30 14:32:56 -0300 Processing by DefinicaoSenhasController#update as HTML

+ +
Parameters: {"senha" => "NovaSenhaSegura123", "senha_confirmation" => "NovaSenhaSegura123", "token" => "[FILTERED]"}
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.4ms)  SELECT `departamentos`.* FROM `departamentos` ORDER BY `departamentos`.`id` ASC LIMIT 1
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`definicao_senha_token` = 'token_inexistente' LIMIT 1
+ +

Redirected to www.example.com/ Completed 302 Found in 1ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.3ms)

+ +
TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.2ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:56.748429', 'Ciência da Computação', '2026-06-30 17:32:56.748429')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' ORDER BY `usuarios`.`id` ASC LIMIT 1
+TRANSACTION (0.2ms)  ROLLBACK
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'admin' LIMIT 1
+TRANSACTION (0.1ms)  BEGIN
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@teste.com' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc002' LIMIT 1
+Usuario Exists? (0.1ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'novo@unb.br' LIMIT 1
+Docente Create (0.1ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:56.751496', NULL, NULL, 'token_definicao_123', NULL, 'novo@unb.br', 'Mestrado', 'doc002', 'Novo Professor', NULL, NULL, NULL, 'Docente', '2026-06-30 17:32:56.751496')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started PATCH “/definir_senha/token_definicao_123” for 127.0.0.1 at 2026-06-30 14:32:56 -0300 Processing by DefinicaoSenhasController#update as HTML

+ +
Parameters: {"senha" => "NovaSenha123", "senha_confirmation" => "SenhaDiferente456", "token" => "[FILTERED]"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`definicao_senha_token` = 'token_definicao_123' LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering definicao_senhas/edit.html.erb within layouts/application
+Rendered definicao_senhas/edit.html.erb within layouts/application (Duration: 0.8ms | GC: 0.5ms)
+Rendered layout layouts/application.html.erb (Duration: 1.1ms | GC: 0.5ms)
+ +

Completed 422 Unprocessable Content in 2ms (Views: 1.7ms | ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.7ms)

+ +
TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc002' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'novo@unb.br' LIMIT 1
+Docente Create (0.3ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:56.759017', NULL, NULL, 'token_definicao_123', NULL, 'novo@unb.br', 'Mestrado', 'doc002', 'Novo Professor', NULL, NULL, NULL, 'Docente', '2026-06-30 17:32:56.759017')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started PATCH “/definir_senha/token_definicao_123” for 127.0.0.1 at 2026-06-30 14:32:56 -0300 Processing by DefinicaoSenhasController#update as HTML

+ +
Parameters: {"senha" => "abc", "senha_confirmation" => "abc", "token" => "[FILTERED]"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`definicao_senha_token` = 'token_definicao_123' LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering definicao_senhas/edit.html.erb within layouts/application
+Rendered definicao_senhas/edit.html.erb within layouts/application (Duration: 0.2ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.0ms | GC: 0.6ms)
+ +

Completed 422 Unprocessable Content in 2ms (Views: 1.2ms | ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 1.1ms)

+ +
TRANSACTION (0.6ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc002' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'novo@unb.br' LIMIT 1
+Docente Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:56.771291', NULL, NULL, 'token_definicao_123', NULL, 'novo@unb.br', 'Mestrado', 'doc002', 'Novo Professor', NULL, NULL, NULL, 'Docente', '2026-06-30 17:32:56.771291')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started PATCH “/definir_senha/token_definicao_123” for 127.0.0.1 at 2026-06-30 14:32:56 -0300 Processing by DefinicaoSenhasController#update as HTML

+ +
Parameters: {"senha" => "NovaSenhaSegura123", "senha_confirmation" => "NovaSenhaSegura123", "token" => "[FILTERED]"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`definicao_senha_token` = 'token_definicao_123' LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering definicao_senhas/edit.html.erb within layouts/application
+Rendered definicao_senhas/edit.html.erb within layouts/application (Duration: 0.4ms | GC: 0.2ms)
+Rendered layout layouts/application.html.erb (Duration: 0.9ms | GC: 0.5ms)
+ +

Completed 422 Unprocessable Content in 2ms (Views: 1.0ms | ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.9ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+ +

Started GET “/redefinir_senha” for 127.0.0.1 at 2026-06-30 14:32:56 -0300 Processing by RedefinicaoSenhasController#new as HTML

+ +
Rendering layout layouts/application.html.erb
+Rendering redefinicao_senhas/new.html.erb within layouts/application
+Rendered redefinicao_senhas/new.html.erb within layouts/application (Duration: 0.3ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.2ms | GC: 0.7ms)
+ +

Completed 200 OK in 2ms (Views: 1.9ms | ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 1.0ms)

+ +
TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+ +

Started POST “/redefinir_senha” for 127.0.0.1 at 2026-06-30 14:32:56 -0300 Processing by RedefinicaoSenhasController#create as HTML

+ +
Parameters: {"email" => "[FILTERED]"}
+ +

Redirected to www.example.com/redefinir_senha Completed 302 Found in 0ms (ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+ +

Started POST “/redefinir_senha” for 127.0.0.1 at 2026-06-30 14:32:56 -0300 Processing by RedefinicaoSenhasController#create as HTML

+ +
Parameters: {"email" => "[FILTERED]"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'naoexiste@unb.br' LIMIT 1
+ +

Redirected to www.example.com/redefinir_senha Completed 302 Found in 1ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc003' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'esquecido@unb.br' LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:56.949484', NULL, NULL, NULL, 214, 'admin@teste.com', NULL, 'admin', 'Admin Teste', NULL, NULL, '$2a$12$oqczkvZlQFpOTAiCmimXZu/ypyvCiBkqnDyUc.VbwfID2EfZeDcH2', 'Administrador', '2026-06-30 17:32:56.949484')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/admin/235/gerenciamento” for 127.0.0.1 at 2026-06-30 14:32:56 -0300 Processing by AdminController#gerenciamento as HTML

+ +
Parameters: {"admin_id" => "235"}
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 235 LIMIT 1
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/gerenciamento.html.erb within layouts/gerenciamento
+Rendered admin/gerenciamento.html.erb within layouts/gerenciamento (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 0.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.5ms | ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started POST “/admin/235/sincronizar_sigaa” for 127.0.0.1 at 2026-06-30 14:32:56 -0300 Processing by AdminController#sincronizar_sigaa as HTML

+ +
Parameters: {"acao" => "importar", "arquivo_classes" => #<ActionDispatch::Http::UploadedFile:0x000000010fca8180 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-99683-5hxhi8.json>, @content_type="application/json", @original_filename="classes.json", @headers="content-disposition: form-data; name=\"arquivo_classes\"; filename=\"classes.json\"\r\ncontent-type: application/json\r\ncontent-length: 611\r\n">, "arquivo_membros" => #<ActionDispatch::Http::UploadedFile:0x000000010fca8130 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-99683-xkj761.json>, @content_type="application/json", @original_filename="classes.json", @headers="content-disposition: form-data; name=\"arquivo_membros\"; filename=\"classes.json\"\r\ncontent-type: application/json\r\ncontent-length: 611\r\n">, "admin_id" => "235"}
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 235 LIMIT 1
+ +

Redirected to www.example.com/admin/235/gerenciamento Completed 302 Found in 1ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.1ms) Started GET “/admin/235/gerenciamento” for 127.0.0.1 at 2026-06-30 14:32:56 -0300 Processing by AdminController#gerenciamento as HTML

+ +
Parameters: {"admin_id" => "235"}
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 235 LIMIT 1
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/gerenciamento.html.erb within layouts/gerenciamento
+Rendered admin/gerenciamento.html.erb within layouts/gerenciamento (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 0.3ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.4ms | ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started POST “/admin/235/sincronizar_sigaa” for 127.0.0.1 at 2026-06-30 14:32:56 -0300 Processing by AdminController#sincronizar_sigaa as HTML

+ +
Parameters: {"acao" => "atualizar", "arquivo_classes" => #<ActionDispatch::Http::UploadedFile:0x000000010f86db10 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-99683-sx3xwq.json>, @content_type="application/json", @original_filename="classes.json", @headers="content-disposition: form-data; name=\"arquivo_classes\"; filename=\"classes.json\"\r\ncontent-type: application/json\r\ncontent-length: 611\r\n">, "arquivo_membros" => #<ActionDispatch::Http::UploadedFile:0x000000010f86d9d0 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-99683-5vfra2.json>, @content_type="application/json", @original_filename="classes.json", @headers="content-disposition: form-data; name=\"arquivo_membros\"; filename=\"classes.json\"\r\ncontent-type: application/json\r\ncontent-length: 611\r\n">, "admin_id" => "235"}
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 235 LIMIT 1
+ +

Redirected to www.example.com/admin/235/gerenciamento Completed 302 Found in 1ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/admin/235/gerenciamento” for 127.0.0.1 at 2026-06-30 14:32:56 -0300 Processing by AdminController#gerenciamento as HTML

+ +
Parameters: {"admin_id" => "235"}
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 235 LIMIT 1
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/gerenciamento.html.erb within layouts/gerenciamento
+Rendered admin/gerenciamento.html.erb within layouts/gerenciamento (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 0.3ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.4ms | ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.2ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` ORDER BY `departamentos`.`id` ASC LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:56.964515', 'Ciência da Computação', '2026-06-30 17:32:56.964515')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' ORDER BY `usuarios`.`id` ASC LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'admin' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@teste.com' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:56.989111', NULL, NULL, NULL, NULL, 'esquecido@unb.br', 'Doutorado', 'doc003', 'Professor Esquecido', NULL, 'token_redefinicao_456', '$2a$12$SgsOy4NhtBxBBJ61Qh.nVO7t7IpxSvAmzjnByk1JXJAaM8ATTW61m', 'Docente', '2026-06-30 17:32:56.989111')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/redefinir_senha” for 127.0.0.1 at 2026-06-30 14:32:56 -0300 Processing by RedefinicaoSenhasController#create as HTML

+ +
Parameters: {"email" => "[FILTERED]"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'esquecido@unb.br' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.7ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'esquecido@unb.br' AND `usuarios`.`id` != 236 LIMIT 1
+Docente Update (0.5ms)  UPDATE `usuarios` SET `usuarios`.`redefinicao_senha_sent_at` = '2026-06-30 17:32:56.992087', `usuarios`.`redefinicao_senha_token` = 'Nejdh3OE4DLavPvaya0Z2l00lAb2VH-Pe9OeWeQOixU', `usuarios`.`updated_at` = '2026-06-30 17:32:56.993218' WHERE `usuarios`.`id` = 236
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Rendering layout layouts/mailer.html.erb
+Rendering usuario_mailer/redefinicao_senha.html.erb within layouts/mailer
+Rendered usuario_mailer/redefinicao_senha.html.erb within layouts/mailer (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/mailer.html.erb (Duration: 0.2ms | GC: 0.0ms)
+Rendering layout layouts/mailer.text.erb
+Rendering usuario_mailer/redefinicao_senha.text.erb within layouts/mailer
+Rendered usuario_mailer/redefinicao_senha.text.erb within layouts/mailer (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/mailer.text.erb (Duration: 0.2ms | GC: 0.0ms)
+ +

UsuarioMailer#redefinicao_senha: processed outbound mail in 11.1ms Delivered mail 6a43fdc92bd3_184a4d1897d7@MacBook-Air-de-Elvis.local.mail (10.0ms) Date: Tue, 30 Jun 2026 14:32:57 -0300 From: camaar@gmail.com To: esquecido@unb.br Message-ID: <6a43fdc92bd3_184a4d1897d7@MacBook-Air-de-Elvis.local.mail> Subject: =?UTF-8?Q?Redefini=C3=A7=C3=A3o_de_senha?= MIME-Version: 1.0 Content-Type: multipart/alternative;

+ +
boundary="--==_mimepart_6a43fdc91b5b_184a4d1896e3";
+charset=UTF-8
+
+ +

Content-Transfer-Encoding: 7bit

+ +

—-==_mimepart_6a43fdc91b5b_184a4d1896e3 Content-Type: text/plain;

+ +
charset=UTF-8
+
+ +

Content-Transfer-Encoding: quoted-printable

+ +

Ol=C3=A1, Professor Esquecido.

+ +

Voc=C3=AA solicitou a redefini=C3=A7=C3=A3o da sua senha. Acesse o link a= baixo:

+ +

example.com/redefinir_senha/Nejdh3OE4DLavPvaya0Z2l00lAb2VH-Pe9OeWe= QOixU

+ +

—-==_mimepart_6a43fdc91b5b_184a4d1896e3 Content-Type: text/html;

+ +
charset=UTF-8
+
+ +

Content-Transfer-Encoding: quoted-printable

+ +

<!DOCTYPE html> <html>

+ +
<head>
+  <meta http-equiv=3D"Content-Type" content=3D"text/html; charset=3Dutf=
+ +

-8“>

+ +
  <style>
+    /* Email styles need to be inline */
+  </style>
+</head>
+
+<body>
+  <p>Ol=C3=A1, Professor Esquecido.</p>
+ +

<p>Voc=C3=AA solicitou a redefini=C3=A7=C3=A3o da sua senha. Acesse o lin= k abaixo:</p>

+ +

<p><a href=3D“example.com/redefinir_senha/Nejdh3OE4DLavPvaya0Z2l00= lAb2VH-Pe9OeWeQOixU”>example.com/redefinir_senha/Nejdh3OE4DLavPvay= a0Z2l00lAb2VH-Pe9OeWeQOixU</a></p>

+ +
</body>
+ +

</html>

+ +

—-==_mimepart_6a43fdc91b5b_184a4d1896e3–

+ +

Redirected to www.example.com/ Completed 302 Found in 28ms (ActiveRecord: 1.8ms (3 queries, 0 cached) | GC: 8.1ms)

+ +
Docente Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Docente' AND `usuarios`.`id` = 236 LIMIT 1
+TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+ +

Started GET “/redefinir_senha/token_inexistente” for 127.0.0.1 at 2026-06-30 14:32:57 -0300 Processing by RedefinicaoSenhasController#edit as HTML

+ +
Parameters: {"token" => "[FILTERED]"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`redefinicao_senha_token` = 'token_inexistente' LIMIT 1
+ +

Redirected to www.example.com/ Completed 302 Found in 1ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc003' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'esquecido@unb.br' LIMIT 1
+Administrador Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:57.162171', NULL, NULL, NULL, 215, 'admin@teste.com', NULL, 'admin', 'Admin Teste', NULL, NULL, '$2a$12$iY7w2byWkeW.LcRWYQYhm.RNMm3yMrfIixfIlz4ERBfaXVurwhTsi', 'Administrador', '2026-06-30 17:32:57.162171')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/admin/237/gerenciamento” for 127.0.0.1 at 2026-06-30 14:32:57 -0300 Processing by AdminController#gerenciamento as HTML

+ +
Parameters: {"admin_id" => "237"}
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 237 LIMIT 1
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/gerenciamento.html.erb within layouts/gerenciamento
+Rendered admin/gerenciamento.html.erb within layouts/gerenciamento (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 0.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.5ms | ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started POST “/admin/237/sincronizar_sigaa” for 127.0.0.1 at 2026-06-30 14:32:57 -0300 Processing by AdminController#sincronizar_sigaa as HTML

+ +
Parameters: {"acao" => "importar", "arquivo_classes" => #<ActionDispatch::Http::UploadedFile:0x000000010f53eb10 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-99683-70iifx.json>, @content_type="application/json", @original_filename="classes.json", @headers="content-disposition: form-data; name=\"arquivo_classes\"; filename=\"classes.json\"\r\ncontent-type: application/json\r\ncontent-length: 611\r\n">, "arquivo_membros" => #<ActionDispatch::Http::UploadedFile:0x000000010f53ea20 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-99683-g7kski.json>, @content_type="application/json", @original_filename="classes.json", @headers="content-disposition: form-data; name=\"arquivo_membros\"; filename=\"classes.json\"\r\ncontent-type: application/json\r\ncontent-length: 611\r\n">, "admin_id" => "237"}
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 237 LIMIT 1
+ +

Redirected to www.example.com/admin/237/gerenciamento Completed 302 Found in 1ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/admin/237/gerenciamento” for 127.0.0.1 at 2026-06-30 14:32:57 -0300 Processing by AdminController#gerenciamento as HTML

+ +
Parameters: {"admin_id" => "237"}
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 237 LIMIT 1
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/gerenciamento.html.erb within layouts/gerenciamento
+Rendered admin/gerenciamento.html.erb within layouts/gerenciamento (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 0.3ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.4ms | ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started POST “/admin/237/sincronizar_sigaa” for 127.0.0.1 at 2026-06-30 14:32:57 -0300 Processing by AdminController#sincronizar_sigaa as HTML

+ +
Parameters: {"acao" => "atualizar", "arquivo_classes" => #<ActionDispatch::Http::UploadedFile:0x000000010dcfb558 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-99683-jk7dix.json>, @content_type="application/json", @original_filename="classes.json", @headers="content-disposition: form-data; name=\"arquivo_classes\"; filename=\"classes.json\"\r\ncontent-type: application/json\r\ncontent-length: 611\r\n">, "arquivo_membros" => #<ActionDispatch::Http::UploadedFile:0x000000010dcfb3c8 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-99683-dgxxl4.json>, @content_type="application/json", @original_filename="classes.json", @headers="content-disposition: form-data; name=\"arquivo_membros\"; filename=\"classes.json\"\r\ncontent-type: application/json\r\ncontent-length: 611\r\n">, "admin_id" => "237"}
+Administrador Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 237 LIMIT 1
+ +

Redirected to www.example.com/admin/237/gerenciamento Completed 302 Found in 1ms (ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/admin/237/gerenciamento” for 127.0.0.1 at 2026-06-30 14:32:57 -0300 Processing by AdminController#gerenciamento as HTML

+ +
Parameters: {"admin_id" => "237"}
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 237 LIMIT 1
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/gerenciamento.html.erb within layouts/gerenciamento
+Rendered admin/gerenciamento.html.erb within layouts/gerenciamento (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 0.3ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.4ms | ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.4ms)  SELECT `departamentos`.* FROM `departamentos` ORDER BY `departamentos`.`id` ASC LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:57.177397', 'Ciência da Computação', '2026-06-30 17:32:57.177397')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' ORDER BY `usuarios`.`id` ASC LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'admin' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@teste.com' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:57.219805', NULL, NULL, NULL, NULL, 'esquecido@unb.br', 'Doutorado', 'doc003', 'Professor Esquecido', NULL, 'token_redefinicao_456', '$2a$12$5yct.nG7EfjwvUArX.4lCuPLpcZejZuvEX3P96RAnlubwmrQX059y', 'Docente', '2026-06-30 17:32:57.219805')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started PATCH “/redefinir_senha/token_redefinicao_456” for 127.0.0.1 at 2026-06-30 14:32:57 -0300 Processing by RedefinicaoSenhasController#update as HTML

+ +
Parameters: {"senha" => "SenhaTotalmenteNova1", "senha_confirmation" => "SenhaTotalmenteNova1", "token" => "[FILTERED]"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`redefinicao_senha_token` = 'token_redefinicao_456' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.5ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'esquecido@unb.br' AND `usuarios`.`id` != 238 LIMIT 1
+Administrador Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:57.375577', NULL, NULL, NULL, 216, 'admin@teste.com', NULL, 'admin', 'Admin Teste', NULL, NULL, '$2a$12$/mtwvoP3y9JnNhp7c0GAsudPC2QrTv2w053.zj25coFfufIgL2wHq', 'Administrador', '2026-06-30 17:32:57.375577')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/admin/239/gerenciamento” for 127.0.0.1 at 2026-06-30 14:32:57 -0300 Processing by AdminController#gerenciamento as HTML

+ +
Parameters: {"admin_id" => "239"}
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 239 LIMIT 1
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/gerenciamento.html.erb within layouts/gerenciamento
+Rendered admin/gerenciamento.html.erb within layouts/gerenciamento (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 0.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.5ms | ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`codigo` = 'NAO_ESP' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'NAO_ESP' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('NAO_ESP', '2026-06-30 17:32:57.381581', 'Não especificado', '2026-06-30 17:32:57.381581')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Curso Load (0.2ms)  SELECT `cursos`.* FROM `cursos` WHERE `cursos`.`codigo` = 'TST' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Curso Exists? (0.2ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`codigo` = 'TST' LIMIT 1
+Curso Create (0.3ms)  INSERT INTO `cursos` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('TST', '2026-06-30 17:32:57.388208', 217, 'Curso Teste', '2026-06-30 17:32:57.388208')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Discente Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Discente' AND `usuarios`.`matricula` = 'USR001' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.5ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'USR001' LIMIT 1
+Usuario Exists? (0.1ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' LIMIT 1
+Discente Create (0.2ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:57.400664', 25, NULL, NULL, NULL, 'usuario@teste.com', NULL, 'USR001', 'Usuário Teste', NULL, NULL, NULL, 'Discente', '2026-06-30 17:32:57.400664')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' LIMIT 1
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' AND `usuarios`.`id` != 240 LIMIT 1
+Discente Update (0.5ms)  UPDATE `usuarios` SET `usuarios`.`definicao_senha_sent_at` = '2026-06-30 17:32:57.403925', `usuarios`.`definicao_senha_token` = 'fQS_dZBSNRwMjcGl0RqJqg9TYlzomUcbpCuqTCw4fSQ', `usuarios`.`updated_at` = '2026-06-30 17:32:57.406230' WHERE `usuarios`.`id` = 240
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Rendering layout layouts/mailer.html.erb
+Rendering usuario_mailer/definicao_senha.html.erb within layouts/mailer
+Rendered usuario_mailer/definicao_senha.html.erb within layouts/mailer (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/mailer.html.erb (Duration: 0.2ms | GC: 0.0ms)
+Rendering layout layouts/mailer.text.erb
+Rendering usuario_mailer/definicao_senha.text.erb within layouts/mailer
+Rendered usuario_mailer/definicao_senha.text.erb within layouts/mailer (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/mailer.text.erb (Duration: 0.1ms | GC: 0.0ms)
+ +

UsuarioMailer#definicao_senha: processed outbound mail in 6.0ms Delivered mail 6a43fdc9658d3_18563ea082879@MacBook-Air-de-Elvis.local.mail (6.5ms) Date: Tue, 30 Jun 2026 14:32:57 -0300 From: camaar@gmail.com To: usuario@teste.com Message-ID: <6a43fdc9658d3_18563ea082879@MacBook-Air-de-Elvis.local.mail> Subject: =?UTF-8?Q?Defini=C3=A7=C3=A3o_de_senha?= MIME-Version: 1.0 Content-Type: multipart/alternative;

+ +
boundary="--==_mimepart_6a43fdc964f86_18563ea082739";
+charset=UTF-8
+
+ +

Content-Transfer-Encoding: 7bit

+ +

—-==_mimepart_6a43fdc964f86_18563ea082739 Content-Type: text/plain;

+ +
charset=UTF-8
+
+ +

Content-Transfer-Encoding: quoted-printable

+ +

Ol=C3=A1, Usu=C3=A1rio Teste.

+ +

Para definir sua senha e acessar o sistema, acesse o link abaixo:

+ +

example.com/definir_senha/fQS_dZBSNRwMjcGl0RqJqg9TYlzomUcbpCuqTCw4= fSQ

+ +

—-==_mimepart_6a43fdc964f86_18563ea082739 Content-Type: text/html;

+ +
charset=UTF-8
+
+ +

Content-Transfer-Encoding: quoted-printable

+ +

<!DOCTYPE html> <html>

+ +
<head>
+  <meta http-equiv=3D"Content-Type" content=3D"text/html; charset=3Dutf=
+ +

-8“>

+ +
  <style>
+    /* Email styles need to be inline */
+  </style>
+</head>
+
+<body>
+  <p>Ol=C3=A1, Usu=C3=A1rio Teste.</p>
+ +

<p>Para definir sua senha e acessar o sistema, acesse o link abaixo:</p>

+ +

<p><a href=3D“example.com/definir_senha/fQS_dZBSNRwMjcGl0RqJqg9TYl= zomUcbpCuqTCw4fSQ”>example.com/definir_senha/fQS_dZBSNRwMjcGl0RqJq= g9TYlzomUcbpCuqTCw4fSQ</a></p>

+ +
</body>
+ +

</html>

+ +

—-==_mimepart_6a43fdc964f86_18563ea082739–

+ +
TRANSACTION (0.7ms)  ROLLBACK
+Docente Update (0.5ms)  UPDATE `usuarios` SET `usuarios`.`redefinicao_senha_token` = NULL, `usuarios`.`senha_hash` = '$2a$12$P/0x2mt26UdUKcNG9sXr1O1jfL4WB8Xj6zkXkFhAuRXK6nogMDPvq', `usuarios`.`updated_at` = '2026-06-30 17:32:57.420636' WHERE `usuarios`.`id` = 238
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/ Completed 302 Found in 200ms (ActiveRecord: 1.7ms (3 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.4ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Departamento' AND `departamentos`.`codigo` = 'TST' LIMIT 1
+TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'TST' LIMIT 1
+TRANSACTION (0.1ms)  BEGIN
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('TST', '2026-06-30 17:32:57.423474', 'Departamento', '2026-06-30 17:32:57.423474')
+ +

Started PATCH “/redefinir_senha/token_inexistente” for 127.0.0.1 at 2026-06-30 14:32:57 -0300

+ +
TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Processing by RedefinicaoSenhasController#update as HTML

+ +
Parameters: {"senha" => "SenhaTotalmenteNova1", "senha_confirmation" => "SenhaTotalmenteNova1", "token" => "[FILTERED]"}
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`redefinicao_senha_token` = 'token_inexistente' LIMIT 1
+ +

Redirected to www.example.com/ Completed 302 Found in 0ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '123456789' LIMIT 1
+TRANSACTION (0.1ms)  ROLLBACK
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+TRANSACTION (0.1ms)  BEGIN
+Administrador Create (0.2ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:57.425494', NULL, NULL, NULL, 218, 'admin@unb.br', NULL, '123456789', 'Admin', NULL, NULL, '123456', 'Administrador', '2026-06-30 17:32:57.425494')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc003' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'esquecido@unb.br' LIMIT 1
+ +

Started GET “/inicio” for 127.0.0.1 at 2026-06-30 14:32:57 -0300 Processing by HomeController#index as HTML

+ +
Rendering layout layouts/application.html.erb
+Rendering home/index.html.erb within layouts/application
+Rendered home/index.html.erb within layouts/application (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 3.2ms | GC: 0.0ms)
+ +

Completed 200 OK in 4ms (Views: 3.7ms | ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 0.1ms)

+ +
Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' ORDER BY `usuarios`.`id` ASC LIMIT 1
+ +

Started GET “/admin/241/templates/new” for 127.0.0.1 at 2026-06-30 14:32:57 -0300 Processing by TemplatesController#new as HTML

+ +
Parameters: {"admin_id" => "241"}
+Rendering layout layouts/gerenciamento.html.erb
+Rendering templates/new.html.erb within layouts/gerenciamento
+Template Load (0.2ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`usuario_id` = 241
+Rendered templates/_grid.html.erb (Duration: 1.0ms | GC: 0.0ms)
+Rendered templates/_form.html.erb (Duration: 2.3ms | GC: 0.1ms)
+Rendered templates/new.html.erb within layouts/gerenciamento (Duration: 4.1ms | GC: 0.1ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 4.4ms | GC: 0.1ms)
+ +

Completed 200 OK in 21ms (Views: 4.4ms | ActiveRecord: 6.9ms (1 query, 0 cached) | GC: 0.3ms) Started POST “/admin/241/templates” for 127.0.0.1 at 2026-06-30 14:32:57 -0300 Processing by TemplatesController#create as HTML

+ +
Parameters: {"template" => {"nome" => "Template Prova Matemática 2º semestre", "elementos_attributes" => {"0" => {"ordem" => "1", "_destroy" => "false", "enunciado" => "Questão desafio(1 ponto):", "campos_attributes" => {"0" => {"tipo_elemento" => "Múltipla Escolha", "ordem" => "1", "_destroy" => "false", "enunciado" => "d"}}}}}, "commit" => "Criar", "admin_id" => "241"}
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Administrador Load (0.5ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 241 LIMIT 1
+Campo Exists? (0.3ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Template Create (0.2ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:32:57.470750', 'Template Prova Matemática 2º semestre', '2026-06-30 17:32:57.470750', 241)
+Elemento Create (0.2ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:32:57.471313', 'Questão desafio(1 ponto):', 1, 42, '2026-06-30 17:32:57.471313')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:57.471713', 43, 'd', 1, 'Múltipla Escolha', '2026-06-30 17:32:57.471713')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/admin/241/templates Completed 302 Found in 5ms (ActiveRecord: 1.7ms (5 queries, 0 cached) | GC: 0.1ms) Started GET “/admin/241/templates” for 127.0.0.1 at 2026-06-30 14:32:57 -0300 Processing by TemplatesController#index as HTML

+ +
Parameters: {"admin_id" => "241"}
+Rendering layout layouts/gerenciamento.html.erb
+Rendering templates/index.html.erb within layouts/gerenciamento
+Template Exists? (0.3ms)  SELECT 1 AS one FROM `templates` WHERE `templates`.`usuario_id` = 241 LIMIT 1
+Template Load (0.3ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`usuario_id` = 241
+Elemento Load (0.3ms)  SELECT `elementos`.* FROM `elementos` WHERE `elementos`.`template_id` = 42
+Campo Load (0.2ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` = 43
+Rendered templates/_grid.html.erb (Duration: 4.3ms | GC: 0.0ms)
+Rendered templates/index.html.erb within layouts/gerenciamento (Duration: 4.4ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 4.7ms | GC: 0.0ms)
+ +

Completed 200 OK in 6ms (Views: 3.8ms | ActiveRecord: 1.0ms (4 queries, 0 cached) | GC: 0.1ms)

+ +
Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' ORDER BY `usuarios`.`id` ASC LIMIT 1
+ +

Started GET “/admin/241/templates/new” for 127.0.0.1 at 2026-06-30 14:32:57 -0300 Processing by TemplatesController#new as HTML

+ +
Parameters: {"admin_id" => "241"}
+Rendering layout layouts/gerenciamento.html.erb
+Rendering templates/new.html.erb within layouts/gerenciamento
+Rendered templates/_grid.html.erb (Duration: 0.2ms | GC: 0.0ms)
+Rendered templates/_form.html.erb (Duration: 0.4ms | GC: 0.0ms)
+Rendered templates/new.html.erb within layouts/gerenciamento (Duration: 0.7ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 0.9ms | GC: 0.0ms)
+ +

Completed 200 OK in 2ms (Views: 1.0ms | ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 0.1ms) Started POST “/admin/241/templates” for 127.0.0.1 at 2026-06-30 14:32:57 -0300 Processing by TemplatesController#create as HTML

+ +
Parameters: {"template" => {"nome" => "Template Prova Português 2º semestre", "elementos_attributes" => {"0" => {"ordem" => "1", "_destroy" => "false", "enunciado" => "Questão desafio(1 ponto):", "campos_attributes" => {"0" => {"tipo_elemento" => "Texto", "ordem" => "1", "_destroy" => "false", "enunciado" => ""}}}}}, "commit" => "Criar", "admin_id" => "241"}
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Administrador Load (0.6ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 241 LIMIT 1
+Campo Exists? (0.2ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Template Create (0.3ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:32:57.491809', 'Template Prova Português 2º semestre', '2026-06-30 17:32:57.491809', 241)
+Elemento Create (0.3ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:32:57.492406', 'Questão desafio(1 ponto):', 1, 43, '2026-06-30 17:32:57.492406')
+Campo Create (0.5ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:57.492938', 44, '', 1, 'Texto', '2026-06-30 17:32:57.492938')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/admin/241/templates Completed 302 Found in 5ms (ActiveRecord: 2.2ms (5 queries, 0 cached) | GC: 0.0ms) Started GET “/admin/241/templates” for 127.0.0.1 at 2026-06-30 14:32:57 -0300 Processing by TemplatesController#index as HTML

+ +
Parameters: {"admin_id" => "241"}
+Rendering layout layouts/gerenciamento.html.erb
+Rendering templates/index.html.erb within layouts/gerenciamento
+Template Exists? (0.2ms)  SELECT 1 AS one FROM `templates` WHERE `templates`.`usuario_id` = 241 LIMIT 1
+Template Load (0.2ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`usuario_id` = 241
+Elemento Load (0.2ms)  SELECT `elementos`.* FROM `elementos` WHERE `elementos`.`template_id` IN (42, 43)
+Campo Load (0.2ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` IN (43, 44)
+Rendered templates/_grid.html.erb (Duration: 2.0ms | GC: 0.0ms)
+Rendered templates/index.html.erb within layouts/gerenciamento (Duration: 2.0ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 2.2ms | GC: 0.0ms)
+ +

Completed 200 OK in 3ms (Views: 1.5ms | ActiveRecord: 0.9ms (4 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.3ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Departamento' AND `departamentos`.`codigo` = 'TST' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'TST' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('TST', '2026-06-30 17:32:57.501673', 'Departamento', '2026-06-30 17:32:57.501673')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Administrador Load (0.1ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '123456789' LIMIT 1
+Usuario Exists? (0.1ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.3ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:57.503307', NULL, NULL, NULL, 219, 'admin@unb.br', NULL, '123456789', 'Admin', NULL, NULL, '123456', 'Administrador', '2026-06-30 17:32:57.503307')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/inicio” for 127.0.0.1 at 2026-06-30 14:32:57 -0300 Processing by HomeController#index as HTML

+ +
Rendering layout layouts/application.html.erb
+Rendering home/index.html.erb within layouts/application
+Rendered home/index.html.erb within layouts/application (Duration: 0.0ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.3ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.5ms | ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 0.0ms)

+ +
Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' ORDER BY `usuarios`.`id` ASC LIMIT 1
+ +

Started GET “/admin/242/templates/new” for 127.0.0.1 at 2026-06-30 14:32:57 -0300 Processing by TemplatesController#new as HTML

+ +
Parameters: {"admin_id" => "242"}
+Rendering layout layouts/gerenciamento.html.erb
+Rendering templates/new.html.erb within layouts/gerenciamento
+Template Load (0.2ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`usuario_id` = 242
+Rendered templates/_grid.html.erb (Duration: 0.4ms | GC: 0.0ms)
+Rendered templates/_form.html.erb (Duration: 0.5ms | GC: 0.0ms)
+Rendered templates/new.html.erb within layouts/gerenciamento (Duration: 1.0ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 1.1ms | GC: 0.0ms)
+ +

Completed 200 OK in 2ms (Views: 1.0ms | ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started POST “/admin/242/templates” for 127.0.0.1 at 2026-06-30 14:32:57 -0300 Processing by TemplatesController#create as HTML

+ +
Parameters: {"template" => {"nome" => "", "elementos_attributes" => {"0" => {"ordem" => "1", "_destroy" => "false", "enunciado" => "Questão 1:", "campos_attributes" => {"0" => {"tipo_elemento" => "Múltipla Escolha", "ordem" => "1", "_destroy" => "false", "enunciado" => "d"}}}}}, "commit" => "Criar", "admin_id" => "242"}
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Administrador Load (0.5ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 242 LIMIT 1
+Campo Exists? (0.2ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` IS NULL LIMIT 1
+TRANSACTION (0.1ms)  ROLLBACK TO SAVEPOINT active_record_1
+Rendering layout layouts/gerenciamento.html.erb
+Rendering templates/new.html.erb within layouts/gerenciamento
+Rendered templates/_grid.html.erb (Duration: 0.1ms | GC: 0.0ms)
+Rendered templates/_form.html.erb (Duration: 0.5ms | GC: 0.0ms)
+Rendered templates/new.html.erb within layouts/gerenciamento (Duration: 0.6ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 0.8ms | GC: 0.0ms)
+ +

Completed 422 Unprocessable Content in 3ms (Views: 1.0ms | ActiveRecord: 0.9ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.3ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Departamento' AND `departamentos`.`codigo` = 'TST' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'TST' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('TST', '2026-06-30 17:32:57.521094', 'Departamento', '2026-06-30 17:32:57.521094')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '123456789' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.2ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:57.523027', NULL, NULL, NULL, 220, 'admin@unb.br', NULL, '123456789', 'Admin', NULL, NULL, '123456', 'Administrador', '2026-06-30 17:32:57.523027')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/inicio” for 127.0.0.1 at 2026-06-30 14:32:57 -0300 Processing by HomeController#index as HTML

+ +
Rendering layout layouts/application.html.erb
+Rendering home/index.html.erb within layouts/application
+Rendered home/index.html.erb within layouts/application (Duration: 0.0ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.3ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.5ms | ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 0.0ms)

+ +
Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' ORDER BY `usuarios`.`id` ASC LIMIT 1
+ +

Started GET “/admin/243/templates/new” for 127.0.0.1 at 2026-06-30 14:32:57 -0300 Processing by TemplatesController#new as HTML

+ +
Parameters: {"admin_id" => "243"}
+Rendering layout layouts/gerenciamento.html.erb
+Rendering templates/new.html.erb within layouts/gerenciamento
+Template Load (0.2ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`usuario_id` = 243
+Rendered templates/_grid.html.erb (Duration: 0.4ms | GC: 0.0ms)
+Rendered templates/_form.html.erb (Duration: 0.4ms | GC: 0.0ms)
+Rendered templates/new.html.erb within layouts/gerenciamento (Duration: 0.9ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 1.1ms | GC: 0.0ms)
+ +

Completed 200 OK in 2ms (Views: 1.0ms | ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started POST “/admin/243/templates” for 127.0.0.1 at 2026-06-30 14:32:57 -0300 Processing by TemplatesController#create as HTML

+ +
Parameters: {"template" => {"nome" => "Template Prova Matemática 2º semestre", "elementos_attributes" => {"0" => {"ordem" => "1", "_destroy" => "1", "enunciado" => "", "campos_attributes" => {"0" => {"tipo_elemento" => "Texto", "ordem" => "1", "_destroy" => "false", "enunciado" => ""}}}}}, "commit" => "Criar", "admin_id" => "243"}
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Administrador Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 243 LIMIT 1
+TRANSACTION (0.1ms)  ROLLBACK TO SAVEPOINT active_record_1
+Rendering layout layouts/gerenciamento.html.erb
+Rendering templates/new.html.erb within layouts/gerenciamento
+Rendered templates/_grid.html.erb (Duration: 0.1ms | GC: 0.0ms)
+Rendered templates/_form.html.erb (Duration: 0.2ms | GC: 0.0ms)
+Rendered templates/new.html.erb within layouts/gerenciamento (Duration: 0.4ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 0.6ms | GC: 0.0ms)
+ +

Completed 422 Unprocessable Content in 3ms (Views: 0.8ms | ActiveRecord: 0.7ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.3ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.4ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Departamento de Teste' AND `departamentos`.`codigo` = 'TST' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'TST' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('TST', '2026-06-30 17:32:57.538455', 'Departamento de Teste', '2026-06-30 17:32:57.538455')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`email` = 'professor@teste.com' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'prof001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'professor@teste.com' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:57.629404', NULL, NULL, NULL, NULL, 'esquecido@unb.br', 'Doutorado', 'doc003', 'Professor Esquecido', NULL, 'token_redefinicao_456', '$2a$12$WVbKhkq4atGkF9mEd91Y0eAVFrk5D.XfUNMm3xNzjX3NdQUb3c0qO', 'Docente', '2026-06-30 17:32:57.629404')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started PATCH “/redefinir_senha/token_redefinicao_456” for 127.0.0.1 at 2026-06-30 14:32:57 -0300 Processing by RedefinicaoSenhasController#update as HTML

+ +
Parameters: {"senha" => "SenhaNova123", "senha_confirmation" => "SenhaDiferente456", "token" => "[FILTERED]"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`redefinicao_senha_token` = 'token_redefinicao_456' LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering redefinicao_senhas/edit.html.erb within layouts/application
+Rendered redefinicao_senhas/edit.html.erb within layouts/application (Duration: 0.4ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.6ms | GC: 0.0ms)
+ +

Completed 422 Unprocessable Content in 2ms (Views: 1.3ms | ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.2ms)

+ +
TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc003' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'esquecido@unb.br' LIMIT 1
+Administrador Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:57.736233', NULL, NULL, NULL, 221, 'professor@teste.com', NULL, 'prof001', 'Professor Teste', NULL, NULL, '$2a$12$X/STQ1EKLQLoABKNP2ohUOLI8zIpu5iYzt6FwQJp5cSU6Dqy1BC/K', 'Administrador', '2026-06-30 17:32:57.736233')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Departamento de Teste' AND `departamentos`.`codigo` = 'TST' LIMIT 1
+Disciplina Load (0.3ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0001' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.1ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0001' LIMIT 1
+Disciplina Create (0.3ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0001', '2026-06-30 17:32:57.745186', 221, 'Engenharia de Software', '2026-06-30 17:32:57.745186')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`disciplina_id` = 103 AND `turmas`.`numero_da_turma` = '01' AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.2ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = '01' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 103 LIMIT 1
+Turma Create (0.3ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:32:57.753036', 103, '235M12', '01', '2026.1', '2026-06-30 17:32:57.753036')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Template Load (0.2ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`nome` = 'Avaliação Padrão' AND `templates`.`usuario_id` = 245 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Administrador Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 245 LIMIT 1
+Campo Exists? (0.2ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.2ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 2 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.2ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 3 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.2ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 4 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Template Create (0.3ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:32:57.763404', 'Avaliação Padrão', '2026-06-30 17:32:57.763404', 245)
+Elemento Create (0.2ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:32:57.763964', 'Como você avalia o professor?', 1, 44, '2026-06-30 17:32:57.763964')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:57.764388', 45, 'Ótimo', 1, 'Múltipla Escolha', '2026-06-30 17:32:57.764388')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:57.764789', 45, 'Bom', 2, 'Múltipla Escolha', '2026-06-30 17:32:57.764789')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:57.765181', 45, 'Regular', 3, 'Múltipla Escolha', '2026-06-30 17:32:57.765181')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:57.765562', 45, 'Ruim', 4, 'Múltipla Escolha', '2026-06-30 17:32:57.765562')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/admin/245/enviar_formularios” for 127.0.0.1 at 2026-06-30 14:32:57 -0300 Processing by AdminController#enviar_formularios as HTML

+ +
Parameters: {"admin_id" => "245"}
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/enviar_formularios.html.erb within layouts/gerenciamento
+Template Load (0.2ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`usuario_id` = 245
+Turma Eager Load (0.4ms)  SELECT `turmas`.`id` AS t0_r0, `turmas`.`created_at` AS t0_r1, `turmas`.`disciplina_id` AS t0_r2, `turmas`.`horario` AS t0_r3, `turmas`.`numero_da_turma` AS t0_r4, `turmas`.`semestre` AS t0_r5, `turmas`.`updated_at` AS t0_r6, `disciplinas`.`id` AS t1_r0, `disciplinas`.`codigo` AS t1_r1, `disciplinas`.`created_at` AS t1_r2, `disciplinas`.`departamento_id` AS t1_r3, `disciplinas`.`nome` AS t1_r4, `disciplinas`.`updated_at` AS t1_r5 FROM `turmas` INNER JOIN `disciplinas` ON `disciplinas`.`id` = `turmas`.`disciplina_id` ORDER BY disciplinas.nome, turmas.semestre
+Rendered admin/enviar_formularios.html.erb within layouts/gerenciamento (Duration: 3.4ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 3.6ms | GC: 0.0ms)
+ +

Completed 200 OK in 5ms (Views: 3.2ms | ActiveRecord: 0.6ms (2 queries, 0 cached) | GC: 0.3ms) Started POST “/admin/245/enviar_formularios” for 127.0.0.1 at 2026-06-30 14:32:57 -0300 Processing by AdminController#enviar_formularios as HTML

+ +
Parameters: {"template_id" => "44", "turma_ids" => ["95"], "commit" => "Criar Formulário", "admin_id" => "245"}
+Template Load (0.2ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`id` = 44 LIMIT 1
+Elemento Load (0.2ms)  SELECT `elementos`.* FROM `elementos` WHERE `elementos`.`template_id` = 44
+Campo Load (0.2ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` = 45
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`id` = 95
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`id` = 103 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:32:57.782427', NULL, NULL, NULL, 'Engenharia de Software - 2026.1', 95, '2026-06-30 17:32:57.782427')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.5ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:32:57.788271', 'Como você avalia o professor?', 81, 1, 'Múltipla Escolha', '2026-06-30 17:32:57.788271')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+CampoForm Create (0.7ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:57.793412', 50, 'Ótimo', 1, NULL, '2026-06-30 17:32:57.793412')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.4ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:57.794566', 50, 'Bom', 2, NULL, '2026-06-30 17:32:57.794566')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.4ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:57.795466', 50, 'Regular', 3, NULL, '2026-06-30 17:32:57.795466')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.4ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:57.796359', 50, 'Ruim', 4, NULL, '2026-06-30 17:32:57.796359')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/admin/245/gerenciamento Completed 302 Found in 22ms (ActiveRecord: 11.7ms (11 queries, 0 cached) | GC: 0.7ms) Started GET “/admin/245/gerenciamento” for 127.0.0.1 at 2026-06-30 14:32:57 -0300 Processing by AdminController#gerenciamento as HTML

+ +
Parameters: {"admin_id" => "245"}
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/gerenciamento.html.erb within layouts/gerenciamento
+Rendered admin/gerenciamento.html.erb within layouts/gerenciamento (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 0.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.5ms | ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 0.1ms)

+ +
Formulario Load (0.2ms)  SELECT `formularios`.* FROM `formularios` WHERE `formularios`.`turma_id` = 95 LIMIT 1
+ElementoForm Count (0.1ms)  SELECT COUNT(*) FROM `elemento_forms` WHERE `elemento_forms`.`formulario_id` = 81
+Elemento Count (0.2ms)  SELECT COUNT(*) FROM `elementos` WHERE `elementos`.`template_id` = 44
+TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Departamento de Teste' AND `departamentos`.`codigo` = 'TST' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'TST' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('TST', '2026-06-30 17:32:57.804324', 'Departamento de Teste', '2026-06-30 17:32:57.804324')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Administrador Load (0.1ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`email` = 'professor@teste.com' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'prof001' LIMIT 1
+Usuario Exists? (0.1ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'professor@teste.com' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:57.833714', NULL, NULL, NULL, NULL, 'esquecido@unb.br', 'Doutorado', 'doc003', 'Professor Esquecido', NULL, 'token_redefinicao_456', '$2a$12$sO1RFPA5C.aXE.jBJz.j0exYgfeT4kEsuGSSkIRud/FFsLimXMwFG', 'Docente', '2026-06-30 17:32:57.833714')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started PATCH “/redefinir_senha/token_redefinicao_456” for 127.0.0.1 at 2026-06-30 14:32:57 -0300 Processing by RedefinicaoSenhasController#update as HTML

+ +
Parameters: {"senha" => "abc", "senha_confirmation" => "abc", "token" => "[FILTERED]"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`redefinicao_senha_token` = 'token_redefinicao_456' LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering redefinicao_senhas/edit.html.erb within layouts/application
+Rendered redefinicao_senhas/edit.html.erb within layouts/application (Duration: 0.2ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.4ms | GC: 0.0ms)
+ +

Completed 422 Unprocessable Content in 1ms (Views: 0.8ms | ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.2ms)

+ +
TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc003' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'esquecido@unb.br' LIMIT 1
+Administrador Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:58.003542', NULL, NULL, NULL, 222, 'professor@teste.com', NULL, 'prof001', 'Professor Teste', NULL, NULL, '$2a$12$0I.xlYnfmBXHbF93EvXzX.sbHbDP9fBLEUr1ob/Idh7wO9hBbW50a', 'Administrador', '2026-06-30 17:32:58.003542')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Departamento de Teste' AND `departamentos`.`codigo` = 'TST' LIMIT 1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0001' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.4ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0001' LIMIT 1
+Disciplina Create (0.3ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0001', '2026-06-30 17:32:58.007287', 222, 'Engenharia de Software', '2026-06-30 17:32:58.007287')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`disciplina_id` = 104 AND `turmas`.`numero_da_turma` = '01' AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = '01' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 104 LIMIT 1
+Turma Create (0.3ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:32:58.009046', 104, '235M12', '01', '2026.1', '2026-06-30 17:32:58.009046')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Template Load (0.2ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`nome` = 'Avaliação Padrão' AND `templates`.`usuario_id` = 247 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Administrador Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 247 LIMIT 1
+Campo Exists? (0.2ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.1ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 2 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.2ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 3 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.2ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 4 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Template Create (0.2ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:32:58.012402', 'Avaliação Padrão', '2026-06-30 17:32:58.012402', 247)
+Elemento Create (0.2ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:32:58.012808', 'Como você avalia o professor?', 1, 45, '2026-06-30 17:32:58.012808')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.013271', 46, 'Ótimo', 1, 'Múltipla Escolha', '2026-06-30 17:32:58.013271')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.013653', 46, 'Bom', 2, 'Múltipla Escolha', '2026-06-30 17:32:58.013653')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.014024', 46, 'Regular', 3, 'Múltipla Escolha', '2026-06-30 17:32:58.014024')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.014386', 46, 'Ruim', 4, 'Múltipla Escolha', '2026-06-30 17:32:58.014386')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/admin/247/enviar_formularios” for 127.0.0.1 at 2026-06-30 14:32:58 -0300 Processing by AdminController#enviar_formularios as HTML

+ +
Parameters: {"admin_id" => "247"}
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/enviar_formularios.html.erb within layouts/gerenciamento
+Template Load (0.1ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`usuario_id` = 247
+Turma Eager Load (0.2ms)  SELECT `turmas`.`id` AS t0_r0, `turmas`.`created_at` AS t0_r1, `turmas`.`disciplina_id` AS t0_r2, `turmas`.`horario` AS t0_r3, `turmas`.`numero_da_turma` AS t0_r4, `turmas`.`semestre` AS t0_r5, `turmas`.`updated_at` AS t0_r6, `disciplinas`.`id` AS t1_r0, `disciplinas`.`codigo` AS t1_r1, `disciplinas`.`created_at` AS t1_r2, `disciplinas`.`departamento_id` AS t1_r3, `disciplinas`.`nome` AS t1_r4, `disciplinas`.`updated_at` AS t1_r5 FROM `turmas` INNER JOIN `disciplinas` ON `disciplinas`.`id` = `turmas`.`disciplina_id` ORDER BY disciplinas.nome, turmas.semestre
+Rendered admin/enviar_formularios.html.erb within layouts/gerenciamento (Duration: 0.9ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 1.1ms | GC: 0.0ms)
+ +

Completed 200 OK in 2ms (Views: 0.9ms | ActiveRecord: 0.4ms (2 queries, 0 cached) | GC: 0.0ms) Started POST “/admin/247/enviar_formularios” for 127.0.0.1 at 2026-06-30 14:32:58 -0300 Processing by AdminController#enviar_formularios as HTML

+ +
Parameters: {"template_id" => "", "turma_ids" => ["96"], "commit" => "Criar Formulário", "admin_id" => "247"}
+ +

Redirected to www.example.com/admin/247/enviar_formularios Completed 302 Found in 1ms (ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 0.1ms) Started GET “/admin/247/enviar_formularios” for 127.0.0.1 at 2026-06-30 14:32:58 -0300 Processing by AdminController#enviar_formularios as HTML

+ +
Parameters: {"admin_id" => "247"}
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/enviar_formularios.html.erb within layouts/gerenciamento
+Template Load (0.2ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`usuario_id` = 247
+Turma Eager Load (0.3ms)  SELECT `turmas`.`id` AS t0_r0, `turmas`.`created_at` AS t0_r1, `turmas`.`disciplina_id` AS t0_r2, `turmas`.`horario` AS t0_r3, `turmas`.`numero_da_turma` AS t0_r4, `turmas`.`semestre` AS t0_r5, `turmas`.`updated_at` AS t0_r6, `disciplinas`.`id` AS t1_r0, `disciplinas`.`codigo` AS t1_r1, `disciplinas`.`created_at` AS t1_r2, `disciplinas`.`departamento_id` AS t1_r3, `disciplinas`.`nome` AS t1_r4, `disciplinas`.`updated_at` AS t1_r5 FROM `turmas` INNER JOIN `disciplinas` ON `disciplinas`.`id` = `turmas`.`disciplina_id` ORDER BY disciplinas.nome, turmas.semestre
+Rendered admin/enviar_formularios.html.erb within layouts/gerenciamento (Duration: 1.0ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 1.2ms | GC: 0.0ms)
+ +

Completed 200 OK in 2ms (Views: 0.8ms | ActiveRecord: 0.5ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Departamento de Teste' AND `departamentos`.`codigo` = 'TST' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.2ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'TST' LIMIT 1
+Departamento Create (0.1ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('TST', '2026-06-30 17:32:58.025331', 'Departamento de Teste', '2026-06-30 17:32:58.025331')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Administrador Load (0.1ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`email` = 'professor@teste.com' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'prof001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'professor@teste.com' LIMIT 1
+Docente Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:58.038685', NULL, NULL, NULL, NULL, 'esquecido@unb.br', 'Doutorado', 'doc003', 'Professor Esquecido', NULL, 'token_redefinicao_456', '$2a$12$rPKYa4koDQOV0jI9Lrt.2.P6F642VlVHU6EpWSITND93n9SJqGjB2', 'Docente', '2026-06-30 17:32:58.038685')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started PATCH “/redefinir_senha/token_redefinicao_456” for 127.0.0.1 at 2026-06-30 14:32:58 -0300 Processing by RedefinicaoSenhasController#update as HTML

+ +
Parameters: {"senha" => "SenhaTotalmenteNova1", "senha_confirmation" => "SenhaTotalmenteNova1", "token" => "[FILTERED]"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`redefinicao_senha_token` = 'token_redefinicao_456' LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering redefinicao_senhas/edit.html.erb within layouts/application
+Rendered redefinicao_senhas/edit.html.erb within layouts/application (Duration: 0.2ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.6ms | GC: 0.2ms)
+ +

Completed 422 Unprocessable Content in 2ms (Views: 0.8ms | ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.2ms)

+ +
TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:58.044543', 'Ciência da Computação', '2026-06-30 17:32:58.044543')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:58.223158', NULL, NULL, NULL, 223, 'professor@teste.com', NULL, 'prof001', 'Professor Teste', NULL, NULL, '$2a$12$kyHJUpGhU6t4.cIKfLkVGefwGztH/OpQx7sWuJLvS.dlFwz0oQ6Vm', 'Administrador', '2026-06-30 17:32:58.223158')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Departamento de Teste' AND `departamentos`.`codigo` = 'TST' LIMIT 1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0001' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.4ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0001' LIMIT 1
+Disciplina Create (0.3ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0001', '2026-06-30 17:32:58.226920', 223, 'Engenharia de Software', '2026-06-30 17:32:58.226920')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`disciplina_id` = 105 AND `turmas`.`numero_da_turma` = '01' AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = '01' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 105 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:32:58.228632', 105, '235M12', '01', '2026.1', '2026-06-30 17:32:58.228632')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Template Load (0.2ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`nome` = 'Avaliação Padrão' AND `templates`.`usuario_id` = 249 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Administrador Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 249 LIMIT 1
+Campo Exists? (0.2ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.2ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 2 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.2ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 3 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.2ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 4 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Template Create (0.2ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:32:58.231985', 'Avaliação Padrão', '2026-06-30 17:32:58.231985', 249)
+Elemento Create (0.2ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:32:58.232386', 'Como você avalia o professor?', 1, 46, '2026-06-30 17:32:58.232386')
+Campo Create (0.1ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.232815', 47, 'Ótimo', 1, 'Múltipla Escolha', '2026-06-30 17:32:58.232815')
+Campo Create (0.1ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.233165', 47, 'Bom', 2, 'Múltipla Escolha', '2026-06-30 17:32:58.233165')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.233459', 47, 'Regular', 3, 'Múltipla Escolha', '2026-06-30 17:32:58.233459')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.233835', 47, 'Ruim', 4, 'Múltipla Escolha', '2026-06-30 17:32:58.233835')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/admin/249/enviar_formularios” for 127.0.0.1 at 2026-06-30 14:32:58 -0300 Processing by AdminController#enviar_formularios as HTML

+ +
Parameters: {"admin_id" => "249"}
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/enviar_formularios.html.erb within layouts/gerenciamento
+Template Load (0.2ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`usuario_id` = 249
+Turma Eager Load (0.3ms)  SELECT `turmas`.`id` AS t0_r0, `turmas`.`created_at` AS t0_r1, `turmas`.`disciplina_id` AS t0_r2, `turmas`.`horario` AS t0_r3, `turmas`.`numero_da_turma` AS t0_r4, `turmas`.`semestre` AS t0_r5, `turmas`.`updated_at` AS t0_r6, `disciplinas`.`id` AS t1_r0, `disciplinas`.`codigo` AS t1_r1, `disciplinas`.`created_at` AS t1_r2, `disciplinas`.`departamento_id` AS t1_r3, `disciplinas`.`nome` AS t1_r4, `disciplinas`.`updated_at` AS t1_r5 FROM `turmas` INNER JOIN `disciplinas` ON `disciplinas`.`id` = `turmas`.`disciplina_id` ORDER BY disciplinas.nome, turmas.semestre
+Rendered admin/enviar_formularios.html.erb within layouts/gerenciamento (Duration: 1.3ms | GC: 0.1ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 1.5ms | GC: 0.1ms)
+ +

Completed 200 OK in 2ms (Views: 1.0ms | ActiveRecord: 0.6ms (2 queries, 0 cached) | GC: 0.1ms) Started POST “/admin/249/enviar_formularios” for 127.0.0.1 at 2026-06-30 14:32:58 -0300 Processing by AdminController#enviar_formularios as HTML

+ +
Parameters: {"template_id" => "46", "commit" => "Criar Formulário", "admin_id" => "249"}
+ +

Redirected to www.example.com/admin/249/enviar_formularios Completed 302 Found in 0ms (ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 0.0ms) Started GET “/admin/249/enviar_formularios” for 127.0.0.1 at 2026-06-30 14:32:58 -0300 Processing by AdminController#enviar_formularios as HTML

+ +
Parameters: {"admin_id" => "249"}
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/enviar_formularios.html.erb within layouts/gerenciamento
+Template Load (0.2ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`usuario_id` = 249
+Turma Eager Load (0.3ms)  SELECT `turmas`.`id` AS t0_r0, `turmas`.`created_at` AS t0_r1, `turmas`.`disciplina_id` AS t0_r2, `turmas`.`horario` AS t0_r3, `turmas`.`numero_da_turma` AS t0_r4, `turmas`.`semestre` AS t0_r5, `turmas`.`updated_at` AS t0_r6, `disciplinas`.`id` AS t1_r0, `disciplinas`.`codigo` AS t1_r1, `disciplinas`.`created_at` AS t1_r2, `disciplinas`.`departamento_id` AS t1_r3, `disciplinas`.`nome` AS t1_r4, `disciplinas`.`updated_at` AS t1_r5 FROM `turmas` INNER JOIN `disciplinas` ON `disciplinas`.`id` = `turmas`.`disciplina_id` ORDER BY disciplinas.nome, turmas.semestre
+Rendered admin/enviar_formularios.html.erb within layouts/gerenciamento (Duration: 1.0ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 1.2ms | GC: 0.0ms)
+ +

Completed 200 OK in 2ms (Views: 0.9ms | ActiveRecord: 0.5ms (2 queries, 0 cached) | GC: 0.1ms)

+ +
Administrador Create (0.2ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:58.242149', NULL, NULL, NULL, 224, 'admin@unb.br', NULL, 'adm001', 'Admin Teste', NULL, NULL, '$2a$12$Kl0UEqeTtDrZQSUi8FeLG.7CHt9swHokLDfvE5idu8NIPjmDCxU2q', 'Administrador', '2026-06-30 17:32:58.242149')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.6ms)  ROLLBACK
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.1ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Departamento' AND `departamentos`.`codigo` = 'TST' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'TST' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('TST', '2026-06-30 17:32:58.245373', 'Departamento', '2026-06-30 17:32:58.245373')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '123456789' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.3ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:58.247089', NULL, NULL, NULL, 225, 'admin@unb.br', NULL, '123456789', 'Admin', NULL, NULL, '123456', 'Administrador', '2026-06-30 17:32:58.247089')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Campo Exists? (0.3ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.1ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 2 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.1ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 3 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.1ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 4 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.2ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.1ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 2 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.1ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 3 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.1ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 4 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.1ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 5 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.1ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Template Create (0.2ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:32:58.253001', 'Avaliação Padrão', '2026-06-30 17:32:58.253001', 251)
+Elemento Create (0.2ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:32:58.253482', 'Como você avalia o professor?', 1, 47, '2026-06-30 17:32:58.253482')
+Campo Create (0.1ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.253979', 48, 'Ótimo', 1, 'Múltipla Escolha', '2026-06-30 17:32:58.253979')
+Campo Create (0.1ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.254436', 48, 'Bom', 2, 'Múltipla Escolha', '2026-06-30 17:32:58.254436')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.254702', 48, 'Regular', 3, 'Múltipla Escolha', '2026-06-30 17:32:58.254702')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.255044', 48, 'Ruim', 4, 'Múltipla Escolha', '2026-06-30 17:32:58.255044')
+Elemento Create (0.2ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:32:58.255411', 'Qual seu nível de satisfação?', 2, 47, '2026-06-30 17:32:58.255411')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.255777', 49, '1', 1, 'Escala', '2026-06-30 17:32:58.255777')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.256137', 49, '2', 2, 'Escala', '2026-06-30 17:32:58.256137')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.256491', 49, '3', 3, 'Escala', '2026-06-30 17:32:58.256491')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.256853', 49, '4', 4, 'Escala', '2026-06-30 17:32:58.256853')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.257207', 49, '5', 5, 'Escala', '2026-06-30 17:32:58.257207')
+Elemento Create (0.2ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:32:58.257634', 'Deixe seu comentário', 3, 47, '2026-06-30 17:32:58.257634')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.258052', 50, NULL, 1, 'Texto', '2026-06-30 17:32:58.258052')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Departamento' AND `departamentos`.`codigo` = 'TST' LIMIT 1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'TEC001' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.4ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'TEC001' LIMIT 1
+Disciplina Create (0.3ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('TEC001', '2026-06-30 17:32:58.260316', 225, 'Matemática', '2026-06-30 17:32:58.260316')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`disciplina_id` = 106 AND `turmas`.`numero_da_turma` = 'A' AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'A' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 106 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:32:58.261947', 106, 'Seg 08:00-10:00', 'A', '2026.1', '2026-06-30 17:32:58.261947')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'TEC002' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.4ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'TEC002' LIMIT 1
+Disciplina Create (0.1ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('TEC002', '2026-06-30 17:32:58.263379', 225, 'Português', '2026-06-30 17:32:58.263379')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.1ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`disciplina_id` = 107 AND `turmas`.`numero_da_turma` = 'B' AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.3ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'B' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 107 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:32:58.264607', 107, 'Seg 08:00-10:00', 'B', '2026.1', '2026-06-30 17:32:58.264607')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'TEC003' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'TEC003' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('TEC003', '2026-06-30 17:32:58.265890', 225, 'História', '2026-06-30 17:32:58.265890')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.1ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`disciplina_id` = 108 AND `turmas`.`numero_da_turma` = 'A' AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.3ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'A' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 108 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:32:58.267224', 108, 'Seg 08:00-10:00', 'A', '2026.1', '2026-06-30 17:32:58.267224')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/admin/251/enviar_formularios” for 127.0.0.1 at 2026-06-30 14:32:58 -0300 Processing by AdminController#enviar_formularios as HTML

+ +
Parameters: {"admin_id" => "251"}
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/enviar_formularios.html.erb within layouts/gerenciamento
+Template Load (0.2ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`usuario_id` = 251
+Turma Eager Load (0.2ms)  SELECT `turmas`.`id` AS t0_r0, `turmas`.`created_at` AS t0_r1, `turmas`.`disciplina_id` AS t0_r2, `turmas`.`horario` AS t0_r3, `turmas`.`numero_da_turma` AS t0_r4, `turmas`.`semestre` AS t0_r5, `turmas`.`updated_at` AS t0_r6, `disciplinas`.`id` AS t1_r0, `disciplinas`.`codigo` AS t1_r1, `disciplinas`.`created_at` AS t1_r2, `disciplinas`.`departamento_id` AS t1_r3, `disciplinas`.`nome` AS t1_r4, `disciplinas`.`updated_at` AS t1_r5 FROM `turmas` INNER JOIN `disciplinas` ON `disciplinas`.`id` = `turmas`.`disciplina_id` ORDER BY disciplinas.nome, turmas.semestre
+Rendered admin/enviar_formularios.html.erb within layouts/gerenciamento (Duration: 1.2ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 1.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 2ms (Views: 1.2ms | ActiveRecord: 0.3ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'TEC001' AND `disciplinas`.`nome` = 'Matemática' LIMIT 1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`disciplina_id` = 106 AND `turmas`.`numero_da_turma` = 'A' LIMIT 1
+ +

Started POST “/admin/251/enviar_formularios” for 127.0.0.1 at 2026-06-30 14:32:58 -0300 Processing by AdminController#enviar_formularios as HTML

+ +
Parameters: {"template_id" => "47", "turma_ids" => ["98"], "commit" => "Criar Formulário", "admin_id" => "251"}
+Template Load (0.2ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`id` = 47 LIMIT 1
+Elemento Load (0.2ms)  SELECT `elementos`.* FROM `elementos` WHERE `elementos`.`template_id` = 47
+Campo Load (0.3ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` IN (48, 49, 50)
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`id` = 98
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`id` = 106 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:32:58.277100', NULL, NULL, NULL, 'Matemática - 2026.1', 98, '2026-06-30 17:32:58.277100')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:32:58.278201', 'Como você avalia o professor?', 82, 1, 'Múltipla Escolha', '2026-06-30 17:32:58.278201')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.3ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.279094', 51, 'Ótimo', 1, NULL, '2026-06-30 17:32:58.279094')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.3ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.279904', 51, 'Bom', 2, NULL, '2026-06-30 17:32:58.279904')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.3ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.280683', 51, 'Regular', 3, NULL, '2026-06-30 17:32:58.280683')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.4ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.281473', 51, 'Ruim', 4, NULL, '2026-06-30 17:32:58.281473')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.3ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:32:58.282329', 'Qual seu nível de satisfação?', 82, 2, 'Escala', '2026-06-30 17:32:58.282329')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.2ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.283262', 52, '1', 1, NULL, '2026-06-30 17:32:58.283262')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.3ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.283877', 52, '2', 2, NULL, '2026-06-30 17:32:58.283877')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.3ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.284688', 52, '3', 3, NULL, '2026-06-30 17:32:58.284688')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.3ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.285688', 52, '4', 4, NULL, '2026-06-30 17:32:58.285688')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.2ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.286447', 52, '5', 5, NULL, '2026-06-30 17:32:58.286447')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.3ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:32:58.287202', 'Deixe seu comentário', 82, 3, 'Texto', '2026-06-30 17:32:58.287202')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/admin/251/gerenciamento Completed 302 Found in 14ms (ActiveRecord: 8.1ms (18 queries, 0 cached) | GC: 0.0ms) Started GET “/admin/251/gerenciamento” for 127.0.0.1 at 2026-06-30 14:32:58 -0300 Processing by AdminController#gerenciamento as HTML

+ +
Parameters: {"admin_id" => "251"}
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/gerenciamento.html.erb within layouts/gerenciamento
+Rendered admin/gerenciamento.html.erb within layouts/gerenciamento (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 0.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.5ms | ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 0.0ms)

+ +
Template Load (0.2ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`nome` = 'Avaliação Padrão' LIMIT 1
+Formulario Load (0.2ms)  SELECT `formularios`.* FROM `formularios` ORDER BY `formularios`.`id` DESC LIMIT 1
+ElementoForm Count (0.2ms)  SELECT COUNT(*) FROM `elemento_forms` WHERE `elemento_forms`.`formulario_id` = 82
+Elemento Count (0.2ms)  SELECT COUNT(*) FROM `elementos` WHERE `elementos`.`template_id` = 47
+ElementoForm Load (0.2ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`formulario_id` = 82 ORDER BY `elemento_forms`.`ordem` ASC
+Elemento Load (0.3ms)  SELECT `elementos`.* FROM `elementos` WHERE `elementos`.`template_id` = 47 ORDER BY `elementos`.`ordem` ASC
+Elemento Load (0.3ms)  SELECT `elementos`.* FROM `elementos` WHERE `elementos`.`template_id` = 47 ORDER BY `elementos`.`ordem` ASC
+Elemento Load (0.2ms)  SELECT `elementos`.* FROM `elementos` WHERE `elementos`.`template_id` = 47 ORDER BY `elementos`.`ordem` ASC
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Matemática' LIMIT 1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`disciplina_id` = 106 AND `turmas`.`numero_da_turma` = 'A' LIMIT 1
+Formulario Load (0.2ms)  SELECT `formularios`.* FROM `formularios` ORDER BY `formularios`.`id` DESC LIMIT 1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`id` = 98 LIMIT 1
+TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Departamento' AND `departamentos`.`codigo` = 'TST' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'TST' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('TST', '2026-06-30 17:32:58.297851', 'Departamento', '2026-06-30 17:32:58.297851')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '123456789' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.2ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:58.299618', NULL, NULL, NULL, 226, 'admin@unb.br', NULL, '123456789', 'Admin', NULL, NULL, '123456', 'Administrador', '2026-06-30 17:32:58.299618')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Campo Exists? (0.3ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.1ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 2 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.1ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 3 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.1ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 4 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.1ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.1ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 2 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.1ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 3 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.1ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 4 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.1ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 5 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.1ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Template Create (0.2ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:32:58.305917', 'Avaliação Padrão', '2026-06-30 17:32:58.305917', 252)
+Elemento Create (0.2ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:32:58.306368', 'Como você avalia o professor?', 1, 48, '2026-06-30 17:32:58.306368')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.306748', 51, 'Ótimo', 1, 'Múltipla Escolha', '2026-06-30 17:32:58.306748')
+Campo Create (0.3ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.307165', 51, 'Bom', 2, 'Múltipla Escolha', '2026-06-30 17:32:58.307165')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.307597', 51, 'Regular', 3, 'Múltipla Escolha', '2026-06-30 17:32:58.307597')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.307970', 51, 'Ruim', 4, 'Múltipla Escolha', '2026-06-30 17:32:58.307970')
+Elemento Create (0.2ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:32:58.308345', 'Qual seu nível de satisfação?', 2, 48, '2026-06-30 17:32:58.308345')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.308713', 52, '1', 1, 'Escala', '2026-06-30 17:32:58.308713')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.309067', 52, '2', 2, 'Escala', '2026-06-30 17:32:58.309067')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.309414', 52, '3', 3, 'Escala', '2026-06-30 17:32:58.309414')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.309768', 52, '4', 4, 'Escala', '2026-06-30 17:32:58.309768')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.310176', 52, '5', 5, 'Escala', '2026-06-30 17:32:58.310176')
+Elemento Create (0.2ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:32:58.310569', 'Deixe seu comentário', 3, 48, '2026-06-30 17:32:58.310569')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.310995', 53, NULL, 1, 'Texto', '2026-06-30 17:32:58.310995')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Departamento' AND `departamentos`.`codigo` = 'TST' LIMIT 1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'TEC001' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'TEC001' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('TEC001', '2026-06-30 17:32:58.312905', 226, 'Matemática', '2026-06-30 17:32:58.312905')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`disciplina_id` = 109 AND `turmas`.`numero_da_turma` = 'A' AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.3ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'A' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 109 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:32:58.314426', 109, 'Seg 08:00-10:00', 'A', '2026.1', '2026-06-30 17:32:58.314426')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'TEC002' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'TEC002' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('TEC002', '2026-06-30 17:32:58.315723', 226, 'Português', '2026-06-30 17:32:58.315723')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.1ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`disciplina_id` = 110 AND `turmas`.`numero_da_turma` = 'B' AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.2ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'B' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 110 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:32:58.316972', 110, 'Seg 08:00-10:00', 'B', '2026.1', '2026-06-30 17:32:58.316972')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'TEC003' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'TEC003' LIMIT 1
+Disciplina Create (0.1ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('TEC003', '2026-06-30 17:32:58.318368', 226, 'História', '2026-06-30 17:32:58.318368')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.1ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`disciplina_id` = 111 AND `turmas`.`numero_da_turma` = 'A' AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.2ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'A' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 111 LIMIT 1
+Turma Create (0.1ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:32:58.319634', 111, 'Seg 08:00-10:00', 'A', '2026.1', '2026-06-30 17:32:58.319634')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/admin/252/enviar_formularios” for 127.0.0.1 at 2026-06-30 14:32:58 -0300 Processing by AdminController#enviar_formularios as HTML

+ +
Parameters: {"admin_id" => "252"}
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/enviar_formularios.html.erb within layouts/gerenciamento
+Template Load (0.2ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`usuario_id` = 252
+Turma Eager Load (0.4ms)  SELECT `turmas`.`id` AS t0_r0, `turmas`.`created_at` AS t0_r1, `turmas`.`disciplina_id` AS t0_r2, `turmas`.`horario` AS t0_r3, `turmas`.`numero_da_turma` AS t0_r4, `turmas`.`semestre` AS t0_r5, `turmas`.`updated_at` AS t0_r6, `disciplinas`.`id` AS t1_r0, `disciplinas`.`codigo` AS t1_r1, `disciplinas`.`created_at` AS t1_r2, `disciplinas`.`departamento_id` AS t1_r3, `disciplinas`.`nome` AS t1_r4, `disciplinas`.`updated_at` AS t1_r5 FROM `turmas` INNER JOIN `disciplinas` ON `disciplinas`.`id` = `turmas`.`disciplina_id` ORDER BY disciplinas.nome, turmas.semestre
+Rendered admin/enviar_formularios.html.erb within layouts/gerenciamento (Duration: 1.2ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 1.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 2ms (Views: 1.0ms | ActiveRecord: 0.6ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'TEC001' AND `disciplinas`.`nome` = 'Matemática' LIMIT 1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`disciplina_id` = 109 AND `turmas`.`numero_da_turma` = 'A' LIMIT 1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'TEC002' AND `disciplinas`.`nome` = 'Português' LIMIT 1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`disciplina_id` = 110 AND `turmas`.`numero_da_turma` = 'B' LIMIT 1
+ +

Started POST “/admin/252/enviar_formularios” for 127.0.0.1 at 2026-06-30 14:32:58 -0300 Processing by AdminController#enviar_formularios as HTML

+ +
Parameters: {"template_id" => "48", "turma_ids" => ["101", "102"], "commit" => "Criar Formulário", "admin_id" => "252"}
+Template Load (0.3ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`id` = 48 LIMIT 1
+Elemento Load (0.2ms)  SELECT `elementos`.* FROM `elementos` WHERE `elementos`.`template_id` = 48
+Campo Load (0.3ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` IN (51, 52, 53)
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`id` IN (101, 102)
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`id` = 109 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.3ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:32:58.329179', NULL, NULL, NULL, 'Matemática - 2026.1', 101, '2026-06-30 17:32:58.329179')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.3ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:32:58.330115', 'Como você avalia o professor?', 83, 1, 'Múltipla Escolha', '2026-06-30 17:32:58.330115')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.4ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.330988', 54, 'Ótimo', 1, NULL, '2026-06-30 17:32:58.330988')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.3ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.331809', 54, 'Bom', 2, NULL, '2026-06-30 17:32:58.331809')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.2ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.332633', 54, 'Regular', 3, NULL, '2026-06-30 17:32:58.332633')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.2ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.333263', 54, 'Ruim', 4, NULL, '2026-06-30 17:32:58.333263')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.2ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:32:58.334062', 'Qual seu nível de satisfação?', 83, 2, 'Escala', '2026-06-30 17:32:58.334062')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.3ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.334739', 55, '1', 1, NULL, '2026-06-30 17:32:58.334739')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.4ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.336020', 55, '2', 2, NULL, '2026-06-30 17:32:58.336020')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.4ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.336827', 55, '3', 3, NULL, '2026-06-30 17:32:58.336827')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.4ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.337668', 55, '4', 4, NULL, '2026-06-30 17:32:58.337668')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.3ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.338430', 55, '5', 5, NULL, '2026-06-30 17:32:58.338430')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.3ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:32:58.339225', 'Deixe seu comentário', 83, 3, 'Texto', '2026-06-30 17:32:58.339225')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`id` = 110 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:32:58.340400', NULL, NULL, NULL, 'Português - 2026.1', 102, '2026-06-30 17:32:58.340400')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:32:58.341267', 'Como você avalia o professor?', 84, 1, 'Múltipla Escolha', '2026-06-30 17:32:58.341267')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.3ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.342095', 57, 'Ótimo', 1, NULL, '2026-06-30 17:32:58.342095')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.5ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.342881', 57, 'Bom', 2, NULL, '2026-06-30 17:32:58.342881')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.4ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.343836', 57, 'Regular', 3, NULL, '2026-06-30 17:32:58.343836')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.3ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.344637', 57, 'Ruim', 4, NULL, '2026-06-30 17:32:58.344637')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.3ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:32:58.345425', 'Qual seu nível de satisfação?', 84, 2, 'Escala', '2026-06-30 17:32:58.345425')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.3ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.346256', 58, '1', 1, NULL, '2026-06-30 17:32:58.346256')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.3ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.347022', 58, '2', 2, NULL, '2026-06-30 17:32:58.347022')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.3ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.347789', 58, '3', 3, NULL, '2026-06-30 17:32:58.347789')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.3ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.348557', 58, '4', 4, NULL, '2026-06-30 17:32:58.348557')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.4ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.349321', 58, '5', 5, NULL, '2026-06-30 17:32:58.349321')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.2ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:32:58.350351', 'Deixe seu comentário', 84, 3, 'Texto', '2026-06-30 17:32:58.350351')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/admin/252/gerenciamento Completed 302 Found in 25ms (ActiveRecord: 15.4ms (32 queries, 0 cached) | GC: 0.0ms) Started GET “/admin/252/gerenciamento” for 127.0.0.1 at 2026-06-30 14:32:58 -0300 Processing by AdminController#gerenciamento as HTML

+ +
Parameters: {"admin_id" => "252"}
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/gerenciamento.html.erb within layouts/gerenciamento
+Rendered admin/gerenciamento.html.erb within layouts/gerenciamento (Duration: 0.2ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 0.5ms | GC: 0.0ms)
+ +

Completed 200 OK in 6ms (Views: 6.1ms | ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 5.4ms)

+ +
Disciplina Load (0.4ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Matemática' LIMIT 1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`disciplina_id` = 109 AND `turmas`.`numero_da_turma` = 'A' LIMIT 1
+Formulario Exists? (0.2ms)  SELECT 1 AS one FROM `formularios` WHERE `formularios`.`turma_id` = 101 LIMIT 1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Português' LIMIT 1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`disciplina_id` = 110 AND `turmas`.`numero_da_turma` = 'B' LIMIT 1
+Formulario Exists? (0.2ms)  SELECT 1 AS one FROM `formularios` WHERE `formularios`.`turma_id` = 102 LIMIT 1
+Template Load (0.2ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`nome` = 'Avaliação Padrão' LIMIT 1
+Formulario Load (0.1ms)  SELECT `formularios`.* FROM `formularios`
+ElementoForm Count (0.1ms)  SELECT COUNT(*) FROM `elemento_forms` WHERE `elemento_forms`.`formulario_id` = 83
+Elemento Count (0.2ms)  SELECT COUNT(*) FROM `elementos` WHERE `elementos`.`template_id` = 48
+ElementoForm Count (0.2ms)  SELECT COUNT(*) FROM `elemento_forms` WHERE `elemento_forms`.`formulario_id` = 84
+Elemento Count (0.2ms)  SELECT COUNT(*) FROM `elementos` WHERE `elementos`.`template_id` = 48
+TRANSACTION (1.2ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Departamento' AND `departamentos`.`codigo` = 'TST' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.2ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'TST' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('TST', '2026-06-30 17:32:58.367919', 'Departamento', '2026-06-30 17:32:58.367919')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '123456789' LIMIT 1
+Usuario Exists? (0.1ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.3ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:58.369723', NULL, NULL, NULL, 227, 'admin@unb.br', NULL, '123456789', 'Admin', NULL, NULL, '123456', 'Administrador', '2026-06-30 17:32:58.369723')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Campo Exists? (0.3ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.1ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 2 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.1ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 3 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.2ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 4 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.2ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.2ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 2 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.2ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 3 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.2ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 4 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.1ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 5 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.2ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Template Create (0.3ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:32:58.375718', 'Avaliação Padrão', '2026-06-30 17:32:58.375718', 253)
+Elemento Create (0.3ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:32:58.376221', 'Como você avalia o professor?', 1, 49, '2026-06-30 17:32:58.376221')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.376666', 54, 'Ótimo', 1, 'Múltipla Escolha', '2026-06-30 17:32:58.376666')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.377073', 54, 'Bom', 2, 'Múltipla Escolha', '2026-06-30 17:32:58.377073')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.377443', 54, 'Regular', 3, 'Múltipla Escolha', '2026-06-30 17:32:58.377443')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.377849', 54, 'Ruim', 4, 'Múltipla Escolha', '2026-06-30 17:32:58.377849')
+Elemento Create (0.2ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:32:58.378417', 'Qual seu nível de satisfação?', 2, 49, '2026-06-30 17:32:58.378417')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.378775', 55, '1', 1, 'Escala', '2026-06-30 17:32:58.378775')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.379127', 55, '2', 2, 'Escala', '2026-06-30 17:32:58.379127')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.379474', 55, '3', 3, 'Escala', '2026-06-30 17:32:58.379474')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.379818', 55, '4', 4, 'Escala', '2026-06-30 17:32:58.379818')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.380161', 55, '5', 5, 'Escala', '2026-06-30 17:32:58.380161')
+Elemento Create (0.2ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:32:58.380521', 'Deixe seu comentário', 3, 49, '2026-06-30 17:32:58.380521')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.380873', 56, NULL, 1, 'Texto', '2026-06-30 17:32:58.380873')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Departamento' AND `departamentos`.`codigo` = 'TST' LIMIT 1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'TEC001' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'TEC001' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('TEC001', '2026-06-30 17:32:58.382626', 227, 'Matemática', '2026-06-30 17:32:58.382626')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.1ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`disciplina_id` = 112 AND `turmas`.`numero_da_turma` = 'A' AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.3ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'A' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 112 LIMIT 1
+Turma Create (0.1ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:32:58.383985', 112, 'Seg 08:00-10:00', 'A', '2026.1', '2026-06-30 17:32:58.383985')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.1ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'TEC002' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'TEC002' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('TEC002', '2026-06-30 17:32:58.385090', 227, 'Português', '2026-06-30 17:32:58.385090')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`disciplina_id` = 113 AND `turmas`.`numero_da_turma` = 'B' AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.3ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'B' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 113 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:32:58.386756', 113, 'Seg 08:00-10:00', 'B', '2026.1', '2026-06-30 17:32:58.386756')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'TEC003' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'TEC003' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('TEC003', '2026-06-30 17:32:58.388096', 227, 'História', '2026-06-30 17:32:58.388096')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`disciplina_id` = 114 AND `turmas`.`numero_da_turma` = 'A' AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'A' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 114 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:32:58.389640', 114, 'Seg 08:00-10:00', 'A', '2026.1', '2026-06-30 17:32:58.389640')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/admin/253/enviar_formularios” for 127.0.0.1 at 2026-06-30 14:32:58 -0300 Processing by AdminController#enviar_formularios as HTML

+ +
Parameters: {"admin_id" => "253"}
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/enviar_formularios.html.erb within layouts/gerenciamento
+Template Load (0.3ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`usuario_id` = 253
+Turma Eager Load (0.4ms)  SELECT `turmas`.`id` AS t0_r0, `turmas`.`created_at` AS t0_r1, `turmas`.`disciplina_id` AS t0_r2, `turmas`.`horario` AS t0_r3, `turmas`.`numero_da_turma` AS t0_r4, `turmas`.`semestre` AS t0_r5, `turmas`.`updated_at` AS t0_r6, `disciplinas`.`id` AS t1_r0, `disciplinas`.`codigo` AS t1_r1, `disciplinas`.`created_at` AS t1_r2, `disciplinas`.`departamento_id` AS t1_r3, `disciplinas`.`nome` AS t1_r4, `disciplinas`.`updated_at` AS t1_r5 FROM `turmas` INNER JOIN `disciplinas` ON `disciplinas`.`id` = `turmas`.`disciplina_id` ORDER BY disciplinas.nome, turmas.semestre
+Rendered admin/enviar_formularios.html.erb within layouts/gerenciamento (Duration: 1.4ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 1.7ms | GC: 0.0ms)
+ +

Completed 200 OK in 2ms (Views: 1.0ms | ActiveRecord: 0.8ms (2 queries, 0 cached) | GC: 0.1ms)

+ +
Disciplina Load (0.3ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'TEC001' AND `disciplinas`.`nome` = 'Matemática' LIMIT 1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`disciplina_id` = 112 AND `turmas`.`numero_da_turma` = 'A' LIMIT 1
+ +

Started POST “/admin/253/enviar_formularios” for 127.0.0.1 at 2026-06-30 14:32:58 -0300 Processing by AdminController#enviar_formularios as HTML

+ +
Parameters: {"template_id" => "", "turma_ids" => ["104"], "commit" => "Criar Formulário", "admin_id" => "253"}
+ +

Redirected to www.example.com/admin/253/enviar_formularios Completed 302 Found in 0ms (ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 0.0ms) Started GET “/admin/253/enviar_formularios” for 127.0.0.1 at 2026-06-30 14:32:58 -0300 Processing by AdminController#enviar_formularios as HTML

+ +
Parameters: {"admin_id" => "253"}
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/enviar_formularios.html.erb within layouts/gerenciamento
+Template Load (0.2ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`usuario_id` = 253
+Turma Eager Load (0.3ms)  SELECT `turmas`.`id` AS t0_r0, `turmas`.`created_at` AS t0_r1, `turmas`.`disciplina_id` AS t0_r2, `turmas`.`horario` AS t0_r3, `turmas`.`numero_da_turma` AS t0_r4, `turmas`.`semestre` AS t0_r5, `turmas`.`updated_at` AS t0_r6, `disciplinas`.`id` AS t1_r0, `disciplinas`.`codigo` AS t1_r1, `disciplinas`.`created_at` AS t1_r2, `disciplinas`.`departamento_id` AS t1_r3, `disciplinas`.`nome` AS t1_r4, `disciplinas`.`updated_at` AS t1_r5 FROM `turmas` INNER JOIN `disciplinas` ON `disciplinas`.`id` = `turmas`.`disciplina_id` ORDER BY disciplinas.nome, turmas.semestre
+Rendered admin/enviar_formularios.html.erb within layouts/gerenciamento (Duration: 1.1ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 1.3ms | GC: 0.0ms)
+ +

Completed 200 OK in 2ms (Views: 0.9ms | ActiveRecord: 0.6ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.4ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Departamento' AND `departamentos`.`codigo` = 'TST' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'TST' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('TST', '2026-06-30 17:32:58.403492', 'Departamento', '2026-06-30 17:32:58.403492')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '123456789' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.3ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:58.405268', NULL, NULL, NULL, 228, 'admin@unb.br', NULL, '123456789', 'Admin', NULL, NULL, '123456', 'Administrador', '2026-06-30 17:32:58.405268')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Campo Exists? (0.3ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.2ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 2 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.2ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 3 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.2ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 4 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.3ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.2ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 2 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.2ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 3 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.2ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 4 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.2ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 5 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.1ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Template Create (0.3ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:32:58.411178', 'Avaliação Padrão', '2026-06-30 17:32:58.411178', 254)
+Elemento Create (0.2ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:32:58.411641', 'Como você avalia o professor?', 1, 50, '2026-06-30 17:32:58.411641')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.412034', 57, 'Ótimo', 1, 'Múltipla Escolha', '2026-06-30 17:32:58.412034')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.412413', 57, 'Bom', 2, 'Múltipla Escolha', '2026-06-30 17:32:58.412413')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.412787', 57, 'Regular', 3, 'Múltipla Escolha', '2026-06-30 17:32:58.412787')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.413148', 57, 'Ruim', 4, 'Múltipla Escolha', '2026-06-30 17:32:58.413148')
+Elemento Create (0.2ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:32:58.413519', 'Qual seu nível de satisfação?', 2, 50, '2026-06-30 17:32:58.413519')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.413888', 58, '1', 1, 'Escala', '2026-06-30 17:32:58.413888')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.414250', 58, '2', 2, 'Escala', '2026-06-30 17:32:58.414250')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.414724', 58, '3', 3, 'Escala', '2026-06-30 17:32:58.414724')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.415085', 58, '4', 4, 'Escala', '2026-06-30 17:32:58.415085')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.415446', 58, '5', 5, 'Escala', '2026-06-30 17:32:58.415446')
+Elemento Create (0.2ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:32:58.415814', 'Deixe seu comentário', 3, 50, '2026-06-30 17:32:58.415814')
+Campo Create (0.1ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.416193', 59, NULL, 1, 'Texto', '2026-06-30 17:32:58.416193')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.1ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Departamento' AND `departamentos`.`codigo` = 'TST' LIMIT 1
+Disciplina Load (0.1ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'TEC001' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'TEC001' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('TEC001', '2026-06-30 17:32:58.417701', 228, 'Matemática', '2026-06-30 17:32:58.417701')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`disciplina_id` = 115 AND `turmas`.`numero_da_turma` = 'A' AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.3ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'A' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 115 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:32:58.419166', 115, 'Seg 08:00-10:00', 'A', '2026.1', '2026-06-30 17:32:58.419166')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'TEC002' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'TEC002' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('TEC002', '2026-06-30 17:32:58.420537', 228, 'Português', '2026-06-30 17:32:58.420537')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`disciplina_id` = 116 AND `turmas`.`numero_da_turma` = 'B' AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.3ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'B' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 116 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:32:58.421961', 116, 'Seg 08:00-10:00', 'B', '2026.1', '2026-06-30 17:32:58.421961')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'TEC003' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'TEC003' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('TEC003', '2026-06-30 17:32:58.423214', 228, 'História', '2026-06-30 17:32:58.423214')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`disciplina_id` = 117 AND `turmas`.`numero_da_turma` = 'A' AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.3ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'A' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 117 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:32:58.424638', 117, 'Seg 08:00-10:00', 'A', '2026.1', '2026-06-30 17:32:58.424638')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/admin/254/enviar_formularios” for 127.0.0.1 at 2026-06-30 14:32:58 -0300 Processing by AdminController#enviar_formularios as HTML

+ +
Parameters: {"admin_id" => "254"}
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/enviar_formularios.html.erb within layouts/gerenciamento
+Template Load (0.3ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`usuario_id` = 254
+Turma Eager Load (0.4ms)  SELECT `turmas`.`id` AS t0_r0, `turmas`.`created_at` AS t0_r1, `turmas`.`disciplina_id` AS t0_r2, `turmas`.`horario` AS t0_r3, `turmas`.`numero_da_turma` AS t0_r4, `turmas`.`semestre` AS t0_r5, `turmas`.`updated_at` AS t0_r6, `disciplinas`.`id` AS t1_r0, `disciplinas`.`codigo` AS t1_r1, `disciplinas`.`created_at` AS t1_r2, `disciplinas`.`departamento_id` AS t1_r3, `disciplinas`.`nome` AS t1_r4, `disciplinas`.`updated_at` AS t1_r5 FROM `turmas` INNER JOIN `disciplinas` ON `disciplinas`.`id` = `turmas`.`disciplina_id` ORDER BY disciplinas.nome, turmas.semestre
+Rendered admin/enviar_formularios.html.erb within layouts/gerenciamento (Duration: 1.3ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 1.5ms | GC: 0.0ms)
+ +

Completed 200 OK in 2ms (Views: 1.0ms | ActiveRecord: 0.7ms (2 queries, 0 cached) | GC: 0.0ms) Started POST “/admin/254/enviar_formularios” for 127.0.0.1 at 2026-06-30 14:32:58 -0300 Processing by AdminController#enviar_formularios as HTML

+ +
Parameters: {"template_id" => "50", "commit" => "Criar Formulário", "admin_id" => "254"}
+ +

Redirected to www.example.com/admin/254/enviar_formularios Completed 302 Found in 0ms (ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 0.1ms) Started GET “/admin/254/enviar_formularios” for 127.0.0.1 at 2026-06-30 14:32:58 -0300 Processing by AdminController#enviar_formularios as HTML

+ +
Parameters: {"admin_id" => "254"}
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/enviar_formularios.html.erb within layouts/gerenciamento
+Template Load (0.2ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`usuario_id` = 254
+Turma Eager Load (0.3ms)  SELECT `turmas`.`id` AS t0_r0, `turmas`.`created_at` AS t0_r1, `turmas`.`disciplina_id` AS t0_r2, `turmas`.`horario` AS t0_r3, `turmas`.`numero_da_turma` AS t0_r4, `turmas`.`semestre` AS t0_r5, `turmas`.`updated_at` AS t0_r6, `disciplinas`.`id` AS t1_r0, `disciplinas`.`codigo` AS t1_r1, `disciplinas`.`created_at` AS t1_r2, `disciplinas`.`departamento_id` AS t1_r3, `disciplinas`.`nome` AS t1_r4, `disciplinas`.`updated_at` AS t1_r5 FROM `turmas` INNER JOIN `disciplinas` ON `disciplinas`.`id` = `turmas`.`disciplina_id` ORDER BY disciplinas.nome, turmas.semestre
+Rendered admin/enviar_formularios.html.erb within layouts/gerenciamento (Duration: 1.1ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 1.3ms | GC: 0.0ms)
+ +

Completed 200 OK in 2ms (Views: 0.9ms | ActiveRecord: 0.5ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.9ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.4ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Departamento' AND `departamentos`.`codigo` = 'TST' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'TST' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('TST', '2026-06-30 17:32:58.436994', 'Departamento', '2026-06-30 17:32:58.436994')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '123456789' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.3ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:58.438716', NULL, NULL, NULL, 229, 'admin@unb.br', NULL, '123456789', 'Admin', NULL, NULL, '123456', 'Administrador', '2026-06-30 17:32:58.438716')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Campo Exists? (0.4ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.2ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 2 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.2ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 3 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.2ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 4 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.1ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.1ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 2 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.1ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 3 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.1ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 4 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.1ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 5 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.1ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Template Create (0.2ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:32:58.444544', 'Avaliação Padrão', '2026-06-30 17:32:58.444544', 255)
+Elemento Create (0.2ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:32:58.444963', 'Como você avalia o professor?', 1, 51, '2026-06-30 17:32:58.444963')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.445333', 60, 'Ótimo', 1, 'Múltipla Escolha', '2026-06-30 17:32:58.445333')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.445699', 60, 'Bom', 2, 'Múltipla Escolha', '2026-06-30 17:32:58.445699')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.446056', 60, 'Regular', 3, 'Múltipla Escolha', '2026-06-30 17:32:58.446056')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.446402', 60, 'Ruim', 4, 'Múltipla Escolha', '2026-06-30 17:32:58.446402')
+Elemento Create (0.2ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:32:58.446765', 'Qual seu nível de satisfação?', 2, 51, '2026-06-30 17:32:58.446765')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.447115', 61, '1', 1, 'Escala', '2026-06-30 17:32:58.447115')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.447461', 61, '2', 2, 'Escala', '2026-06-30 17:32:58.447461')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.447883', 61, '3', 3, 'Escala', '2026-06-30 17:32:58.447883')
+Docente Create (0.3ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:58.447843', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Prof Teste', NULL, NULL, '$2a$12$ImQ/3JHaWlCxxJw8o/XGIumwVP65q8poiXEv1DnDPmC4m1lFhmEO.', 'Docente', '2026-06-30 17:32:58.447843')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.448223', 61, '4', 4, 'Escala', '2026-06-30 17:32:58.448223')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.448606', 61, '5', 5, 'Escala', '2026-06-30 17:32:58.448606')
+ +

Started GET “/” for 127.0.0.1 at 2026-06-30 14:32:58 -0300

+ +
Elemento Create (0.2ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:32:58.449005', 'Deixe seu comentário', 3, 51, '2026-06-30 17:32:58.449005')
+ +

Processing by SessionsController#new as HTML

+ +
Campo Create (0.1ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.449389', 62, NULL, 1, 'Texto', '2026-06-30 17:32:58.449389')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Usuario Load (0.1ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+Departamento Load (0.1ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Departamento' AND `departamentos`.`codigo` = 'TST' LIMIT 1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'TEC001' LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering sessions/new.html.erb within layouts/application
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'TEC001' LIMIT 1
+Rendered sessions/new.html.erb within layouts/application (Duration: 0.4ms | GC: 0.0ms)
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('TEC001', '2026-06-30 17:32:58.451205', 229, 'Matemática', '2026-06-30 17:32:58.451205')
+Rendered layout layouts/application.html.erb (Duration: 0.7ms | GC: 0.0ms)
+ +

Completed 200 OK in 2ms (Views: 1.1ms | ActiveRecord: 0.1ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.1ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`disciplina_id` = 118 AND `turmas`.`numero_da_turma` = 'A' AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.3ms)  ROLLBACK
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.2ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'A' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 118 LIMIT 1
+TRANSACTION (0.1ms)  BEGIN
+Turma Create (0.1ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:32:58.452824', 118, 'Seg 08:00-10:00', 'A', '2026.1', '2026-06-30 17:32:58.452824')
+TRANSACTION (0.0ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.1ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'TEC002' LIMIT 1
+Departamento Load (0.1ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.2ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'TEC002' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('TEC002', '2026-06-30 17:32:58.453881', 229, 'Português', '2026-06-30 17:32:58.453881')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:58.454087', 'Ciência da Computação', '2026-06-30 17:32:58.454087')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`disciplina_id` = 119 AND `turmas`.`numero_da_turma` = 'B' AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm001' LIMIT 1
+Turma Exists? (0.3ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'B' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 119 LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:32:58.455233', 119, 'Seg 08:00-10:00', 'B', '2026.1', '2026-06-30 17:32:58.455233')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.1ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'TEC003' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'TEC003' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('TEC003', '2026-06-30 17:32:58.456377', 229, 'História', '2026-06-30 17:32:58.456377')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`disciplina_id` = 120 AND `turmas`.`numero_da_turma` = 'A' AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'A' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 120 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:32:58.457848', 120, 'Seg 08:00-10:00', 'A', '2026.1', '2026-06-30 17:32:58.457848')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/admin/255/enviar_formularios” for 127.0.0.1 at 2026-06-30 14:32:58 -0300 Processing by AdminController#enviar_formularios as HTML

+ +
Parameters: {"admin_id" => "255"}
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/enviar_formularios.html.erb within layouts/gerenciamento
+Template Load (0.4ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`usuario_id` = 255
+Turma Eager Load (0.4ms)  SELECT `turmas`.`id` AS t0_r0, `turmas`.`created_at` AS t0_r1, `turmas`.`disciplina_id` AS t0_r2, `turmas`.`horario` AS t0_r3, `turmas`.`numero_da_turma` AS t0_r4, `turmas`.`semestre` AS t0_r5, `turmas`.`updated_at` AS t0_r6, `disciplinas`.`id` AS t1_r0, `disciplinas`.`codigo` AS t1_r1, `disciplinas`.`created_at` AS t1_r2, `disciplinas`.`departamento_id` AS t1_r3, `disciplinas`.`nome` AS t1_r4, `disciplinas`.`updated_at` AS t1_r5 FROM `turmas` INNER JOIN `disciplinas` ON `disciplinas`.`id` = `turmas`.`disciplina_id` ORDER BY disciplinas.nome, turmas.semestre
+Rendered admin/enviar_formularios.html.erb within layouts/gerenciamento (Duration: 1.4ms | GC: 0.1ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 1.7ms | GC: 0.1ms)
+ +

Completed 200 OK in 2ms (Views: 1.1ms | ActiveRecord: 0.8ms (2 queries, 0 cached) | GC: 0.1ms)

+ +
Template Load (0.2ms)  SELECT `templates`.* FROM `templates`
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`semestre` = '2026.1'
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`id` = 118 LIMIT 1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`id` = 119 LIMIT 1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`id` = 120 LIMIT 1
+TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '309019' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' LIMIT 1
+Usuario Create (0.3ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:58.468847', NULL, NULL, NULL, NULL, 'usuario@teste.com', NULL, '309019', 'Usuário Teste', NULL, NULL, NULL, NULL, '2026-06-30 17:32:58.468847')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' AND `usuarios`.`id` != 257 LIMIT 1
+Usuario Update (0.3ms)  UPDATE `usuarios` SET `usuarios`.`definicao_senha_sent_at` = '2026-06-30 17:32:58.469966', `usuarios`.`definicao_senha_token` = 'QCFnVmWC2cXk0xOYEop8hoPPAJyWTk08L62bn4gm-3U', `usuarios`.`updated_at` = '2026-06-30 17:32:58.470603' WHERE `usuarios`.`id` = 257
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Rendering layout layouts/mailer.html.erb
+Rendering usuario_mailer/definicao_senha.html.erb within layouts/mailer
+Rendered usuario_mailer/definicao_senha.html.erb within layouts/mailer (Duration: 0.0ms | GC: 0.0ms)
+Rendered layout layouts/mailer.html.erb (Duration: 0.1ms | GC: 0.0ms)
+Rendering layout layouts/mailer.text.erb
+Rendering usuario_mailer/definicao_senha.text.erb within layouts/mailer
+Rendered usuario_mailer/definicao_senha.text.erb within layouts/mailer (Duration: 0.0ms | GC: 0.0ms)
+Rendered layout layouts/mailer.text.erb (Duration: 0.0ms | GC: 0.0ms)
+ +

UsuarioMailer#definicao_senha: processed outbound mail in 1.0ms Delivered mail 6a43fdca735fd_18563ea0830bd@MacBook-Air-de-Elvis.local.mail (1.2ms) Date: Tue, 30 Jun 2026 14:32:58 -0300 From: camaar@gmail.com To: usuario@teste.com Message-ID: <6a43fdca735fd_18563ea0830bd@MacBook-Air-de-Elvis.local.mail> Subject: =?UTF-8?Q?Defini=C3=A7=C3=A3o_de_senha?= MIME-Version: 1.0 Content-Type: multipart/alternative;

+ +
boundary="--==_mimepart_6a43fdca733eb_18563ea082949";
+charset=UTF-8
+
+ +

Content-Transfer-Encoding: 7bit

+ +

—-==_mimepart_6a43fdca733eb_18563ea082949 Content-Type: text/plain;

+ +
charset=UTF-8
+
+ +

Content-Transfer-Encoding: quoted-printable

+ +

Ol=C3=A1, Usu=C3=A1rio Teste.

+ +

Para definir sua senha e acessar o sistema, acesse o link abaixo:

+ +

example.com/definir_senha/QCFnVmWC2cXk0xOYEop8hoPPAJyWTk08L62bn4gm= -3U

+ +

—-==_mimepart_6a43fdca733eb_18563ea082949 Content-Type: text/html;

+ +
charset=UTF-8
+
+ +

Content-Transfer-Encoding: quoted-printable

+ +

<!DOCTYPE html> <html>

+ +
<head>
+  <meta http-equiv=3D"Content-Type" content=3D"text/html; charset=3Dutf=
+ +

-8“>

+ +
  <style>
+    /* Email styles need to be inline */
+  </style>
+</head>
+
+<body>
+  <p>Ol=C3=A1, Usu=C3=A1rio Teste.</p>
+ +

<p>Para definir sua senha e acessar o sistema, acesse o link abaixo:</p>

+ +

<p><a href=3D“example.com/definir_senha/QCFnVmWC2cXk0xOYEop8hoPPAJ= yWTk08L62bn4gm-3U”>example.com/definir_senha/QCFnVmWC2cXk0xOYEop8h= oPPAJyWTk08L62bn4gm-3U</a></p>

+ +
</body>
+ +

</html>

+ +

—-==_mimepart_6a43fdca733eb_18563ea082949–

+ +

Started GET “/definir_senha/QCFnVmWC2cXk0xOYEop8hoPPAJyWTk08L62bn4gm-3U” for 127.0.0.1 at 2026-06-30 14:32:58 -0300 Processing by DefinicaoSenhasController#edit as HTML

+ +
Parameters: {"token" => "[FILTERED]"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`definicao_senha_token` = 'QCFnVmWC2cXk0xOYEop8hoPPAJyWTk08L62bn4gm-3U' LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering definicao_senhas/edit.html.erb within layouts/application
+Rendered definicao_senhas/edit.html.erb within layouts/application (Duration: 0.3ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.6ms | GC: 0.0ms)
+ +

Completed 200 OK in 2ms (Views: 1.0ms | ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started PATCH “/definir_senha/QCFnVmWC2cXk0xOYEop8hoPPAJyWTk08L62bn4gm-3U” for 127.0.0.1 at 2026-06-30 14:32:58 -0300 Processing by DefinicaoSenhasController#update as HTML

+ +
Parameters: {"senha" => "Senha123", "senha_confirmation" => "Senha123", "commit" => "Definir senha", "token" => "[FILTERED]"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`definicao_senha_token` = 'QCFnVmWC2cXk0xOYEop8hoPPAJyWTk08L62bn4gm-3U' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' AND `usuarios`.`id` != 257 LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:58.653783', NULL, NULL, NULL, 230, 'admin@unb.br', NULL, 'adm001', 'Admin Teste', NULL, NULL, '$2a$12$vojEcMPtK5C2x7WOznW4UujEoZl5sSv/bFPZuoWWr5FRQmxxgerJy', 'Administrador', '2026-06-30 17:32:58.653783')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Usuario Update (0.5ms)  UPDATE `usuarios` SET `usuarios`.`definicao_senha_sent_at` = NULL, `usuarios`.`definicao_senha_token` = NULL, `usuarios`.`senha_hash` = '$2a$12$pwyYh/Q91hoWzeg6sMs4LOjHK1CST2DqGWwwtz7Nq4S8tnHBsPqm.', `usuarios`.`updated_at` = '2026-06-30 17:32:58.676713' WHERE `usuarios`.`id` = 257
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to example.com/ Completed 302 Found in 200ms (ActiveRecord: 1.3ms (3 queries, 0 cached) | GC: 0.0ms) Started GET “/” for 127.0.0.1 at 2026-06-30 14:32:58 -0300 Processing by SessionsController#new as HTML

+ +
Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering sessions/new.html.erb within layouts/application
+Rendered sessions/new.html.erb within layouts/application (Duration: 0.3ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.6ms | GC: 0.0ms)
+ +

Completed 200 OK in 2ms (Views: 0.9ms | ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/” for 127.0.0.1 at 2026-06-30 14:32:58 -0300 Processing by SessionsController#new as HTML

+ +
Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering sessions/new.html.erb within layouts/application
+Rendered sessions/new.html.erb within layouts/application (Duration: 0.2ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.5ms | ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:58 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "usuario@teste.com", "senha" => "Senha123", "commit" => "Entrar"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:58.854729', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Prof Teste', NULL, NULL, '$2a$12$8keTSL5a/0YqvEHS4Mvmx.1RK04ZaO4tTQHgcSSsch5/U0FxJOynG', 'Docente', '2026-06-30 17:32:58.854729')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:58 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin@unb.br", "senha" => "Senha123"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/257/avaliacoes Completed 302 Found in 199ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/usuarios/257/avaliacoes” for 127.0.0.1 at 2026-06-30 14:32:58 -0300 Processing by UsuariosController#avaliacoes as HTML

+ +
Parameters: {"usuario_id" => "257"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 257 LIMIT 1
+CACHE Usuario Load (0.0ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 257 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering usuarios/avaliacoes.html.erb within layouts/application
+Formulario Load (0.4ms)  SELECT `formularios`.* FROM `formularios` INNER JOIN `turmas` ON `turmas`.`id` = `formularios`.`turma_id` WHERE `formularios`.`turma_id` IN (SELECT `turmas`.`id` FROM `turmas` WHERE (1=0))
+Rendered usuarios/avaliacoes.html.erb within layouts/application (Duration: 1.1ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.3ms | GC: 0.0ms)
+ +

Completed 200 OK in 5ms (Views: 1.3ms | ActiveRecord: 0.7ms (3 queries, 1 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '317319' LIMIT 1
+Usuario Exists? (0.1ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' LIMIT 1
+Usuario Create (0.2ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:58.893213', NULL, NULL, NULL, NULL, 'usuario@teste.com', NULL, '317319', 'Usuário Teste', NULL, NULL, NULL, NULL, '2026-06-30 17:32:58.893213')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' AND `usuarios`.`id` != 260 LIMIT 1
+Usuario Update (0.3ms)  UPDATE `usuarios` SET `usuarios`.`definicao_senha_sent_at` = '2026-06-30 17:32:58.894157', `usuarios`.`definicao_senha_token` = '11NlUW1jZmUVrldDCjRx0nUCa6e5lVYuQjJl51dmiRM', `usuarios`.`updated_at` = '2026-06-30 17:32:58.894789' WHERE `usuarios`.`id` = 260
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Rendering layout layouts/mailer.html.erb
+Rendering usuario_mailer/definicao_senha.html.erb within layouts/mailer
+Rendered usuario_mailer/definicao_senha.html.erb within layouts/mailer (Duration: 0.0ms | GC: 0.0ms)
+Rendered layout layouts/mailer.html.erb (Duration: 0.1ms | GC: 0.0ms)
+Rendering layout layouts/mailer.text.erb
+Rendering usuario_mailer/definicao_senha.text.erb within layouts/mailer
+Rendered usuario_mailer/definicao_senha.text.erb within layouts/mailer (Duration: 0.0ms | GC: 0.0ms)
+Rendered layout layouts/mailer.text.erb (Duration: 0.0ms | GC: 0.0ms)
+ +

UsuarioMailer#definicao_senha: processed outbound mail in 1.1ms Delivered mail 6a43fdcadaf76_18563ea0832ee@MacBook-Air-de-Elvis.local.mail (1.2ms) Date: Tue, 30 Jun 2026 14:32:58 -0300 From: camaar@gmail.com To: usuario@teste.com Message-ID: <6a43fdcadaf76_18563ea0832ee@MacBook-Air-de-Elvis.local.mail> Subject: =?UTF-8?Q?Defini=C3=A7=C3=A3o_de_senha?= MIME-Version: 1.0 Content-Type: multipart/alternative;

+ +
boundary="--==_mimepart_6a43fdcadacbd_18563ea0831ea";
+charset=UTF-8
+
+ +

Content-Transfer-Encoding: 7bit

+ +

—-==_mimepart_6a43fdcadacbd_18563ea0831ea Content-Type: text/plain;

+ +
charset=UTF-8
+
+ +

Content-Transfer-Encoding: quoted-printable

+ +

Ol=C3=A1, Usu=C3=A1rio Teste.

+ +

Para definir sua senha e acessar o sistema, acesse o link abaixo:

+ +

example.com/definir_senha/11NlUW1jZmUVrldDCjRx0nUCa6e5lVYuQjJl51dm= iRM

+ +

—-==_mimepart_6a43fdcadacbd_18563ea0831ea Content-Type: text/html;

+ +
charset=UTF-8
+
+ +

Content-Transfer-Encoding: quoted-printable

+ +

<!DOCTYPE html> <html>

+ +
<head>
+  <meta http-equiv=3D"Content-Type" content=3D"text/html; charset=3Dutf=
+ +

-8“>

+ +
  <style>
+    /* Email styles need to be inline */
+  </style>
+</head>
+
+<body>
+  <p>Ol=C3=A1, Usu=C3=A1rio Teste.</p>
+ +

<p>Para definir sua senha e acessar o sistema, acesse o link abaixo:</p>

+ +

<p><a href=3D“example.com/definir_senha/11NlUW1jZmUVrldDCjRx0nUCa6= e5lVYuQjJl51dmiRM”>example.com/definir_senha/11NlUW1jZmUVrldDCjRx0= nUCa6e5lVYuQjJl51dmiRM</a></p>

+ +
</body>
+ +

</html>

+ +

—-==_mimepart_6a43fdcadacbd_18563ea0831ea–

+ +

Started GET “/definir_senha/11NlUW1jZmUVrldDCjRx0nUCa6e5lVYuQjJl51dmiRM” for 127.0.0.1 at 2026-06-30 14:32:58 -0300 Processing by DefinicaoSenhasController#edit as HTML

+ +
Parameters: {"token" => "[FILTERED]"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`definicao_senha_token` = '11NlUW1jZmUVrldDCjRx0nUCa6e5lVYuQjJl51dmiRM' LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering definicao_senhas/edit.html.erb within layouts/application
+Rendered definicao_senhas/edit.html.erb within layouts/application (Duration: 0.3ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.8ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 1.0ms | ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started PATCH “/definir_senha/11NlUW1jZmUVrldDCjRx0nUCa6e5lVYuQjJl51dmiRM” for 127.0.0.1 at 2026-06-30 14:32:58 -0300 Processing by DefinicaoSenhasController#update as HTML

+ +
Parameters: {"senha" => "Senha123", "senha_confirmation" => "Senha321", "commit" => "Definir senha", "token" => "[FILTERED]"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`definicao_senha_token` = '11NlUW1jZmUVrldDCjRx0nUCa6e5lVYuQjJl51dmiRM' LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering definicao_senhas/edit.html.erb within layouts/application
+Rendered definicao_senhas/edit.html.erb within layouts/application (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.3ms | GC: 0.0ms)
+ +

Completed 422 Unprocessable Content in 1ms (Views: 0.4ms | ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '313123' LIMIT 1
+Usuario Exists? (0.1ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' LIMIT 1
+Usuario Create (0.2ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:58.906116', NULL, NULL, NULL, NULL, 'usuario@teste.com', NULL, '313123', 'Usuário Teste', NULL, NULL, NULL, NULL, '2026-06-30 17:32:58.906116')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' AND `usuarios`.`id` != 261 LIMIT 1
+Usuario Update (0.4ms)  UPDATE `usuarios` SET `usuarios`.`definicao_senha_sent_at` = '2026-06-30 17:32:58.906979', `usuarios`.`definicao_senha_token` = '2v01MzEXyJElhzEYP5IWoM-AFVrIwm1MvsKA0ydZ0hA', `usuarios`.`updated_at` = '2026-06-30 17:32:58.907637' WHERE `usuarios`.`id` = 261
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Rendering layout layouts/mailer.html.erb
+Rendering usuario_mailer/definicao_senha.html.erb within layouts/mailer
+Rendered usuario_mailer/definicao_senha.html.erb within layouts/mailer (Duration: 0.0ms | GC: 0.0ms)
+Rendered layout layouts/mailer.html.erb (Duration: 0.1ms | GC: 0.0ms)
+Rendering layout layouts/mailer.text.erb
+Rendering usuario_mailer/definicao_senha.text.erb within layouts/mailer
+Rendered usuario_mailer/definicao_senha.text.erb within layouts/mailer (Duration: 0.0ms | GC: 0.0ms)
+Rendered layout layouts/mailer.text.erb (Duration: 0.0ms | GC: 0.0ms)
+ +

UsuarioMailer#definicao_senha: processed outbound mail in 0.9ms Delivered mail 6a43fdcade0ac_18563ea083493@MacBook-Air-de-Elvis.local.mail (0.9ms) Date: Tue, 30 Jun 2026 14:32:58 -0300 From: camaar@gmail.com To: usuario@teste.com Message-ID: <6a43fdcade0ac_18563ea083493@MacBook-Air-de-Elvis.local.mail> Subject: =?UTF-8?Q?Defini=C3=A7=C3=A3o_de_senha?= MIME-Version: 1.0 Content-Type: multipart/alternative;

+ +
boundary="--==_mimepart_6a43fdcaddeba_18563ea08337c";
+charset=UTF-8
+
+ +

Content-Transfer-Encoding: 7bit

+ +

—-==_mimepart_6a43fdcaddeba_18563ea08337c Content-Type: text/plain;

+ +
charset=UTF-8
+
+ +

Content-Transfer-Encoding: quoted-printable

+ +

Ol=C3=A1, Usu=C3=A1rio Teste.

+ +

Para definir sua senha e acessar o sistema, acesse o link abaixo:

+ +

example.com/definir_senha/2v01MzEXyJElhzEYP5IWoM-AFVrIwm1MvsKA0ydZ= 0hA

+ +

—-==_mimepart_6a43fdcaddeba_18563ea08337c Content-Type: text/html;

+ +
charset=UTF-8
+
+ +

Content-Transfer-Encoding: quoted-printable

+ +

<!DOCTYPE html> <html>

+ +
<head>
+  <meta http-equiv=3D"Content-Type" content=3D"text/html; charset=3Dutf=
+ +

-8“>

+ +
  <style>
+    /* Email styles need to be inline */
+  </style>
+</head>
+
+<body>
+  <p>Ol=C3=A1, Usu=C3=A1rio Teste.</p>
+ +

<p>Para definir sua senha e acessar o sistema, acesse o link abaixo:</p>

+ +

<p><a href=3D“example.com/definir_senha/2v01MzEXyJElhzEYP5IWoM-AFV= rIwm1MvsKA0ydZ0hA”>example.com/definir_senha/2v01MzEXyJElhzEYP5IWo= M-AFVrIwm1MvsKA0ydZ0hA</a></p>

+ +
</body>
+ +

</html>

+ +

—-==_mimepart_6a43fdcaddeba_18563ea08337c–

+ +

Started GET “/definir_senha/2v01MzEXyJElhzEYP5IWoM-AFVrIwm1MvsKA0ydZ0hA” for 127.0.0.1 at 2026-06-30 14:32:58 -0300 Processing by DefinicaoSenhasController#edit as HTML

+ +
Parameters: {"token" => "[FILTERED]"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`definicao_senha_token` = '2v01MzEXyJElhzEYP5IWoM-AFVrIwm1MvsKA0ydZ0hA' LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering definicao_senhas/edit.html.erb within layouts/application
+Rendered definicao_senhas/edit.html.erb within layouts/application (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.5ms | ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms) Started PATCH “/definir_senha/2v01MzEXyJElhzEYP5IWoM-AFVrIwm1MvsKA0ydZ0hA” for 127.0.0.1 at 2026-06-30 14:32:58 -0300 Processing by DefinicaoSenhasController#update as HTML

+ +
Parameters: {"senha" => "123", "senha_confirmation" => "123", "commit" => "Definir senha", "token" => "[FILTERED]"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`definicao_senha_token` = '2v01MzEXyJElhzEYP5IWoM-AFVrIwm1MvsKA0ydZ0hA' LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering definicao_senhas/edit.html.erb within layouts/application
+Rendered definicao_senhas/edit.html.erb within layouts/application (Duration: 0.2ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.4ms | GC: 0.0ms)
+ +

Completed 422 Unprocessable Content in 1ms (Views: 0.6ms | ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.4ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Departamento' AND `departamentos`.`codigo` = 'TST' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'TST' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('TST', '2026-06-30 17:32:58.923802', 'Departamento', '2026-06-30 17:32:58.923802')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '123456789' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.2ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:58.925817', NULL, NULL, NULL, 231, 'admin@unb.br', NULL, '123456789', 'Admin', NULL, NULL, '123456', 'Administrador', '2026-06-30 17:32:58.925817')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' ORDER BY `usuarios`.`id` ASC LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Campo Exists? (0.3ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Template Create (0.2ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:32:58.928904', 'Template Prova Matemática 2º semestre', '2026-06-30 17:32:58.928904', 262)
+Elemento Create (0.2ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:32:58.929335', 'Questão Fantasma', 1, 52, '2026-06-30 17:32:58.929335')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.929725', 63, NULL, 1, 'Texto', '2026-06-30 17:32:58.929725')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Template Load (0.2ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`nome` = 'Template Prova Matemática 2º semestre' LIMIT 1
+Elemento Load (0.2ms)  SELECT `elementos`.* FROM `elementos` WHERE `elementos`.`template_id` = 52
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Campo Load (0.4ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` = 63
+Campo Destroy (0.1ms)  DELETE FROM `campos` WHERE `campos`.`id` = 79
+Elemento Destroy (0.1ms)  DELETE FROM `elementos` WHERE `elementos`.`id` = 63
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Elemento Create (0.2ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:32:58.933066', 'Questão 1(2 pontos):', 1, 52, '2026-06-30 17:32:58.933066')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Campo Exists? (0.4ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` = 64 LIMIT 1
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.934455', 64, 'a', 1, 'Múltipla Escolha', '2026-06-30 17:32:58.934455')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Campo Exists? (0.4ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 2 AND `campos`.`elemento_id` = 64 LIMIT 1
+Campo Create (0.1ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.935710', 64, 'b', 2, 'Múltipla Escolha', '2026-06-30 17:32:58.935710')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Campo Exists? (0.2ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 3 AND `campos`.`elemento_id` = 64 LIMIT 1
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.936606', 64, 'c', 3, 'Múltipla Escolha', '2026-06-30 17:32:58.936606')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Campo Exists? (0.3ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 4 AND `campos`.`elemento_id` = 64 LIMIT 1
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.937655', 64, 'd', 4, 'Múltipla Escolha', '2026-06-30 17:32:58.937655')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Elemento Create (0.3ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:32:58.938306', 'Questão 2(2 pontos):', 2, 52, '2026-06-30 17:32:58.938306')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Campo Exists? (0.3ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` = 65 LIMIT 1
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.939810', 65, 'a', 1, 'Múltipla Escolha', '2026-06-30 17:32:58.939810')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Campo Exists? (0.4ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 2 AND `campos`.`elemento_id` = 65 LIMIT 1
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.940887', 65, 'b', 2, 'Múltipla Escolha', '2026-06-30 17:32:58.940887')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Campo Exists? (0.4ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 3 AND `campos`.`elemento_id` = 65 LIMIT 1
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.942000', 65, 'c', 3, 'Múltipla Escolha', '2026-06-30 17:32:58.942000')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Campo Exists? (0.4ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 4 AND `campos`.`elemento_id` = 65 LIMIT 1
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.943101', 65, 'd', 4, 'Múltipla Escolha', '2026-06-30 17:32:58.943101')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Elemento Create (0.4ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:32:58.943762', 'Questão 3(3 pontos):', 3, 52, '2026-06-30 17:32:58.943762')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Campo Exists? (0.4ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` = 66 LIMIT 1
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.945225', 66, 'a', 1, 'Múltipla Escolha', '2026-06-30 17:32:58.945225')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Campo Exists? (0.4ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 2 AND `campos`.`elemento_id` = 66 LIMIT 1
+Campo Create (0.3ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.946349', 66, 'b', 2, 'Múltipla Escolha', '2026-06-30 17:32:58.946349')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Campo Exists? (0.3ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 3 AND `campos`.`elemento_id` = 66 LIMIT 1
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.947651', 66, 'c', 3, 'Múltipla Escolha', '2026-06-30 17:32:58.947651')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Campo Exists? (0.4ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 4 AND `campos`.`elemento_id` = 66 LIMIT 1
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.948733', 66, 'd', 4, 'Múltipla Escolha', '2026-06-30 17:32:58.948733')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Elemento Create (0.4ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:32:58.949362', 'Questão 4(3 pontos):', 4, 52, '2026-06-30 17:32:58.949362')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Campo Exists? (0.2ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` = 67 LIMIT 1
+Campo Create (0.1ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.950627', 67, 'a', 1, 'Múltipla Escolha', '2026-06-30 17:32:58.950627')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Campo Exists? (0.4ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 2 AND `campos`.`elemento_id` = 67 LIMIT 1
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.951759', 67, 'b', 2, 'Múltipla Escolha', '2026-06-30 17:32:58.951759')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Campo Exists? (0.4ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 3 AND `campos`.`elemento_id` = 67 LIMIT 1
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.952950', 67, 'c', 3, 'Múltipla Escolha', '2026-06-30 17:32:58.952950')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Campo Exists? (0.3ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 4 AND `campos`.`elemento_id` = 67 LIMIT 1
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.954082', 67, 'd', 4, 'Múltipla Escolha', '2026-06-30 17:32:58.954082')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Elemento Create (0.3ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:32:58.954842', 'Questão desafio(1 ponto):', 5, 52, '2026-06-30 17:32:58.954842')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Campo Exists? (0.3ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` = 68 LIMIT 1
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.956126', 68, 'a', 1, 'Múltipla Escolha', '2026-06-30 17:32:58.956126')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Campo Exists? (0.4ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 2 AND `campos`.`elemento_id` = 68 LIMIT 1
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.957267', 68, 'b', 2, 'Múltipla Escolha', '2026-06-30 17:32:58.957267')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Campo Exists? (0.4ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 3 AND `campos`.`elemento_id` = 68 LIMIT 1
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.958417', 68, 'c', 3, 'Múltipla Escolha', '2026-06-30 17:32:58.958417')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Campo Exists? (0.5ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 4 AND `campos`.`elemento_id` = 68 LIMIT 1
+Campo Create (0.3ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:58.959655', 68, 'd', 4, 'Múltipla Escolha', '2026-06-30 17:32:58.959655')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' ORDER BY `usuarios`.`id` ASC LIMIT 1
+ +

Started GET “/admin/262/templates” for 127.0.0.1 at 2026-06-30 14:32:58 -0300 Processing by TemplatesController#index as HTML

+ +
Parameters: {"admin_id" => "262"}
+Rendering layout layouts/gerenciamento.html.erb
+Rendering templates/index.html.erb within layouts/gerenciamento
+Template Exists? (0.2ms)  SELECT 1 AS one FROM `templates` WHERE `templates`.`usuario_id` = 262 LIMIT 1
+Template Load (0.2ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`usuario_id` = 262
+Elemento Load (0.2ms)  SELECT `elementos`.* FROM `elementos` WHERE `elementos`.`template_id` = 52
+Campo Load (0.3ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` IN (64, 65, 66, 67, 68)
+Rendered templates/_grid.html.erb (Duration: 2.2ms | GC: 0.0ms)
+Rendered templates/index.html.erb within layouts/gerenciamento (Duration: 2.2ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 2.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 3ms (Views: 1.6ms | ActiveRecord: 0.9ms (4 queries, 0 cached) | GC: 0.0ms) Started GET “/admin/262/templates/52/edit” for 127.0.0.1 at 2026-06-30 14:32:58 -0300 Processing by TemplatesController#edit as HTML

+ +
Parameters: {"admin_id" => "262", "id" => "52"}
+Template Load (0.1ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`usuario_id` = 262 AND `templates`.`id` = 52 LIMIT 1
+Elemento Exists? (0.1ms)  SELECT 1 AS one FROM `elementos` WHERE `elementos`.`template_id` = 52 LIMIT 1
+Rendering layout layouts/gerenciamento.html.erb
+Rendering templates/edit.html.erb within layouts/gerenciamento
+Template Exists? (0.2ms)  SELECT 1 AS one FROM `templates` WHERE `templates`.`usuario_id` = 262 LIMIT 1
+Template Load (0.2ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`usuario_id` = 262
+Rendered templates/_grid.html.erb (Duration: 0.9ms | GC: 0.1ms)
+Elemento Load (0.2ms)  SELECT `elementos`.* FROM `elementos` WHERE `elementos`.`template_id` = 52
+Campo Load (0.2ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` = 64
+Campo Load (0.2ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` = 65
+Campo Load (0.2ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` = 66
+Campo Load (0.2ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` = 67
+Campo Load (0.2ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` = 68
+Rendered templates/_form.html.erb (Duration: 5.8ms | GC: 0.1ms)
+Rendered templates/edit.html.erb within layouts/gerenciamento (Duration: 6.9ms | GC: 0.1ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 7.1ms | GC: 0.1ms)
+ +

Completed 200 OK in 9ms (Views: 5.7ms | ActiveRecord: 1.8ms (10 queries, 0 cached) | GC: 0.1ms) Started PATCH “/admin/262/templates/52” for 127.0.0.1 at 2026-06-30 14:32:58 -0300 Processing by TemplatesController#update as HTML

+ +
Parameters: {"template" => {"nome" => "Template Matemática Atualizado", "elementos_attributes" => {"0" => {"ordem" => "1", "_destroy" => "false", "enunciado" => "Questão 1(2 pontos):", "campos_attributes" => {"0" => {"tipo_elemento" => "Múltipla Escolha", "ordem" => "1", "_destroy" => "false", "enunciado" => "a", "id" => "80"}, "1" => {"tipo_elemento" => "Múltipla Escolha", "ordem" => "2", "_destroy" => "false", "enunciado" => "b", "id" => "81"}, "2" => {"tipo_elemento" => "Múltipla Escolha", "ordem" => "3", "_destroy" => "false", "enunciado" => "c", "id" => "82"}, "3" => {"tipo_elemento" => "Múltipla Escolha", "ordem" => "4", "_destroy" => "false", "enunciado" => "d", "id" => "83"}}, "id" => "64"}, "1" => {"ordem" => "2", "_destroy" => "false", "enunciado" => "Questão 2(2 pontos):", "campos_attributes" => {"0" => {"tipo_elemento" => "Múltipla Escolha", "ordem" => "1", "_destroy" => "false", "enunciado" => "a", "id" => "84"}, "1" => {"tipo_elemento" => "Múltipla Escolha", "ordem" => "2", "_destroy" => "false", "enunciado" => "b", "id" => "85"}, "2" => {"tipo_elemento" => "Múltipla Escolha", "ordem" => "3", "_destroy" => "false", "enunciado" => "c", "id" => "86"}, "3" => {"tipo_elemento" => "Múltipla Escolha", "ordem" => "4", "_destroy" => "false", "enunciado" => "d", "id" => "87"}}, "id" => "65"}, "2" => {"ordem" => "3", "_destroy" => "false", "enunciado" => "Questão 3(3 pontos):", "campos_attributes" => {"0" => {"tipo_elemento" => "Múltipla Escolha", "ordem" => "1", "_destroy" => "false", "enunciado" => "a", "id" => "88"}, "1" => {"tipo_elemento" => "Múltipla Escolha", "ordem" => "2", "_destroy" => "false", "enunciado" => "b", "id" => "89"}, "2" => {"tipo_elemento" => "Múltipla Escolha", "ordem" => "3", "_destroy" => "false", "enunciado" => "c", "id" => "90"}, "3" => {"tipo_elemento" => "Múltipla Escolha", "ordem" => "4", "_destroy" => "false", "enunciado" => "d", "id" => "91"}}, "id" => "66"}, "3" => {"ordem" => "4", "_destroy" => "false", "enunciado" => "Questão 4(3 pontos):", "campos_attributes" => {"0" => {"tipo_elemento" => "Múltipla Escolha", "ordem" => "1", "_destroy" => "false", "enunciado" => "a", "id" => "92"}, "1" => {"tipo_elemento" => "Múltipla Escolha", "ordem" => "2", "_destroy" => "false", "enunciado" => "b", "id" => "93"}, "2" => {"tipo_elemento" => "Múltipla Escolha", "ordem" => "3", "_destroy" => "false", "enunciado" => "c", "id" => "94"}, "3" => {"tipo_elemento" => "Múltipla Escolha", "ordem" => "4", "_destroy" => "false", "enunciado" => "d", "id" => "95"}}, "id" => "67"}, "4" => {"ordem" => "5", "_destroy" => "1", "enunciado" => "Questão desafio(1 ponto):", "campos_attributes" => {"0" => {"tipo_elemento" => "Múltipla Escolha", "ordem" => "1", "_destroy" => "false", "enunciado" => "a", "id" => "96"}, "1" => {"tipo_elemento" => "Múltipla Escolha", "ordem" => "2", "_destroy" => "false", "enunciado" => "b", "id" => "97"}, "2" => {"tipo_elemento" => "Múltipla Escolha", "ordem" => "3", "_destroy" => "false", "enunciado" => "c", "id" => "98"}, "3" => {"tipo_elemento" => "Múltipla Escolha", "ordem" => "4", "_destroy" => "false", "enunciado" => "d", "id" => "99"}}, "id" => "68"}}}, "commit" => "Salvar", "admin_id" => "262", "id" => "52"}
+Template Load (0.4ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`usuario_id` = 262 AND `templates`.`id` = 52 LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Elemento Load (0.6ms)  SELECT `elementos`.* FROM `elementos` WHERE `elementos`.`template_id` = 52 AND `elementos`.`id` IN (64, 65, 66, 67, 68)
+Campo Load (0.3ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` = 64 AND `campos`.`id` IN (80, 81, 82, 83)
+Campo Load (0.3ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` = 65 AND `campos`.`id` IN (84, 85, 86, 87)
+Campo Load (0.2ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` = 66 AND `campos`.`id` IN (88, 89, 90, 91)
+Campo Load (0.3ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` = 67 AND `campos`.`id` IN (92, 93, 94, 95)
+Campo Load (0.3ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` = 68 AND `campos`.`id` IN (96, 97, 98, 99)
+Elemento Load (0.2ms)  SELECT `elementos`.* FROM `elementos` WHERE `elementos`.`template_id` = 52
+Campo Load (0.2ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` = 64
+Campo Load (0.2ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` = 65
+Campo Load (0.2ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` = 66
+Campo Load (0.2ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` = 67
+Template Update (0.3ms)  UPDATE `templates` SET `templates`.`nome` = 'Template Matemática Atualizado', `templates`.`updated_at` = '2026-06-30 17:32:58.997063' WHERE `templates`.`id` = 52
+Campo Load (0.2ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` = 68
+Campo Destroy (0.2ms)  DELETE FROM `campos` WHERE `campos`.`id` = 96
+Campo Destroy (0.2ms)  DELETE FROM `campos` WHERE `campos`.`id` = 97
+Campo Destroy (0.2ms)  DELETE FROM `campos` WHERE `campos`.`id` = 98
+Campo Destroy (0.1ms)  DELETE FROM `campos` WHERE `campos`.`id` = 99
+Elemento Destroy (0.1ms)  DELETE FROM `elementos` WHERE `elementos`.`id` = 68
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/admin/262/templates Completed 302 Found in 13ms (ActiveRecord: 5.1ms (19 queries, 0 cached) | GC: 0.2ms) Started GET “/admin/262/templates” for 127.0.0.1 at 2026-06-30 14:32:59 -0300 Processing by TemplatesController#index as HTML

+ +
Parameters: {"admin_id" => "262"}
+Rendering layout layouts/gerenciamento.html.erb
+Rendering templates/index.html.erb within layouts/gerenciamento
+Template Exists? (0.2ms)  SELECT 1 AS one FROM `templates` WHERE `templates`.`usuario_id` = 262 LIMIT 1
+Template Load (0.2ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`usuario_id` = 262
+Elemento Load (0.2ms)  SELECT `elementos`.* FROM `elementos` WHERE `elementos`.`template_id` = 52
+Campo Load (0.3ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` IN (64, 65, 66, 67)
+Rendered templates/_grid.html.erb (Duration: 2.1ms | GC: 0.1ms)
+Rendered templates/index.html.erb within layouts/gerenciamento (Duration: 2.1ms | GC: 0.1ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 2.4ms | GC: 0.1ms)
+ +

Completed 200 OK in 3ms (Views: 1.6ms | ActiveRecord: 0.9ms (4 queries, 0 cached) | GC: 0.1ms)

+ +
Template Load (0.2ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`nome` = 'Template Matemática Atualizado' LIMIT 1
+Elemento Count (0.2ms)  SELECT COUNT(*) FROM `elementos` WHERE `elementos`.`template_id` = 52
+TRANSACTION (1.0ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.6ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Departamento' AND `departamentos`.`codigo` = 'TST' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.2ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'TST' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('TST', '2026-06-30 17:32:59.010015', 'Departamento', '2026-06-30 17:32:59.010015')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '123456789' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.3ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:59.011674', NULL, NULL, NULL, 232, 'admin@unb.br', NULL, '123456789', 'Admin', NULL, NULL, '123456', 'Administrador', '2026-06-30 17:32:59.011674')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' ORDER BY `usuarios`.`id` ASC LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Campo Exists? (0.3ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Template Create (0.2ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:32:59.014355', 'Template Prova Matemática 2º semestre', '2026-06-30 17:32:59.014355', 263)
+Elemento Create (0.2ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:32:59.014751', 'Questão Fantasma', 1, 53, '2026-06-30 17:32:59.014751')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:59.015135', 69, NULL, 1, 'Texto', '2026-06-30 17:32:59.015135')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Administrador Load (0.1ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' ORDER BY `usuarios`.`id` ASC LIMIT 1
+ +

Started GET “/admin/263/templates” for 127.0.0.1 at 2026-06-30 14:32:59 -0300 Processing by TemplatesController#index as HTML

+ +
Parameters: {"admin_id" => "263"}
+Rendering layout layouts/gerenciamento.html.erb
+Rendering templates/index.html.erb within layouts/gerenciamento
+Template Exists? (0.1ms)  SELECT 1 AS one FROM `templates` WHERE `templates`.`usuario_id` = 263 LIMIT 1
+Template Load (0.1ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`usuario_id` = 263
+Elemento Load (0.1ms)  SELECT `elementos`.* FROM `elementos` WHERE `elementos`.`template_id` = 53
+Campo Load (0.2ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` = 69
+Rendered templates/_grid.html.erb (Duration: 1.5ms | GC: 0.0ms)
+Rendered templates/index.html.erb within layouts/gerenciamento (Duration: 1.5ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 1.7ms | GC: 0.0ms)
+ +

Completed 200 OK in 3ms (Views: 1.4ms | ActiveRecord: 0.5ms (4 queries, 0 cached) | GC: 0.0ms) Started GET “/admin/263/templates/53/edit” for 127.0.0.1 at 2026-06-30 14:32:59 -0300 Processing by TemplatesController#edit as HTML

+ +
Parameters: {"admin_id" => "263", "id" => "53"}
+Template Load (0.2ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`usuario_id` = 263 AND `templates`.`id` = 53 LIMIT 1
+Elemento Exists? (0.1ms)  SELECT 1 AS one FROM `elementos` WHERE `elementos`.`template_id` = 53 LIMIT 1
+Rendering layout layouts/gerenciamento.html.erb
+Rendering templates/edit.html.erb within layouts/gerenciamento
+Template Exists? (0.1ms)  SELECT 1 AS one FROM `templates` WHERE `templates`.`usuario_id` = 263 LIMIT 1
+Template Load (0.1ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`usuario_id` = 263
+Rendered templates/_grid.html.erb (Duration: 0.7ms | GC: 0.0ms)
+Elemento Load (0.2ms)  SELECT `elementos`.* FROM `elementos` WHERE `elementos`.`template_id` = 53
+Campo Load (0.2ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` = 69
+Rendered templates/_form.html.erb (Duration: 1.2ms | GC: 0.0ms)
+Rendered templates/edit.html.erb within layouts/gerenciamento (Duration: 1.9ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 2.1ms | GC: 0.0ms)
+ +

Completed 200 OK in 3ms (Views: 1.6ms | ActiveRecord: 0.8ms (6 queries, 0 cached) | GC: 0.0ms) Started PATCH “/admin/263/templates/53” for 127.0.0.1 at 2026-06-30 14:32:59 -0300 Processing by TemplatesController#update as HTML

+ +
Parameters: {"template" => {"nome" => "", "elementos_attributes" => {"0" => {"ordem" => "1", "_destroy" => "false", "enunciado" => "Questão Fantasma", "campos_attributes" => {"0" => {"tipo_elemento" => "Texto", "ordem" => "1", "_destroy" => "false", "enunciado" => "", "id" => "100"}}, "id" => "69"}}}, "commit" => "Salvar", "admin_id" => "263", "id" => "53"}
+Template Load (0.3ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`usuario_id` = 263 AND `templates`.`id` = 53 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Elemento Load (0.4ms)  SELECT `elementos`.* FROM `elementos` WHERE `elementos`.`template_id` = 53 AND `elementos`.`id` = 69
+Campo Load (0.2ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` = 69 AND `campos`.`id` = 100
+Campo Exists? (0.2ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`id` != 100 AND `campos`.`elemento_id` = 69 LIMIT 1
+Elemento Load (0.1ms)  SELECT `elementos`.* FROM `elementos` WHERE `elementos`.`template_id` = 53
+TRANSACTION (0.1ms)  ROLLBACK TO SAVEPOINT active_record_1
+Rendering layout layouts/gerenciamento.html.erb
+Rendering templates/edit.html.erb within layouts/gerenciamento
+Rendered templates/_grid.html.erb (Duration: 0.3ms | GC: 0.0ms)
+Campo Load (0.2ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` = 69
+Rendered templates/_form.html.erb (Duration: 0.9ms | GC: 0.0ms)
+Rendered templates/edit.html.erb within layouts/gerenciamento (Duration: 1.2ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 1.4ms | GC: 0.0ms)
+ +

Completed 422 Unprocessable Content in 6ms (Views: 1.3ms | ActiveRecord: 3.1ms (6 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.3ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.4ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Departamento' AND `departamentos`.`codigo` = 'TST' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'TST' LIMIT 1
+Departamento Create (0.1ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('TST', '2026-06-30 17:32:59.036816', 'Departamento', '2026-06-30 17:32:59.036816')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Administrador Load (0.1ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '123456789' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.3ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:59.038397', NULL, NULL, NULL, 233, 'admin@unb.br', NULL, '123456789', 'Admin', NULL, NULL, '123456', 'Administrador', '2026-06-30 17:32:59.038397')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Administrador Load (0.1ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' ORDER BY `usuarios`.`id` ASC LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Campo Exists? (0.3ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Template Create (0.2ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:32:59.041103', 'Template Prova Matemática 2º semestre', '2026-06-30 17:32:59.041103', 264)
+Elemento Create (0.2ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:32:59.041562', 'Questão Fantasma', 1, 54, '2026-06-30 17:32:59.041562')
+Campo Create (0.3ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:59.041975', 70, NULL, 1, 'Texto', '2026-06-30 17:32:59.041975')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' ORDER BY `usuarios`.`id` ASC LIMIT 1
+ +

Started GET “/admin/264/templates” for 127.0.0.1 at 2026-06-30 14:32:59 -0300 Processing by TemplatesController#index as HTML

+ +
Parameters: {"admin_id" => "264"}
+Rendering layout layouts/gerenciamento.html.erb
+Rendering templates/index.html.erb within layouts/gerenciamento
+Template Exists? (0.2ms)  SELECT 1 AS one FROM `templates` WHERE `templates`.`usuario_id` = 264 LIMIT 1
+Template Load (0.2ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`usuario_id` = 264
+Elemento Load (0.2ms)  SELECT `elementos`.* FROM `elementos` WHERE `elementos`.`template_id` = 54
+Campo Load (0.2ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` = 70
+Rendered templates/_grid.html.erb (Duration: 1.7ms | GC: 0.0ms)
+Rendered templates/index.html.erb within layouts/gerenciamento (Duration: 1.7ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 2.0ms | GC: 0.0ms)
+ +

Completed 200 OK in 3ms (Views: 1.3ms | ActiveRecord: 0.8ms (4 queries, 0 cached) | GC: 0.0ms) Started DELETE “/admin/264/templates/54” for 127.0.0.1 at 2026-06-30 14:32:59 -0300 Processing by TemplatesController#destroy as HTML

+ +
Parameters: {"admin_id" => "264", "id" => "54"}
+Template Load (0.1ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`usuario_id` = 264 AND `templates`.`id` = 54 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Elemento Load (0.3ms)  SELECT `elementos`.* FROM `elementos` WHERE `elementos`.`template_id` = 54
+Campo Load (0.2ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` = 70
+Campo Destroy (0.2ms)  DELETE FROM `campos` WHERE `campos`.`id` = 101
+Elemento Destroy (0.2ms)  DELETE FROM `elementos` WHERE `elementos`.`id` = 70
+Template Destroy (0.2ms)  DELETE FROM `templates` WHERE `templates`.`id` = 54
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/admin/264/templates Completed 303 See Other in 3ms (ActiveRecord: 1.5ms (6 queries, 0 cached) | GC: 0.0ms) Started GET “/admin/264/templates” for 127.0.0.1 at 2026-06-30 14:32:59 -0300 Processing by TemplatesController#index as HTML

+ +
Parameters: {"admin_id" => "264"}
+Rendering layout layouts/gerenciamento.html.erb
+Rendering templates/index.html.erb within layouts/gerenciamento
+Template Exists? (0.2ms)  SELECT 1 AS one FROM `templates` WHERE `templates`.`usuario_id` = 264 LIMIT 1
+Rendered templates/_grid.html.erb (Duration: 0.5ms | GC: 0.0ms)
+Rendered templates/index.html.erb within layouts/gerenciamento (Duration: 0.5ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 0.7ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.7ms | ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.5ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'DEP01' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('DEP01', '2026-06-30 17:32:59.056176', 'Departamento de Computação', '2026-06-30 17:32:59.056176')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'ADM001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@teste.com' LIMIT 1
+ +

Redirected to www.example.com/admin/258/avaliacoes Completed 302 Found in 205ms (ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/” for 127.0.0.1 at 2026-06-30 14:32:59 -0300 Processing by SessionsController#new as HTML

+ +
Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 258 LIMIT 1
+ +

Redirected to www.example.com/admin/258/avaliacoes Completed 302 Found in 1ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Administrador Create (6.3ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:59.057667', NULL, NULL, NULL, 234, 'admin@teste.com', NULL, 'ADM001', 'Admin Teste', NULL, NULL, NULL, 'Administrador', '2026-06-30 17:32:59.057667')
+TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  BEGIN
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin@teste.com' LIMIT 1
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@teste.com' AND `usuarios`.`id` != 265 LIMIT 1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:59.065938', 'Ciência da Computação', '2026-06-30 17:32:59.065938')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm001' LIMIT 1
+Usuario Exists? (0.1ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Update (0.7ms)  UPDATE `usuarios` SET `usuarios`.`senha_hash` = '$2a$12$9yApbQ95vl7.3sqxwRCuH.CM7pFAQxfg2lLyrInpmO1fHInYHNOgO', `usuarios`.`updated_at` = '2026-06-30 17:32:59.262973' WHERE `usuarios`.`id` = 265
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/” for 127.0.0.1 at 2026-06-30 14:32:59 -0300 Processing by SessionsController#new as HTML

+ +
Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering sessions/new.html.erb within layouts/application
+Rendered sessions/new.html.erb within layouts/application (Duration: 0.2ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.5ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.6ms | ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:59 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin@teste.com", "senha" => "senha123", "commit" => "Entrar"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin@teste.com' LIMIT 1
+ +

Redirected to www.example.com/admin/265/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/admin/265/avaliacoes” for 127.0.0.1 at 2026-06-30 14:32:59 -0300 Processing by AdminController#avaliacoes as HTML

+ +
Parameters: {"admin_id" => "265"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 265 LIMIT 1
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 265 LIMIT 1
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/avaliacoes.html.erb within layouts/gerenciamento
+Formulario Load (0.3ms)  SELECT `formularios`.* FROM `formularios` INNER JOIN `turmas` ON `turmas`.`id` = `formularios`.`turma_id`
+Rendered admin/avaliacoes.html.erb within layouts/gerenciamento (Duration: 4.2ms | GC: 3.2ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 4.3ms | GC: 3.2ms)
+ +

Completed 200 OK in 6ms (Views: 4.2ms | ActiveRecord: 0.9ms (3 queries, 0 cached) | GC: 3.2ms) Started GET “/admin/265/resultados” for 127.0.0.1 at 2026-06-30 14:32:59 -0300 Processing by AdminController#resultados as HTML

+ +
Parameters: {"admin_id" => "265"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 265 LIMIT 1
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 265 LIMIT 1
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/resultados.html.erb within layouts/gerenciamento
+Formulario Eager Load (0.4ms)  SELECT `formularios`.`id` AS t0_r0, `formularios`.`created_at` AS t0_r1, `formularios`.`data_fim` AS t0_r2, `formularios`.`data_inicio` AS t0_r3, `formularios`.`nome` AS t0_r4, `formularios`.`titulo` AS t0_r5, `formularios`.`turma_id` AS t0_r6, `formularios`.`updated_at` AS t0_r7, `turmas`.`id` AS t1_r0, `turmas`.`created_at` AS t1_r1, `turmas`.`disciplina_id` AS t1_r2, `turmas`.`horario` AS t1_r3, `turmas`.`numero_da_turma` AS t1_r4, `turmas`.`semestre` AS t1_r5, `turmas`.`updated_at` AS t1_r6, `disciplinas`.`id` AS t2_r0, `disciplinas`.`codigo` AS t2_r1, `disciplinas`.`created_at` AS t2_r2, `disciplinas`.`departamento_id` AS t2_r3, `disciplinas`.`nome` AS t2_r4, `disciplinas`.`updated_at` AS t2_r5 FROM `formularios` INNER JOIN `turmas` ON `turmas`.`id` = `formularios`.`turma_id` INNER JOIN `disciplinas` ON `disciplinas`.`id` = `turmas`.`disciplina_id` WHERE `disciplinas`.`departamento_id` = 234
+Rendered admin/resultados.html.erb within layouts/gerenciamento (Duration: 0.9ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 1.3ms | GC: 0.2ms)
+ +

Completed 200 OK in 3ms (Views: 1.0ms | ActiveRecord: 0.9ms (3 queries, 0 cached) | GC: 0.2ms)

+ +
TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'ED001' LIMIT 1
+Disciplina Create (0.1ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('ED001', '2026-06-30 17:32:59.476481', 234, 'Estruturas de Dados', '2026-06-30 17:32:59.476481')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'Turma A' AND `turmas`.`semestre` = '2024.1' AND `turmas`.`disciplina_id` = 121 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:32:59.477603', 121, 'SEG 08:00-10:00', 'Turma A', '2024.1', '2026-06-30 17:32:59.477603')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.5ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:32:59.478241', NULL, NULL, NULL, NULL, 113, '2026-06-30 17:32:59.478241')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:32:59.479120', 'Como você avalia o professor?', 85, 1, NULL, '2026-06-30 17:32:59.479120')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.3ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:32:59.479859', 'Como você avalia a disciplina?', 85, 2, NULL, '2026-06-30 17:32:59.479859')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Curso Exists? (0.2ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`codigo` = 'CC01' LIMIT 1
+Curso Create (0.1ms)  INSERT INTO `cursos` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CC01', '2026-06-30 17:32:59.481043', 234, 'Ciência da Computação', '2026-06-30 17:32:59.481043')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'ALU001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'aluno@teste.com' LIMIT 1
+Discente Create (0.3ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:59.482214', 26, NULL, NULL, 234, 'aluno@teste.com', NULL, 'ALU001', 'Aluno Teste', NULL, NULL, NULL, 'Discente', '2026-06-30 17:32:59.482214')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+RespostaForm Exists? (0.4ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 267 AND `resposta_forms`.`formulario_id` = 85 LIMIT 1
+RespostaForm Create (0.2ms)  INSERT INTO `resposta_forms` (`created_at`, `data_submissao`, `formulario_id`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:32:59.488210', '2026-06-30', 85, '2026-06-30 17:32:59.488210', 267)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Campo Exists? (0.3ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.2ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 2 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Template Create (0.2ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:32:59.490032', 'Template Padrão', '2026-06-30 17:32:59.490032', 265)
+Elemento Create (0.2ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:32:59.490422', 'Avaliação', 1, 55, '2026-06-30 17:32:59.490422')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:59.490801', 71, 'Muito bom', 1, 'Múltipla Escolha', '2026-06-30 17:32:59.490801')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:59.491184', 71, 'Excelente', 2, 'Múltipla Escolha', '2026-06-30 17:32:59.491184')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`enunciado` = 'Muito bom' AND `campo_forms`.`elemento_form_id` = 60 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.4ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:59.492218', 60, 'Muito bom', 1, NULL, '2026-06-30 17:32:59.492218')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+CampoForm Load (0.3ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`enunciado` = 'Excelente' AND `campo_forms`.`elemento_form_id` = 60 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.4ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:59.493380', 60, 'Excelente', 2, NULL, '2026-06-30 17:32:59.493380')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+CampoForm Load (0.3ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`enunciado` = 'Muito bom' AND `campo_forms`.`elemento_form_id` = 61 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.3ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:59.494612', 61, 'Muito bom', 1, NULL, '2026-06-30 17:32:59.494612')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`enunciado` = 'Excelente' AND `campo_forms`.`elemento_form_id` = 61 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.3ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:32:59.495644', 61, 'Excelente', 2, NULL, '2026-06-30 17:32:59.495644')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` = 60 AND `campo_forms`.`enunciado` = 'Muito bom' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaElem Create (0.5ms)  INSERT INTO `resposta_elems` (`campo_form_id`, `created_at`, `elemento_form_id`, `resposta_form_id`, `texto_resposta`, `updated_at`) VALUES (44, '2026-06-30 17:32:59.501409', 60, 32, 'Muito bom', '2026-06-30 17:32:59.501409')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` = 61 AND `campo_forms`.`enunciado` = 'Excelente' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaElem Create (0.4ms)  INSERT INTO `resposta_elems` (`campo_form_id`, `created_at`, `elemento_form_id`, `resposta_form_id`, `texto_resposta`, `updated_at`) VALUES (47, '2026-06-30 17:32:59.502839', 61, 32, 'Excelente', '2026-06-30 17:32:59.502839')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/admin/265/resultados” for 127.0.0.1 at 2026-06-30 14:32:59 -0300 Processing by AdminController#resultados as HTML

+ +
Parameters: {"admin_id" => "265"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 265 LIMIT 1
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 265 LIMIT 1
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/resultados.html.erb within layouts/gerenciamento
+Formulario Eager Load (0.4ms)  SELECT `formularios`.`id` AS t0_r0, `formularios`.`created_at` AS t0_r1, `formularios`.`data_fim` AS t0_r2, `formularios`.`data_inicio` AS t0_r3, `formularios`.`nome` AS t0_r4, `formularios`.`titulo` AS t0_r5, `formularios`.`turma_id` AS t0_r6, `formularios`.`updated_at` AS t0_r7, `turmas`.`id` AS t1_r0, `turmas`.`created_at` AS t1_r1, `turmas`.`disciplina_id` AS t1_r2, `turmas`.`horario` AS t1_r3, `turmas`.`numero_da_turma` AS t1_r4, `turmas`.`semestre` AS t1_r5, `turmas`.`updated_at` AS t1_r6, `disciplinas`.`id` AS t2_r0, `disciplinas`.`codigo` AS t2_r1, `disciplinas`.`created_at` AS t2_r2, `disciplinas`.`departamento_id` AS t2_r3, `disciplinas`.`nome` AS t2_r4, `disciplinas`.`updated_at` AS t2_r5 FROM `formularios` INNER JOIN `turmas` ON `turmas`.`id` = `formularios`.`turma_id` INNER JOIN `disciplinas` ON `disciplinas`.`id` = `turmas`.`disciplina_id` WHERE `disciplinas`.`departamento_id` = 234
+Docente Load (0.6ms)  SELECT `usuarios`.* FROM `usuarios` INNER JOIN `docentes_turmas` ON `usuarios`.`id` = `docentes_turmas`.`docente_id` WHERE `usuarios`.`type` = 'Docente' AND `docentes_turmas`.`turma_id` = 113 ORDER BY `usuarios`.`id` ASC LIMIT 1
+Rendered admin/resultados.html.erb within layouts/gerenciamento (Duration: 4.4ms | GC: 0.1ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 4.6ms | GC: 0.1ms)
+ +

Completed 200 OK in 6ms (Views: 2.5ms | ActiveRecord: 2.7ms (4 queries, 0 cached) | GC: 0.1ms) Started GET “/admin/265/resultados/85/download.csv.csv” for 127.0.0.1 at 2026-06-30 14:32:59 -0300 Processing by AdminController#exportar_csv as CSV

+ +
Parameters: {"admin_id" => "265", "id" => "85"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 265 LIMIT 1
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 265 LIMIT 1
+Formulario Load (0.2ms)  SELECT `formularios`.* FROM `formularios` WHERE `formularios`.`id` = 85 LIMIT 1
+RespostaForm Exists? (0.2ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`formulario_id` = 85 LIMIT 1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`id` = 113 LIMIT 1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`id` = 121 LIMIT 1
+Rendering admin/exportar_csv.csv.erb
+ElementoForm Pluck (0.2ms)  SELECT `elemento_forms`.`enunciado` FROM `elemento_forms` WHERE `elemento_forms`.`formulario_id` = 85 ORDER BY `elemento_forms`.`ordem` ASC
+RespostaForm Load (0.2ms)  SELECT `resposta_forms`.* FROM `resposta_forms` WHERE `resposta_forms`.`formulario_id` = 85
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 267
+RespostaElem Load (0.1ms)  SELECT `resposta_elems`.* FROM `resposta_elems` WHERE `resposta_elems`.`resposta_form_id` = 32
+ElementoForm Load (0.1ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`id` IN (60, 61)
+Rendered admin/exportar_csv.csv.erb (Duration: 2.3ms | GC: 0.1ms)
+ +

Completed 200 OK in 6ms (Views: 2.4ms | ActiveRecord: 2.0ms (11 queries, 0 cached) | GC: 0.1ms)

+ +
ElementoForm Load (0.2ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`formulario_id` = 85 ORDER BY `elemento_forms`.`ordem` ASC
+RespostaElem Load (0.2ms)  SELECT `resposta_elems`.* FROM `resposta_elems` WHERE `resposta_elems`.`resposta_form_id` = 32
+Administrador Create (255.3ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:59.264701', NULL, NULL, NULL, 235, 'admin@unb.br', NULL, 'adm001', 'Admin Teste', NULL, NULL, '$2a$12$dPEFV6iY512uY9dQokbG2.CyQG.78jTCyxVT5/B1GY1FZTCPp.Bee', 'Administrador', '2026-06-30 17:32:59.264701')
+TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Departamento Exists? (0.5ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'DEP01' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('DEP01', '2026-06-30 17:32:59.522068', 'Departamento de Computação', '2026-06-30 17:32:59.522068')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'ADM001' LIMIT 1
+Usuario Exists? (0.1ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@teste.com' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:59.710105', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Prof Teste', NULL, NULL, '$2a$12$bC5g1x3S8N9TGnfKSzaSh.jrpMO2SIHjzZYGAutCj7Cj.Je9CQp2G', 'Docente', '2026-06-30 17:32:59.710105')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:32:59 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "prof@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/269/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/” for 127.0.0.1 at 2026-06-30 14:32:59 -0300 Processing by SessionsController#new as HTML

+ +
Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 269 LIMIT 1
+ +

Redirected to www.example.com/usuarios/269/avaliacoes Completed 302 Found in 1ms (ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Administrador Create (380.3ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:32:59.523183', NULL, NULL, NULL, 236, 'admin@teste.com', NULL, 'ADM001', 'Admin Teste', NULL, NULL, NULL, 'Administrador', '2026-06-30 17:32:59.523183')
+TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  BEGIN
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin@teste.com' LIMIT 1
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@teste.com' AND `usuarios`.`id` != 268 LIMIT 1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:32:59.905766', 'Ciência da Computação', '2026-06-30 17:32:59.905766')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Update (0.4ms)  UPDATE `usuarios` SET `usuarios`.`senha_hash` = '$2a$12$EekDYxwSeboxIK6kDvYJOet.n3J1z56x7ynsnFn9CpOYZ61eA14QK', `usuarios`.`updated_at` = '2026-06-30 17:33:00.099393' WHERE `usuarios`.`id` = 268
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/” for 127.0.0.1 at 2026-06-30 14:33:00 -0300 Processing by SessionsController#new as HTML

+ +
Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering sessions/new.html.erb within layouts/application
+Rendered sessions/new.html.erb within layouts/application (Duration: 0.2ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.6ms | ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started POST “/login” for 127.0.0.1 at 2026-06-30 14:33:00 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin@teste.com", "senha" => "senha123", "commit" => "Entrar"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin@teste.com' LIMIT 1
+ +

Redirected to www.example.com/admin/268/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/admin/268/avaliacoes” for 127.0.0.1 at 2026-06-30 14:33:00 -0300 Processing by AdminController#avaliacoes as HTML

+ +
Parameters: {"admin_id" => "268"}
+Usuario Load (0.5ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 268 LIMIT 1
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 268 LIMIT 1
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/avaliacoes.html.erb within layouts/gerenciamento
+Formulario Load (0.3ms)  SELECT `formularios`.* FROM `formularios` INNER JOIN `turmas` ON `turmas`.`id` = `formularios`.`turma_id`
+Rendered admin/avaliacoes.html.erb within layouts/gerenciamento (Duration: 0.7ms | GC: 0.1ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 0.9ms | GC: 0.1ms)
+ +

Completed 200 OK in 2ms (Views: 0.7ms | ActiveRecord: 1.1ms (3 queries, 0 cached) | GC: 0.1ms) Started GET “/admin/268/resultados” for 127.0.0.1 at 2026-06-30 14:33:00 -0300 Processing by AdminController#resultados as HTML

+ +
Parameters: {"admin_id" => "268"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 268 LIMIT 1
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 268 LIMIT 1
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/resultados.html.erb within layouts/gerenciamento
+Formulario Eager Load (0.5ms)  SELECT `formularios`.`id` AS t0_r0, `formularios`.`created_at` AS t0_r1, `formularios`.`data_fim` AS t0_r2, `formularios`.`data_inicio` AS t0_r3, `formularios`.`nome` AS t0_r4, `formularios`.`titulo` AS t0_r5, `formularios`.`turma_id` AS t0_r6, `formularios`.`updated_at` AS t0_r7, `turmas`.`id` AS t1_r0, `turmas`.`created_at` AS t1_r1, `turmas`.`disciplina_id` AS t1_r2, `turmas`.`horario` AS t1_r3, `turmas`.`numero_da_turma` AS t1_r4, `turmas`.`semestre` AS t1_r5, `turmas`.`updated_at` AS t1_r6, `disciplinas`.`id` AS t2_r0, `disciplinas`.`codigo` AS t2_r1, `disciplinas`.`created_at` AS t2_r2, `disciplinas`.`departamento_id` AS t2_r3, `disciplinas`.`nome` AS t2_r4, `disciplinas`.`updated_at` AS t2_r5 FROM `formularios` INNER JOIN `turmas` ON `turmas`.`id` = `formularios`.`turma_id` INNER JOIN `disciplinas` ON `disciplinas`.`id` = `turmas`.`disciplina_id` WHERE `disciplinas`.`departamento_id` = 236
+Rendered admin/resultados.html.erb within layouts/gerenciamento (Duration: 0.8ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 0.9ms | GC: 0.0ms)
+ +

Completed 200 OK in 2ms (Views: 0.6ms | ActiveRecord: 1.0ms (3 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'ED001' LIMIT 1
+Disciplina Create (0.3ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('ED001', '2026-06-30 17:33:00.300789', 236, 'Estruturas de Dados', '2026-06-30 17:33:00.300789')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'Turma A' AND `turmas`.`semestre` = '2024.1' AND `turmas`.`disciplina_id` = 122 LIMIT 1
+Turma Create (0.3ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:33:00.302200', 122, 'SEG 08:00-10:00', 'Turma A', '2024.1', '2026-06-30 17:33:00.302200')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:33:00.302883', NULL, NULL, NULL, NULL, 114, '2026-06-30 17:33:00.302883')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:33:00.303698', 'Como você avalia o professor?', 86, 1, NULL, '2026-06-30 17:33:00.303698')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:33:00.304467', 'Como você avalia a disciplina?', 86, 2, NULL, '2026-06-30 17:33:00.304467')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Curso Exists? (0.3ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`codigo` = 'CC01' LIMIT 1
+Curso Create (0.2ms)  INSERT INTO `cursos` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CC01', '2026-06-30 17:33:00.305679', 236, 'Ciência da Computação', '2026-06-30 17:33:00.305679')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'ALU001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'aluno@teste.com' LIMIT 1
+Discente Create (0.3ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:00.307034', 27, NULL, NULL, 236, 'aluno@teste.com', NULL, 'ALU001', 'Aluno Teste', NULL, NULL, NULL, 'Discente', '2026-06-30 17:33:00.307034')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaForm Exists? (0.5ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 271 AND `resposta_forms`.`formulario_id` = 86 LIMIT 1
+RespostaForm Create (0.3ms)  INSERT INTO `resposta_forms` (`created_at`, `data_submissao`, `formulario_id`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:33:00.308449', '2026-06-30', 86, '2026-06-30 17:33:00.308449', 271)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Campo Exists? (0.3ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Campo Exists? (0.1ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 2 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Template Create (0.2ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:33:00.310252', 'Template Padrão', '2026-06-30 17:33:00.310252', 268)
+Elemento Create (0.2ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:33:00.310635', 'Avaliação', 1, 56, '2026-06-30 17:33:00.310635')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:33:00.310999', 72, 'Muito bom', 1, 'Múltipla Escolha', '2026-06-30 17:33:00.310999')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:33:00.311434', 72, 'Excelente', 2, 'Múltipla Escolha', '2026-06-30 17:33:00.311434')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`enunciado` = 'Muito bom' AND `campo_forms`.`elemento_form_id` = 62 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.3ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:33:00.312413', 62, 'Muito bom', 1, NULL, '2026-06-30 17:33:00.312413')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`enunciado` = 'Excelente' AND `campo_forms`.`elemento_form_id` = 62 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.3ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:33:00.313459', 62, 'Excelente', 2, NULL, '2026-06-30 17:33:00.313459')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`enunciado` = 'Muito bom' AND `campo_forms`.`elemento_form_id` = 63 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.3ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:33:00.314484', 63, 'Muito bom', 1, NULL, '2026-06-30 17:33:00.314484')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`enunciado` = 'Excelente' AND `campo_forms`.`elemento_form_id` = 63 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.3ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:33:00.315505', 63, 'Excelente', 2, NULL, '2026-06-30 17:33:00.315505')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` = 62 AND `campo_forms`.`enunciado` = 'Muito bom' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaElem Create (0.2ms)  INSERT INTO `resposta_elems` (`campo_form_id`, `created_at`, `elemento_form_id`, `resposta_form_id`, `texto_resposta`, `updated_at`) VALUES (48, '2026-06-30 17:33:00.316653', 62, 33, 'Muito bom', '2026-06-30 17:33:00.316653')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+CampoForm Load (0.1ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` = 63 AND `campo_forms`.`enunciado` = 'Excelente' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaElem Create (0.4ms)  INSERT INTO `resposta_elems` (`campo_form_id`, `created_at`, `elemento_form_id`, `resposta_form_id`, `texto_resposta`, `updated_at`) VALUES (51, '2026-06-30 17:33:00.317457', 63, 33, 'Excelente', '2026-06-30 17:33:00.317457')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/admin/268/resultados” for 127.0.0.1 at 2026-06-30 14:33:00 -0300 Processing by AdminController#resultados as HTML

+ +
Parameters: {"admin_id" => "268"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 268 LIMIT 1
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 268 LIMIT 1
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/resultados.html.erb within layouts/gerenciamento
+Formulario Eager Load (0.4ms)  SELECT `formularios`.`id` AS t0_r0, `formularios`.`created_at` AS t0_r1, `formularios`.`data_fim` AS t0_r2, `formularios`.`data_inicio` AS t0_r3, `formularios`.`nome` AS t0_r4, `formularios`.`titulo` AS t0_r5, `formularios`.`turma_id` AS t0_r6, `formularios`.`updated_at` AS t0_r7, `turmas`.`id` AS t1_r0, `turmas`.`created_at` AS t1_r1, `turmas`.`disciplina_id` AS t1_r2, `turmas`.`horario` AS t1_r3, `turmas`.`numero_da_turma` AS t1_r4, `turmas`.`semestre` AS t1_r5, `turmas`.`updated_at` AS t1_r6, `disciplinas`.`id` AS t2_r0, `disciplinas`.`codigo` AS t2_r1, `disciplinas`.`created_at` AS t2_r2, `disciplinas`.`departamento_id` AS t2_r3, `disciplinas`.`nome` AS t2_r4, `disciplinas`.`updated_at` AS t2_r5 FROM `formularios` INNER JOIN `turmas` ON `turmas`.`id` = `formularios`.`turma_id` INNER JOIN `disciplinas` ON `disciplinas`.`id` = `turmas`.`disciplina_id` WHERE `disciplinas`.`departamento_id` = 236
+Docente Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` INNER JOIN `docentes_turmas` ON `usuarios`.`id` = `docentes_turmas`.`docente_id` WHERE `usuarios`.`type` = 'Docente' AND `docentes_turmas`.`turma_id` = 114 ORDER BY `usuarios`.`id` ASC LIMIT 1
+Rendered admin/resultados.html.erb within layouts/gerenciamento (Duration: 1.4ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 1.5ms | GC: 0.0ms)
+ +

Completed 200 OK in 2ms (Views: 1.0ms | ActiveRecord: 1.0ms (4 queries, 0 cached) | GC: 0.0ms)

+ +
Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'Turma A' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:33:00.321617', NULL, NULL, NULL, NULL, 114, '2026-06-30 17:33:00.321617')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.3ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:33:00.322366', 'Pergunta sem respostas', 87, 1, NULL, '2026-06-30 17:33:00.322366')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+RespostaForm Count (0.2ms)  SELECT COUNT(*) FROM `resposta_forms` WHERE `resposta_forms`.`formulario_id` = 87
+ +

Started GET “/admin/268/resultados” for 127.0.0.1 at 2026-06-30 14:33:00 -0300 Processing by AdminController#resultados as HTML

+ +
Parameters: {"admin_id" => "268"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 268 LIMIT 1
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 268 LIMIT 1
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/resultados.html.erb within layouts/gerenciamento
+Formulario Eager Load (0.4ms)  SELECT `formularios`.`id` AS t0_r0, `formularios`.`created_at` AS t0_r1, `formularios`.`data_fim` AS t0_r2, `formularios`.`data_inicio` AS t0_r3, `formularios`.`nome` AS t0_r4, `formularios`.`titulo` AS t0_r5, `formularios`.`turma_id` AS t0_r6, `formularios`.`updated_at` AS t0_r7, `turmas`.`id` AS t1_r0, `turmas`.`created_at` AS t1_r1, `turmas`.`disciplina_id` AS t1_r2, `turmas`.`horario` AS t1_r3, `turmas`.`numero_da_turma` AS t1_r4, `turmas`.`semestre` AS t1_r5, `turmas`.`updated_at` AS t1_r6, `disciplinas`.`id` AS t2_r0, `disciplinas`.`codigo` AS t2_r1, `disciplinas`.`created_at` AS t2_r2, `disciplinas`.`departamento_id` AS t2_r3, `disciplinas`.`nome` AS t2_r4, `disciplinas`.`updated_at` AS t2_r5 FROM `formularios` INNER JOIN `turmas` ON `turmas`.`id` = `formularios`.`turma_id` INNER JOIN `disciplinas` ON `disciplinas`.`id` = `turmas`.`disciplina_id` WHERE `disciplinas`.`departamento_id` = 236
+Docente Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` INNER JOIN `docentes_turmas` ON `usuarios`.`id` = `docentes_turmas`.`docente_id` WHERE `usuarios`.`type` = 'Docente' AND `docentes_turmas`.`turma_id` = 114 ORDER BY `usuarios`.`id` ASC LIMIT 1
+CACHE Docente Load (0.0ms)  SELECT `usuarios`.* FROM `usuarios` INNER JOIN `docentes_turmas` ON `usuarios`.`id` = `docentes_turmas`.`docente_id` WHERE `usuarios`.`type` = 'Docente' AND `docentes_turmas`.`turma_id` = 114 ORDER BY `usuarios`.`id` ASC LIMIT 1
+Rendered admin/resultados.html.erb within layouts/gerenciamento (Duration: 1.6ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 1.7ms | GC: 0.0ms)
+ +

Completed 200 OK in 3ms (Views: 1.1ms | ActiveRecord: 1.1ms (5 queries, 1 cached) | GC: 0.1ms) Started GET “/admin/268/resultados/87/download.csv.csv” for 127.0.0.1 at 2026-06-30 14:33:00 -0300 Processing by AdminController#exportar_csv as CSV

+ +
Parameters: {"admin_id" => "268", "id" => "87"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 268 LIMIT 1
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 268 LIMIT 1
+Formulario Load (0.2ms)  SELECT `formularios`.* FROM `formularios` WHERE `formularios`.`id` = 87 LIMIT 1
+RespostaForm Exists? (0.2ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`formulario_id` = 87 LIMIT 1
+ +

Redirected to www.example.com/admin/268/resultados Completed 302 Found in 1ms (ActiveRecord: 0.8ms (4 queries, 0 cached) | GC: 0.0ms) Started GET “/admin/268/resultados” for 127.0.0.1 at 2026-06-30 14:33:00 -0300 Processing by AdminController#resultados as HTML

+ +
Parameters: {"admin_id" => "268"}
+Usuario Load (0.1ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 268 LIMIT 1
+Administrador Load (0.1ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 268 LIMIT 1
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/resultados.html.erb within layouts/gerenciamento
+Formulario Eager Load (0.3ms)  SELECT `formularios`.`id` AS t0_r0, `formularios`.`created_at` AS t0_r1, `formularios`.`data_fim` AS t0_r2, `formularios`.`data_inicio` AS t0_r3, `formularios`.`nome` AS t0_r4, `formularios`.`titulo` AS t0_r5, `formularios`.`turma_id` AS t0_r6, `formularios`.`updated_at` AS t0_r7, `turmas`.`id` AS t1_r0, `turmas`.`created_at` AS t1_r1, `turmas`.`disciplina_id` AS t1_r2, `turmas`.`horario` AS t1_r3, `turmas`.`numero_da_turma` AS t1_r4, `turmas`.`semestre` AS t1_r5, `turmas`.`updated_at` AS t1_r6, `disciplinas`.`id` AS t2_r0, `disciplinas`.`codigo` AS t2_r1, `disciplinas`.`created_at` AS t2_r2, `disciplinas`.`departamento_id` AS t2_r3, `disciplinas`.`nome` AS t2_r4, `disciplinas`.`updated_at` AS t2_r5 FROM `formularios` INNER JOIN `turmas` ON `turmas`.`id` = `formularios`.`turma_id` INNER JOIN `disciplinas` ON `disciplinas`.`id` = `turmas`.`disciplina_id` WHERE `disciplinas`.`departamento_id` = 236
+Docente Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` INNER JOIN `docentes_turmas` ON `usuarios`.`id` = `docentes_turmas`.`docente_id` WHERE `usuarios`.`type` = 'Docente' AND `docentes_turmas`.`turma_id` = 114 ORDER BY `usuarios`.`id` ASC LIMIT 1
+CACHE Docente Load (0.0ms)  SELECT `usuarios`.* FROM `usuarios` INNER JOIN `docentes_turmas` ON `usuarios`.`id` = `docentes_turmas`.`docente_id` WHERE `usuarios`.`type` = 'Docente' AND `docentes_turmas`.`turma_id` = 114 ORDER BY `usuarios`.`id` ASC LIMIT 1
+Rendered admin/resultados.html.erb within layouts/gerenciamento (Duration: 1.6ms | GC: 0.1ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 1.8ms | GC: 0.1ms)
+ +

Completed 200 OK in 2ms (Views: 1.3ms | ActiveRecord: 0.8ms (5 queries, 1 cached) | GC: 0.1ms)

+ +
TRANSACTION (0.4ms)  ROLLBACK
+Administrador Create (233.1ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:00.100789', NULL, NULL, NULL, 237, 'admin@unb.br', NULL, 'adm001', 'Admin Teste', NULL, NULL, '$2a$12$7FigXajYcN9HUB6wLxgT0eG0MhVHGQJu6hrx7ENU08dxMg/zgouXq', 'Administrador', '2026-06-30 17:33:00.100789')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+TRANSACTION (0.1ms)  BEGIN
+Usuario Exists? (0.1ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` ORDER BY `departamentos`.`id` ASC LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.2ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:00.524016', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Prof Teste', NULL, NULL, '$2a$12$d2Ow/RF7Tyk2k3q4VUqTzuOMTU1wQwY5G17ellhYBcumBFxIk.tzm', 'Docente', '2026-06-30 17:33:00.524016')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:33:00 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "", "senha" => "Senha123"}
+ +

Redirected to www.example.com/ Completed 302 Found in 0ms (ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 0.0ms) Started GET “/” for 127.0.0.1 at 2026-06-30 14:33:00 -0300 Processing by SessionsController#new as HTML

+ +
Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering sessions/new.html.erb within layouts/application
+Rendered sessions/new.html.erb within layouts/application (Duration: 0.2ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.6ms | ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Departamento Create (192.6ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:33:00.336251', 'Ciência da Computação', '2026-06-30 17:33:00.336251')
+TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  BEGIN
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' ORDER BY `usuarios`.`id` ASC LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'admin' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@teste.com' LIMIT 1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Administrador Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:00.718399', NULL, NULL, NULL, 238, 'admin@teste.com', NULL, 'admin', 'Admin Teste', NULL, NULL, '$2a$12$596jk1S37zt9JSfXnZv7EuKUlm5RGLkq8Wc23MixOnSZWqEUBj5Uu', 'Administrador', '2026-06-30 17:33:00.718399')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/admin/273/gerenciamento” for 127.0.0.1 at 2026-06-30 14:33:00 -0300 Processing by AdminController#gerenciamento as HTML

+ +
Parameters: {"admin_id" => "273"}
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 273 LIMIT 1
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/gerenciamento.html.erb within layouts/gerenciamento
+Rendered admin/gerenciamento.html.erb within layouts/gerenciamento (Duration: 0.2ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 0.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.6ms | ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started POST “/admin/273/sincronizar_sigaa” for 127.0.0.1 at 2026-06-30 14:33:00 -0300 Processing by AdminController#sincronizar_sigaa as HTML

+ +
Parameters: {"acao" => "importar", "arquivo_classes" => #<ActionDispatch::Http::UploadedFile:0x000000010f6ec6d8 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-99683-xr9gky.json>, @content_type="application/json", @original_filename="classes.json", @headers="content-disposition: form-data; name=\"arquivo_classes\"; filename=\"classes.json\"\r\ncontent-type: application/json\r\ncontent-length: 611\r\n">, "arquivo_membros" => #<ActionDispatch::Http::UploadedFile:0x000000010f6ec548 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-99683-djhspb.json>, @content_type="application/json", @original_filename="classes.json", @headers="content-disposition: form-data; name=\"arquivo_membros\"; filename=\"classes.json\"\r\ncontent-type: application/json\r\ncontent-length: 611\r\n">, "admin_id" => "273"}
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 273 LIMIT 1
+ +

Redirected to www.example.com/admin/273/gerenciamento Completed 302 Found in 1ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/admin/273/gerenciamento” for 127.0.0.1 at 2026-06-30 14:33:00 -0300 Processing by AdminController#gerenciamento as HTML

+ +
Parameters: {"admin_id" => "273"}
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 273 LIMIT 1
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/gerenciamento.html.erb within layouts/gerenciamento
+Rendered admin/gerenciamento.html.erb within layouts/gerenciamento (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 0.3ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.4ms | ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Departamento Create (197.1ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:33:00.531091', 'Ciência da Computação', '2026-06-30 17:33:00.531091')
+TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm001' LIMIT 1
+Usuario Exists? (0.1ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` ORDER BY `departamentos`.`id` ASC LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Administrador Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:00.918402', NULL, NULL, NULL, 239, 'admin@unb.br', NULL, 'adm001', 'Admin Teste', NULL, NULL, '$2a$12$k2OFy6mnDh2S9G3Rar5mlupWXeUzliSdmkHsYRAFCizi/mxxSfazC', 'Administrador', '2026-06-30 17:33:00.918402')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.5ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:01.108432', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Prof Teste', NULL, NULL, '$2a$12$hoIONlYylGd7aBh0G8MTweZufGQ0e7nfjMiXUN39F//4BqN0aP/iK', 'Docente', '2026-06-30 17:33:01.108432')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:33:01 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "prof@unb.br", "senha" => ""}
+ +

Redirected to www.example.com/ Completed 302 Found in 0ms (ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 0.0ms) Started GET “/” for 127.0.0.1 at 2026-06-30 14:33:01 -0300 Processing by SessionsController#new as HTML

+ +
Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering sessions/new.html.erb within layouts/application
+Rendered sessions/new.html.erb within layouts/application (Duration: 0.2ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.6ms | ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Departamento Create (382.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:33:00.730648', 'Ciência da Computação', '2026-06-30 17:33:00.730648')
+TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  BEGIN
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' ORDER BY `usuarios`.`id` ASC LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'admin' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@teste.com' LIMIT 1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:01.303004', NULL, NULL, NULL, 240, 'admin@teste.com', NULL, 'admin', 'Admin Teste', NULL, NULL, '$2a$12$oRMm5GgN5Tt9ZIJqW5YXFe/4hhakhvoFH2uE7Za/9LM5v/qjhx5oi', 'Administrador', '2026-06-30 17:33:01.303004')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/admin/276/gerenciamento” for 127.0.0.1 at 2026-06-30 14:33:01 -0300 Processing by AdminController#gerenciamento as HTML

+ +
Parameters: {"admin_id" => "276"}
+Administrador Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 276 LIMIT 1
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/gerenciamento.html.erb within layouts/gerenciamento
+Rendered admin/gerenciamento.html.erb within layouts/gerenciamento (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 0.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.5ms | ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms) Started POST “/admin/276/sincronizar_sigaa” for 127.0.0.1 at 2026-06-30 14:33:01 -0300 Processing by AdminController#sincronizar_sigaa as HTML

+ +
Parameters: {"acao" => "importar", "arquivo_classes" => #<ActionDispatch::Http::UploadedFile:0x000000010d6346c0 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-99683-q4e4pt.json>, @content_type="application/json", @original_filename="classes.json", @headers="content-disposition: form-data; name=\"arquivo_classes\"; filename=\"classes.json\"\r\ncontent-type: application/json\r\ncontent-length: 611\r\n">, "arquivo_membros" => #<ActionDispatch::Http::UploadedFile:0x000000010d634620 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-99683-ns3jgw.json>, @content_type="application/json", @original_filename="classes.json", @headers="content-disposition: form-data; name=\"arquivo_membros\"; filename=\"classes.json\"\r\ncontent-type: application/json\r\ncontent-length: 611\r\n">, "admin_id" => "276"}
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 276 LIMIT 1
+ +

Redirected to www.example.com/admin/276/gerenciamento Completed 302 Found in 1ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/admin/276/gerenciamento” for 127.0.0.1 at 2026-06-30 14:33:01 -0300 Processing by AdminController#gerenciamento as HTML

+ +
Parameters: {"admin_id" => "276"}
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 276 LIMIT 1
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/gerenciamento.html.erb within layouts/gerenciamento
+Rendered admin/gerenciamento.html.erb within layouts/gerenciamento (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 0.3ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.4ms | ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+Departamento Create (197.8ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:33:01.115060', 'Ciência da Computação', '2026-06-30 17:33:01.115060')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.3ms)  SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  BEGIN
+Usuario Exists? (0.6ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm001' LIMIT 1
+Departamento Load (0.5ms)  SELECT `departamentos`.* FROM `departamentos` ORDER BY `departamentos`.`id` ASC LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Administrador Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:01.502813', NULL, NULL, NULL, 241, 'admin@unb.br', NULL, 'adm001', 'Admin Teste', NULL, NULL, '$2a$12$8WN.iM4dseNsO5HWriJqqeJLiHKsm.8miIEf0Fqo.fI8G9af0rSJC', 'Administrador', '2026-06-30 17:33:01.502813')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.5ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:01.692796', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Prof Teste', NULL, NULL, '$2a$12$b6r99ufxjyYzam1jjLLpS.z3rxZfNyMI9NsDZRX5p4IC1D8FX3sry', 'Docente', '2026-06-30 17:33:01.692796')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:33:01 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "naoexiste@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'naoexiste@unb.br' LIMIT 1
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`matricula` = 'naoexiste@unb.br' LIMIT 1
+ +

Redirected to www.example.com/ Completed 302 Found in 1ms (ActiveRecord: 0.6ms (2 queries, 0 cached) | GC: 0.0ms) Started GET “/” for 127.0.0.1 at 2026-06-30 14:33:01 -0300 Processing by SessionsController#new as HTML

+ +
Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering sessions/new.html.erb within layouts/application
+Rendered sessions/new.html.erb within layouts/application (Duration: 0.2ms | GC: 0.1ms)
+Rendered layout layouts/application.html.erb (Duration: 0.5ms | GC: 0.1ms)
+ +

Completed 200 OK in 1ms (Views: 0.6ms | ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.1ms)

+ +
Departamento Create (382.9ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:33:01.315048', 'Ciência da Computação', '2026-06-30 17:33:01.315048')
+TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  BEGIN
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' ORDER BY `usuarios`.`id` ASC LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'admin' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@teste.com' LIMIT 1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:01.890042', NULL, NULL, NULL, 242, 'admin@teste.com', NULL, 'admin', 'Admin Teste', NULL, NULL, '$2a$12$kdpszpH0wjmVtDy4p1Gu6OMobkiGlEmiqbYsjM7ccwSZP2tO6RbHW', 'Administrador', '2026-06-30 17:33:01.890042')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/admin/279/gerenciamento” for 127.0.0.1 at 2026-06-30 14:33:01 -0300 Processing by AdminController#gerenciamento as HTML

+ +
Parameters: {"admin_id" => "279"}
+Administrador Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 279 LIMIT 1
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/gerenciamento.html.erb within layouts/gerenciamento
+Rendered admin/gerenciamento.html.erb within layouts/gerenciamento (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 0.3ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.5ms | ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms) Started POST “/admin/279/sincronizar_sigaa” for 127.0.0.1 at 2026-06-30 14:33:01 -0300 Processing by AdminController#sincronizar_sigaa as HTML

+ +
Parameters: {"acao" => "importar", "arquivo_classes" => #<ActionDispatch::Http::UploadedFile:0x000000011a688ad8 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-99683-9pyx01.json>, @content_type="application/json", @original_filename="classes.json", @headers="content-disposition: form-data; name=\"arquivo_classes\"; filename=\"classes.json\"\r\ncontent-type: application/json\r\ncontent-length: 611\r\n">, "arquivo_membros" => #<ActionDispatch::Http::UploadedFile:0x000000011a688a38 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-99683-m1gruc.json>, @content_type="application/json", @original_filename="classes.json", @headers="content-disposition: form-data; name=\"arquivo_membros\"; filename=\"classes.json\"\r\ncontent-type: application/json\r\ncontent-length: 611\r\n">, "admin_id" => "279"}
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 279 LIMIT 1
+ +

Redirected to www.example.com/admin/279/gerenciamento Completed 302 Found in 1ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/admin/279/gerenciamento” for 127.0.0.1 at 2026-06-30 14:33:01 -0300 Processing by AdminController#gerenciamento as HTML

+ +
Parameters: {"admin_id" => "279"}
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 279 LIMIT 1
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/gerenciamento.html.erb within layouts/gerenciamento
+Rendered admin/gerenciamento.html.erb within layouts/gerenciamento (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 0.3ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.4ms | ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.3ms)  ROLLBACK
+Departamento Create (199.7ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:33:01.700111', 'Ciência da Computação', '2026-06-30 17:33:01.700111')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm001' LIMIT 1
+TRANSACTION (0.1ms)  BEGIN
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` ORDER BY `departamentos`.`id` ASC LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:02.089548', NULL, NULL, NULL, 243, 'admin@unb.br', NULL, 'adm001', 'Admin Teste', NULL, NULL, '$2a$12$4S5CHi.JVTq824i2f2NiX.4zoayR81CRI1TwD6DkQ8uPw3AyPLzRy', 'Administrador', '2026-06-30 17:33:02.089548')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:02.279296', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Prof Teste', NULL, NULL, '$2a$12$60zuEmPDzIA2PucjLEpWf.ItFJdc9MQ4PsteSZUehr9nxR.38qxtO', 'Docente', '2026-06-30 17:33:02.279296')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:33:02 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "prof@unb.br", "senha" => "errada"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+ +

Redirected to www.example.com/ Completed 302 Found in 189ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/” for 127.0.0.1 at 2026-06-30 14:33:02 -0300 Processing by SessionsController#new as HTML

+ +
Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering sessions/new.html.erb within layouts/application
+Rendered sessions/new.html.erb within layouts/application (Duration: 0.2ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 2ms (Views: 0.6ms | ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Departamento Create (570.8ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:33:01.901845', 'Ciência da Computação', '2026-06-30 17:33:01.901845')
+TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' ORDER BY `usuarios`.`id` ASC LIMIT 1
+TRANSACTION (0.2ms)  BEGIN
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'admin' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@teste.com' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:02.662804', NULL, NULL, NULL, 244, 'admin@teste.com', NULL, 'admin', 'Admin Teste', NULL, NULL, '$2a$12$aiFK2wJglhHS.X8t4KslveGe4q1OyREPh1ld/1ryJ5/YslXzzKWve', 'Administrador', '2026-06-30 17:33:02.662804')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/admin/282/gerenciamento” for 127.0.0.1 at 2026-06-30 14:33:02 -0300 Processing by AdminController#gerenciamento as HTML

+ +
Parameters: {"admin_id" => "282"}
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 282 LIMIT 1
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/gerenciamento.html.erb within layouts/gerenciamento
+Rendered admin/gerenciamento.html.erb within layouts/gerenciamento (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 0.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.5ms | ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started POST “/admin/282/sincronizar_sigaa” for 127.0.0.1 at 2026-06-30 14:33:02 -0300 Processing by AdminController#sincronizar_sigaa as HTML

+ +
Parameters: {"acao" => "importar", "arquivo_classes" => #<ActionDispatch::Http::UploadedFile:0x000000011a2c4d98 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-99683-n3w39a.json>, @content_type="application/json", @original_filename="classes.json", @headers="content-disposition: form-data; name=\"arquivo_classes\"; filename=\"classes.json\"\r\ncontent-type: application/json\r\ncontent-length: 611\r\n">, "arquivo_membros" => #<ActionDispatch::Http::UploadedFile:0x000000011a2c4d48 @tempfile=#<Tempfile:/var/folders/nf/cwdyk9z10qbbmjq2bftw_37r0000gn/T/RackMultipart20260630-99683-q4rxmb.json>, @content_type="application/json", @original_filename="classes.json", @headers="content-disposition: form-data; name=\"arquivo_membros\"; filename=\"classes.json\"\r\ncontent-type: application/json\r\ncontent-length: 611\r\n">, "admin_id" => "282"}
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 282 LIMIT 1
+ +

Redirected to www.example.com/admin/282/gerenciamento Completed 302 Found in 1ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/admin/282/gerenciamento” for 127.0.0.1 at 2026-06-30 14:33:02 -0300 Processing by AdminController#gerenciamento as HTML

+ +
Parameters: {"admin_id" => "282"}
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 282 LIMIT 1
+Rendering layout layouts/gerenciamento.html.erb
+Rendering admin/gerenciamento.html.erb within layouts/gerenciamento
+Rendered admin/gerenciamento.html.erb within layouts/gerenciamento (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 0.3ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.4ms | ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Departamento Create (197.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:33:02.475046', 'Ciência da Computação', '2026-06-30 17:33:02.475046')
+TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm001' LIMIT 1
+TRANSACTION (0.2ms)  BEGIN
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '738482' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' LIMIT 1
+Administrador Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:02.867669', NULL, NULL, NULL, 245, 'admin@unb.br', NULL, 'adm001', 'Admin Teste', NULL, NULL, '$2a$12$YAhMj.aGsoByRBFINfeGO.EobM3Hilc4eC4Vo2FrbkFmBHoNyCFpa', 'Administrador', '2026-06-30 17:33:02.867669')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Usuario Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:02.868843', NULL, NULL, NULL, NULL, 'usuario@teste.com', NULL, '738482', 'Usuário Teste', NULL, NULL, '$2a$12$HzX2Gl6VVPPktORddEhst.JnbaD2EAB3O7pKN9yjYgIpglx5AqT3S', NULL, '2026-06-30 17:33:02.868843')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Usuario Exists? (0.6ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+ +

Started GET “/” for 127.0.0.1 at 2026-06-30 14:33:02 -0300 Processing by SessionsController#new as HTML

+ +
Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering sessions/new.html.erb within layouts/application
+Rendered sessions/new.html.erb within layouts/application (Duration: 0.2ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.6ms | ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started POST “/login” for 127.0.0.1 at 2026-06-30 14:33:02 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "usuario@teste.com", "senha" => "Senha123", "commit" => "Entrar"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:03.064878', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Prof Teste', NULL, NULL, '$2a$12$9fNh58kc1iTQxQCw9BcwmOhY9Ddjhl/1ioiapCIEGf0DfeVxBpqNy', 'Docente', '2026-06-30 17:33:03.064878')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:33:03 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin@unb.br", "senha" => "Senha123"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/284/avaliacoes Completed 302 Found in 195ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/usuarios/284/avaliacoes” for 127.0.0.1 at 2026-06-30 14:33:03 -0300 Processing by UsuariosController#avaliacoes as HTML

+ +
Parameters: {"usuario_id" => "284"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 284 LIMIT 1
+CACHE Usuario Load (0.0ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 284 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering usuarios/avaliacoes.html.erb within layouts/application
+Formulario Load (0.3ms)  SELECT `formularios`.* FROM `formularios` INNER JOIN `turmas` ON `turmas`.`id` = `formularios`.`turma_id` WHERE `formularios`.`turma_id` IN (SELECT `turmas`.`id` FROM `turmas` WHERE (1=0))
+Rendered usuarios/avaliacoes.html.erb within layouts/application (Duration: 0.7ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.4ms | GC: 0.3ms)
+ +

Completed 200 OK in 2ms (Views: 1.2ms | ActiveRecord: 0.6ms (3 queries, 1 cached) | GC: 0.3ms)

+ +
TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.2ms)  BEGIN
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`matricula` = '261067676' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '261067676' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = '261067676@teste.com' LIMIT 1
+ +

Redirected to www.example.com/admin/283/avaliacoes Completed 302 Found in 195ms (ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.6ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:33:03.264918', 'Ciência da Computação', '2026-06-30 17:33:03.264918')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Usuario Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:03.272999', NULL, NULL, NULL, NULL, '261067676@teste.com', NULL, '261067676', 'Usuário Teste', NULL, NULL, '$2a$12$CqjM4/S43Ws4Et90K4g5wuazHos6l.VidaERYIV8VzvoctL3W.rCm', NULL, '2026-06-30 17:33:03.272999')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/” for 127.0.0.1 at 2026-06-30 14:33:03 -0300 Processing by SessionsController#new as HTML

+ +
Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering sessions/new.html.erb within layouts/application
+Rendered sessions/new.html.erb within layouts/application (Duration: 0.2ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.6ms | ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started POST “/login” for 127.0.0.1 at 2026-06-30 14:33:03 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "261067676", "senha" => "Senha123", "commit" => "Entrar"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = '261067676' LIMIT 1
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`matricula` = '261067676' LIMIT 1
+Administrador Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:03.462417', NULL, NULL, NULL, 246, 'admin@unb.br', NULL, 'adm001', 'Admin Teste', NULL, NULL, '$2a$12$AhxWQimTNJ1YSGPeiFvA6eS.Y1Fi7y5vMDJVHKY84VZXe/LAapgGG', 'Administrador', '2026-06-30 17:33:03.462417')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/286/avaliacoes Completed 302 Found in 197ms (ActiveRecord: 0.6ms (2 queries, 0 cached) | GC: 0.0ms) Started GET “/usuarios/286/avaliacoes” for 127.0.0.1 at 2026-06-30 14:33:03 -0300 Processing by UsuariosController#avaliacoes as HTML

+ +
Parameters: {"usuario_id" => "286"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 286 LIMIT 1
+CACHE Usuario Load (0.0ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 286 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering usuarios/avaliacoes.html.erb within layouts/application
+Formulario Load (0.3ms)  SELECT `formularios`.* FROM `formularios` INNER JOIN `turmas` ON `turmas`.`id` = `formularios`.`turma_id` WHERE `formularios`.`turma_id` IN (SELECT `turmas`.`id` FROM `turmas` WHERE (1=0))
+Rendered usuarios/avaliacoes.html.erb within layouts/application (Duration: 0.7ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.9ms | GC: 0.0ms)
+ +

Completed 200 OK in 2ms (Views: 0.8ms | ActiveRecord: 0.6ms (3 queries, 1 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '136102' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:03.660796', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Prof Teste', NULL, NULL, '$2a$12$4VVcug8ggUl0a9YDHlUtV.OIPMvAmXHSb9GHbe0b.vDSBQWPNO7Qy', 'Docente', '2026-06-30 17:33:03.660796')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:33:03 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "adm001", "senha" => "Senha123"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'adm001' LIMIT 1
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm001' LIMIT 1
+Usuario Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:03.678363', NULL, NULL, NULL, NULL, 'usuario@teste.com', NULL, '136102', 'Usuário Teste', NULL, NULL, '$2a$12$4n7fH7CT.ng1tb684AnNz.6tMSD6O9yLQPNBv4wnlSWDMebdVPOPe', NULL, '2026-06-30 17:33:03.678363')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/” for 127.0.0.1 at 2026-06-30 14:33:03 -0300 Processing by SessionsController#new as HTML

+ +
Usuario Load (0.1ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering sessions/new.html.erb within layouts/application
+Rendered sessions/new.html.erb within layouts/application (Duration: 0.2ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.5ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.6ms | ActiveRecord: 0.1ms (1 query, 0 cached) | GC: 0.0ms) Started POST “/login” for 127.0.0.1 at 2026-06-30 14:33:03 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "usuario@teste.com", "senha" => "Senha123.", "commit" => "Entrar"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' LIMIT 1
+ +

Redirected to www.example.com/admin/287/avaliacoes Completed 302 Found in 223ms (ActiveRecord: 0.6ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:33:03.889158', 'Ciência da Computação', '2026-06-30 17:33:03.889158')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+ +

Redirected to www.example.com/ Completed 302 Found in 223ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/” for 127.0.0.1 at 2026-06-30 14:33:03 -0300 Processing by SessionsController#new as HTML

+ +
Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering sessions/new.html.erb within layouts/application
+Rendered sessions/new.html.erb within layouts/application (Duration: 0.2ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.6ms | ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.1ms)

+ +
TRANSACTION (0.4ms)  ROLLBACK
+ +

Started GET “/” for 127.0.0.1 at 2026-06-30 14:33:03 -0300 Processing by SessionsController#new as HTML

+ +
TRANSACTION (0.1ms)  BEGIN
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering sessions/new.html.erb within layouts/application
+Rendered sessions/new.html.erb within layouts/application (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.5ms | ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started POST “/login” for 127.0.0.1 at 2026-06-30 14:33:03 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "", "senha" => "Senha123", "commit" => "Entrar"}
+ +

Redirected to www.example.com/ Completed 302 Found in 0ms (ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 0.0ms) Started GET “/” for 127.0.0.1 at 2026-06-30 14:33:03 -0300 Processing by SessionsController#new as HTML

+ +
Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering sessions/new.html.erb within layouts/application
+Rendered sessions/new.html.erb within layouts/application (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.5ms | ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.1ms)  ROLLBACK
+ +

Started GET “/” for 127.0.0.1 at 2026-06-30 14:33:03 -0300 Processing by SessionsController#new as HTML

+ +
TRANSACTION (0.1ms)  BEGIN
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering sessions/new.html.erb within layouts/application
+Rendered sessions/new.html.erb within layouts/application (Duration: 0.2ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.5ms | ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms) Started POST “/login” for 127.0.0.1 at 2026-06-30 14:33:03 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "usuario@teste.com", "senha" => "", "commit" => "Entrar"}
+ +

Redirected to www.example.com/ Completed 302 Found in 0ms (ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 0.0ms) Started GET “/” for 127.0.0.1 at 2026-06-30 14:33:03 -0300 Processing by SessionsController#new as HTML

+ +
Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering sessions/new.html.erb within layouts/application
+Rendered sessions/new.html.erb within layouts/application (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.5ms | ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '103965' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' LIMIT 1
+Usuario Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:03.925741', NULL, NULL, NULL, NULL, 'usuario@teste.com', NULL, '103965', 'Usuário Teste', NULL, NULL, NULL, NULL, '2026-06-30 17:33:03.925741')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' AND `usuarios`.`id` != 290 LIMIT 1
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/” for 127.0.0.1 at 2026-06-30 14:33:03 -0300 Processing by SessionsController#new as HTML

+ +
Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering sessions/new.html.erb within layouts/application
+Rendered sessions/new.html.erb within layouts/application (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.5ms | ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started POST “/login” for 127.0.0.1 at 2026-06-30 14:33:03 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "usuario@teste.com", "senha" => "Senha123", "commit" => "Entrar"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' LIMIT 1
+ +

Redirected to www.example.com/ Completed 302 Found in 0ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/” for 127.0.0.1 at 2026-06-30 14:33:03 -0300 Processing by SessionsController#new as HTML

+ +
Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering sessions/new.html.erb within layouts/application
+Rendered sessions/new.html.erb within layouts/application (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.5ms | GC: 0.1ms)
+ +

Completed 200 OK in 1ms (Views: 0.6ms | ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.1ms)

+ +
TRANSACTION (0.3ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Usuario Delete All (0.4ms)  DELETE FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com'
+ +

Started GET “/” for 127.0.0.1 at 2026-06-30 14:33:03 -0300 Processing by SessionsController#new as HTML

+ +
Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering sessions/new.html.erb within layouts/application
+Rendered sessions/new.html.erb within layouts/application (Duration: 0.2ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.5ms | ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started POST “/login” for 127.0.0.1 at 2026-06-30 14:33:03 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "usuario@teste.com", "senha" => "Senha123", "commit" => "Entrar"}
+Usuario Load (0.1ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' LIMIT 1
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`matricula` = 'usuario@teste.com' LIMIT 1
+ +

Redirected to www.example.com/ Completed 302 Found in 1ms (ActiveRecord: 0.3ms (2 queries, 0 cached) | GC: 0.0ms) Started GET “/” for 127.0.0.1 at 2026-06-30 14:33:03 -0300 Processing by SessionsController#new as HTML

+ +
Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering sessions/new.html.erb within layouts/application
+Rendered sessions/new.html.erb within layouts/application (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.3ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.4ms | ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.1ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '823796' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' LIMIT 1
+Administrador Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:04.090236', NULL, NULL, NULL, 247, 'admin@unb.br', NULL, 'adm001', 'Admin Teste', NULL, NULL, '$2a$12$hhVuy2TwsRiWVfK6SHijYexvxVMa12dmbADw7r9eGvdbwsGiRtcuO', 'Administrador', '2026-06-30 17:33:04.090236')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Usuario Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:04.141061', NULL, NULL, NULL, NULL, 'usuario@teste.com', NULL, '823796', 'Usuário Teste', NULL, NULL, '$2a$12$cbbar4DU7LvI211pDe9T2OQm5bq.UvAnkK/Yrd4n8rYFUNBIhDgbC', NULL, '2026-06-30 17:33:04.141061')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/” for 127.0.0.1 at 2026-06-30 14:33:04 -0300 Processing by SessionsController#new as HTML

+ +
Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering sessions/new.html.erb within layouts/application
+Rendered sessions/new.html.erb within layouts/application (Duration: 0.2ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.6ms | ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/redefinir_senha” for 127.0.0.1 at 2026-06-30 14:33:04 -0300 Processing by RedefinicaoSenhasController#new as HTML

+ +
Rendering layout layouts/application.html.erb
+Rendering redefinicao_senhas/new.html.erb within layouts/application
+Rendered redefinicao_senhas/new.html.erb within layouts/application (Duration: 0.2ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.5ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.8ms | ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 0.0ms) Started POST “/redefinir_senha” for 127.0.0.1 at 2026-06-30 14:33:04 -0300 Processing by RedefinicaoSenhasController#create as HTML

+ +
Parameters: {"email" => "[FILTERED]", "commit" => "Solicitar redefinição"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' AND `usuarios`.`id` != 292 LIMIT 1
+Usuario Update (0.3ms)  UPDATE `usuarios` SET `usuarios`.`redefinicao_senha_sent_at` = '2026-06-30 17:33:04.149555', `usuarios`.`redefinicao_senha_token` = 'kqoi27859GmFdN0TmOeYDKYOsAasBB6hTmpT9WuDxVo', `usuarios`.`updated_at` = '2026-06-30 17:33:04.150366' WHERE `usuarios`.`id` = 292
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Rendering layout layouts/mailer.html.erb
+Rendering usuario_mailer/redefinicao_senha.html.erb within layouts/mailer
+Rendered usuario_mailer/redefinicao_senha.html.erb within layouts/mailer (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/mailer.html.erb (Duration: 0.2ms | GC: 0.0ms)
+Rendering layout layouts/mailer.text.erb
+Rendering usuario_mailer/redefinicao_senha.text.erb within layouts/mailer
+Rendered usuario_mailer/redefinicao_senha.text.erb within layouts/mailer (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/mailer.text.erb (Duration: 0.1ms | GC: 0.0ms)
+ +

UsuarioMailer#redefinicao_senha: processed outbound mail in 1.4ms Delivered mail 6a43fdd0254c1_18563ea08369a@MacBook-Air-de-Elvis.local.mail (1.1ms) Date: Tue, 30 Jun 2026 14:33:04 -0300 From: camaar@gmail.com To: usuario@teste.com Message-ID: <6a43fdd0254c1_18563ea08369a@MacBook-Air-de-Elvis.local.mail> Subject: =?UTF-8?Q?Redefini=C3=A7=C3=A3o_de_senha?= MIME-Version: 1.0 Content-Type: multipart/alternative;

+ +
boundary="--==_mimepart_6a43fdd0252a9_18563ea08353d";
+charset=UTF-8
+
+ +

Content-Transfer-Encoding: 7bit

+ +

—-==_mimepart_6a43fdd0252a9_18563ea08353d Content-Type: text/plain;

+ +
charset=UTF-8
+
+ +

Content-Transfer-Encoding: quoted-printable

+ +

Ol=C3=A1, Usu=C3=A1rio Teste.

+ +

Voc=C3=AA solicitou a redefini=C3=A7=C3=A3o da sua senha. Acesse o link a= baixo:

+ +

example.com/redefinir_senha/kqoi27859GmFdN0TmOeYDKYOsAasBB6hTmpT9W= uDxVo

+ +

—-==_mimepart_6a43fdd0252a9_18563ea08353d Content-Type: text/html;

+ +
charset=UTF-8
+
+ +

Content-Transfer-Encoding: quoted-printable

+ +

<!DOCTYPE html> <html>

+ +
<head>
+  <meta http-equiv=3D"Content-Type" content=3D"text/html; charset=3Dutf=
+ +

-8“>

+ +
  <style>
+    /* Email styles need to be inline */
+  </style>
+</head>
+
+<body>
+  <p>Ol=C3=A1, Usu=C3=A1rio Teste.</p>
+ +

<p>Voc=C3=AA solicitou a redefini=C3=A7=C3=A3o da sua senha. Acesse o lin= k abaixo:</p>

+ +

<p><a href=3D“example.com/redefinir_senha/kqoi27859GmFdN0TmOeYDKYO= sAasBB6hTmpT9WuDxVo”>example.com/redefinir_senha/kqoi27859GmFdN0Tm= OeYDKYOsAasBB6hTmpT9WuDxVo</a></p>

+ +
</body>
+ +

</html>

+ +

—-==_mimepart_6a43fdd0252a9_18563ea08353d–

+ +

Redirected to www.example.com/ Completed 302 Found in 5ms (ActiveRecord: 1.0ms (3 queries, 0 cached) | GC: 0.0ms) Started GET “/” for 127.0.0.1 at 2026-06-30 14:33:04 -0300 Processing by SessionsController#new as HTML

+ +
Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering sessions/new.html.erb within layouts/application
+Rendered sessions/new.html.erb within layouts/application (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.5ms | ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Usuario Load (0.1ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' AND `usuarios`.`id` != 292 LIMIT 1
+Usuario Update (0.3ms)  UPDATE `usuarios` SET `usuarios`.`redefinicao_senha_sent_at` = '2026-06-30 17:33:04.156649', `usuarios`.`redefinicao_senha_token` = 'x1kv7OrZVlf_emHzEUkQEgNaDGvK-4U2D6QQdQ33KnQ', `usuarios`.`updated_at` = '2026-06-30 17:33:04.157247' WHERE `usuarios`.`id` = 292
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Rendering layout layouts/mailer.html.erb
+Rendering usuario_mailer/redefinicao_senha.html.erb within layouts/mailer
+Rendered usuario_mailer/redefinicao_senha.html.erb within layouts/mailer (Duration: 0.0ms | GC: 0.0ms)
+Rendered layout layouts/mailer.html.erb (Duration: 0.1ms | GC: 0.0ms)
+Rendering layout layouts/mailer.text.erb
+Rendering usuario_mailer/redefinicao_senha.text.erb within layouts/mailer
+Rendered usuario_mailer/redefinicao_senha.text.erb within layouts/mailer (Duration: 0.0ms | GC: 0.0ms)
+Rendered layout layouts/mailer.text.erb (Duration: 0.0ms | GC: 0.0ms)
+ +

UsuarioMailer#redefinicao_senha: processed outbound mail in 0.8ms Delivered mail 6a43fdd026d0b_18563ea083867@MacBook-Air-de-Elvis.local.mail (0.9ms) Date: Tue, 30 Jun 2026 14:33:04 -0300 From: camaar@gmail.com To: usuario@teste.com Message-ID: <6a43fdd026d0b_18563ea083867@MacBook-Air-de-Elvis.local.mail> Subject: =?UTF-8?Q?Redefini=C3=A7=C3=A3o_de_senha?= MIME-Version: 1.0 Content-Type: multipart/alternative;

+ +
boundary="--==_mimepart_6a43fdd026b3c_18563ea083730";
+charset=UTF-8
+
+ +

Content-Transfer-Encoding: 7bit

+ +

—-==_mimepart_6a43fdd026b3c_18563ea083730 Content-Type: text/plain;

+ +
charset=UTF-8
+
+ +

Content-Transfer-Encoding: quoted-printable

+ +

Ol=C3=A1, Usu=C3=A1rio Teste.

+ +

Voc=C3=AA solicitou a redefini=C3=A7=C3=A3o da sua senha. Acesse o link a= baixo:

+ +

example.com/redefinir_senha/x1kv7OrZVlf_emHzEUkQEgNaDGvK-4U2D6QQdQ= 33KnQ

+ +

—-==_mimepart_6a43fdd026b3c_18563ea083730 Content-Type: text/html;

+ +
charset=UTF-8
+
+ +

Content-Transfer-Encoding: quoted-printable

+ +

<!DOCTYPE html> <html>

+ +
<head>
+  <meta http-equiv=3D"Content-Type" content=3D"text/html; charset=3Dutf=
+ +

-8“>

+ +
  <style>
+    /* Email styles need to be inline */
+  </style>
+</head>
+
+<body>
+  <p>Ol=C3=A1, Usu=C3=A1rio Teste.</p>
+ +

<p>Voc=C3=AA solicitou a redefini=C3=A7=C3=A3o da sua senha. Acesse o lin= k abaixo:</p>

+ +

<p><a href=3D“example.com/redefinir_senha/x1kv7OrZVlf_emHzEUkQEgNa= DGvK-4U2D6QQdQ33KnQ”>example.com/redefinir_senha/x1kv7OrZVlf_emHzE= UkQEgNaDGvK-4U2D6QQdQ33KnQ</a></p>

+ +
</body>
+ +

</html>

+ +

—-==_mimepart_6a43fdd026b3c_18563ea083730–

+ +
TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '275727' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:04.291322', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Prof Teste', NULL, NULL, '$2a$12$Vd9k23TLnz0nvxijmUtcvORoOps1mZvoDN42b6bDHU/Yjpu5LGBha', 'Docente', '2026-06-30 17:33:04.291322')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:33:04 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "prof@unb.br", "senha" => "Senha123"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Usuario Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:04.361106', NULL, NULL, NULL, NULL, 'usuario@teste.com', NULL, '275727', 'Usuário Teste', NULL, NULL, '$2a$12$DAg9UMgTDQnzGGyiXW7qz.yBnUCtNfHgQXyrvEcmcETh3e3enVDnG', NULL, '2026-06-30 17:33:04.361106')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/” for 127.0.0.1 at 2026-06-30 14:33:04 -0300 Processing by SessionsController#new as HTML

+ +
Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering sessions/new.html.erb within layouts/application
+Rendered sessions/new.html.erb within layouts/application (Duration: 0.2ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.6ms | ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.5ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' AND `usuarios`.`id` != 294 LIMIT 1
+Usuario Update (0.4ms)  UPDATE `usuarios` SET `usuarios`.`redefinicao_senha_sent_at` = '2026-06-30 17:33:04.364593', `usuarios`.`redefinicao_senha_token` = 'xTlnHlFy8by7vVZUiSzbdXhaljt7648KUnPno8q69Uc', `usuarios`.`updated_at` = '2026-06-30 17:33:04.365372' WHERE `usuarios`.`id` = 294
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Rendering layout layouts/mailer.html.erb
+Rendering usuario_mailer/redefinicao_senha.html.erb within layouts/mailer
+Rendered usuario_mailer/redefinicao_senha.html.erb within layouts/mailer (Duration: 0.0ms | GC: 0.0ms)
+Rendered layout layouts/mailer.html.erb (Duration: 0.1ms | GC: 0.0ms)
+Rendering layout layouts/mailer.text.erb
+Rendering usuario_mailer/redefinicao_senha.text.erb within layouts/mailer
+Rendered usuario_mailer/redefinicao_senha.text.erb within layouts/mailer (Duration: 0.0ms | GC: 0.0ms)
+Rendered layout layouts/mailer.text.erb (Duration: 0.0ms | GC: 0.0ms)
+ +

UsuarioMailer#redefinicao_senha: processed outbound mail in 0.9ms Delivered mail 6a43fdd059ada_18563ea08401c@MacBook-Air-de-Elvis.local.mail (0.9ms) Date: Tue, 30 Jun 2026 14:33:04 -0300 From: camaar@gmail.com To: usuario@teste.com Message-ID: <6a43fdd059ada_18563ea08401c@MacBook-Air-de-Elvis.local.mail> Subject: =?UTF-8?Q?Redefini=C3=A7=C3=A3o_de_senha?= MIME-Version: 1.0 Content-Type: multipart/alternative;

+ +
boundary="--==_mimepart_6a43fdd0598dc_18563ea08399f";
+charset=UTF-8
+
+ +

Content-Transfer-Encoding: 7bit

+ +

—-==_mimepart_6a43fdd0598dc_18563ea08399f Content-Type: text/plain;

+ +
charset=UTF-8
+
+ +

Content-Transfer-Encoding: quoted-printable

+ +

Ol=C3=A1, Usu=C3=A1rio Teste.

+ +

Voc=C3=AA solicitou a redefini=C3=A7=C3=A3o da sua senha. Acesse o link a= baixo:

+ +

example.com/redefinir_senha/xTlnHlFy8by7vVZUiSzbdXhaljt7648KUnPno8= q69Uc

+ +

—-==_mimepart_6a43fdd0598dc_18563ea08399f Content-Type: text/html;

+ +
charset=UTF-8
+
+ +

Content-Transfer-Encoding: quoted-printable

+ +

<!DOCTYPE html> <html>

+ +
<head>
+  <meta http-equiv=3D"Content-Type" content=3D"text/html; charset=3Dutf=
+ +

-8“>

+ +
  <style>
+    /* Email styles need to be inline */
+  </style>
+</head>
+
+<body>
+  <p>Ol=C3=A1, Usu=C3=A1rio Teste.</p>
+ +

<p>Voc=C3=AA solicitou a redefini=C3=A7=C3=A3o da sua senha. Acesse o lin= k abaixo:</p>

+ +

<p><a href=3D“example.com/redefinir_senha/xTlnHlFy8by7vVZUiSzbdXha= ljt7648KUnPno8q69Uc”>example.com/redefinir_senha/xTlnHlFy8by7vVZUi= SzbdXhaljt7648KUnPno8q69Uc</a></p>

+ +
</body>
+ +

</html>

+ +

—-==_mimepart_6a43fdd0598dc_18563ea08399f–

+ +

Started GET “/redefinir_senha/xTlnHlFy8by7vVZUiSzbdXhaljt7648KUnPno8q69Uc” for 127.0.0.1 at 2026-06-30 14:33:04 -0300 Processing by RedefinicaoSenhasController#edit as HTML

+ +
Parameters: {"token" => "[FILTERED]"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`redefinicao_senha_token` = 'xTlnHlFy8by7vVZUiSzbdXhaljt7648KUnPno8q69Uc' LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering redefinicao_senhas/edit.html.erb within layouts/application
+Rendered redefinicao_senhas/edit.html.erb within layouts/application (Duration: 0.3ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.5ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.6ms | ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started PATCH “/redefinir_senha/xTlnHlFy8by7vVZUiSzbdXhaljt7648KUnPno8q69Uc” for 127.0.0.1 at 2026-06-30 14:33:04 -0300 Processing by RedefinicaoSenhasController#update as HTML

+ +
Parameters: {"senha" => "NovaSenha123", "senha_confirmation" => "NovaSenha123", "commit" => "Redefinir senha", "token" => "[FILTERED]"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`redefinicao_senha_token` = 'xTlnHlFy8by7vVZUiSzbdXhaljt7648KUnPno8q69Uc' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' AND `usuarios`.`id` != 294 LIMIT 1
+ +

Redirected to www.example.com/usuarios/293/avaliacoes Completed 302 Found in 196ms (ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (1.3ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:33:04.493136', 'Ciência da Computação', '2026-06-30 17:33:04.493136')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Usuario Update (0.4ms)  UPDATE `usuarios` SET `usuarios`.`redefinicao_senha_sent_at` = NULL, `usuarios`.`redefinicao_senha_token` = NULL, `usuarios`.`senha_hash` = '$2a$12$Obq7YfRQIXuVDAPQ.j7pieVQ8Xx9CJlp6EmNKipeb16Xg73oFpsBm', `usuarios`.`updated_at` = '2026-06-30 17:33:04.569010' WHERE `usuarios`.`id` = 294
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to example.com/ Completed 302 Found in 198ms (ActiveRecord: 1.3ms (3 queries, 0 cached) | GC: 0.0ms) Started GET “/” for 127.0.0.1 at 2026-06-30 14:33:04 -0300 Processing by SessionsController#new as HTML

+ +
Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering sessions/new.html.erb within layouts/application
+Rendered sessions/new.html.erb within layouts/application (Duration: 0.2ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.5ms | ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/” for 127.0.0.1 at 2026-06-30 14:33:04 -0300 Processing by SessionsController#new as HTML

+ +
Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering sessions/new.html.erb within layouts/application
+Rendered sessions/new.html.erb within layouts/application (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.3ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.4ms | ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started POST “/login” for 127.0.0.1 at 2026-06-30 14:33:04 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "usuario@teste.com", "senha" => "NovaSenha123", "commit" => "Entrar"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:04.691479', NULL, NULL, NULL, 248, 'admin@unb.br', NULL, 'adm001', 'Admin Teste', NULL, NULL, '$2a$12$yEftzPheV8izZ3zd6StuauXnTwegxdPfYdbmDg/c2owGDlo52mbSW', 'Administrador', '2026-06-30 17:33:04.691479')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/294/avaliacoes Completed 302 Found in 198ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/usuarios/294/avaliacoes” for 127.0.0.1 at 2026-06-30 14:33:04 -0300 Processing by UsuariosController#avaliacoes as HTML

+ +
Parameters: {"usuario_id" => "294"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 294 LIMIT 1
+CACHE Usuario Load (0.0ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 294 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering usuarios/avaliacoes.html.erb within layouts/application
+Formulario Load (0.3ms)  SELECT `formularios`.* FROM `formularios` INNER JOIN `turmas` ON `turmas`.`id` = `formularios`.`turma_id` WHERE `formularios`.`turma_id` IN (SELECT `turmas`.`id` FROM `turmas` WHERE (1=0))
+Rendered usuarios/avaliacoes.html.erb within layouts/application (Duration: 0.6ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.9ms | GC: 0.0ms)
+ +

Completed 200 OK in 2ms (Views: 0.8ms | ActiveRecord: 0.6ms (3 queries, 1 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '745172' LIMIT 1
+Usuario Exists? (0.1ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:04.891186', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Prof Teste', NULL, NULL, '$2a$12$NCc8eePRLMOcW9b7ez4zhO19UBmhrsqC0GUAKWbq0DWv4gE2uRRYK', 'Docente', '2026-06-30 17:33:04.891186')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:33:04 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc001", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc001' LIMIT 1
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:04.978944', NULL, NULL, NULL, NULL, 'usuario@teste.com', NULL, '745172', 'Usuário Teste', NULL, NULL, '$2a$12$Kxr3YOYeg614pk15zUZquuNM8oaZGon1LdhzLI5o0qjLrclyQO/vi', NULL, '2026-06-30 17:33:04.978944')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/” for 127.0.0.1 at 2026-06-30 14:33:04 -0300 Processing by SessionsController#new as HTML

+ +
Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering sessions/new.html.erb within layouts/application
+Rendered sessions/new.html.erb within layouts/application (Duration: 0.2ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.5ms | ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' AND `usuarios`.`id` != 297 LIMIT 1
+Usuario Update (0.2ms)  UPDATE `usuarios` SET `usuarios`.`redefinicao_senha_sent_at` = '2026-06-30 17:33:04.982465', `usuarios`.`redefinicao_senha_token` = 'dEOnwgQEPHn6reaLYKWDeAByQI6aq5vqXfIV7n6rtSM', `usuarios`.`updated_at` = '2026-06-30 17:33:04.983104' WHERE `usuarios`.`id` = 297
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Rendering layout layouts/mailer.html.erb
+Rendering usuario_mailer/redefinicao_senha.html.erb within layouts/mailer
+Rendered usuario_mailer/redefinicao_senha.html.erb within layouts/mailer (Duration: 0.0ms | GC: 0.0ms)
+Rendered layout layouts/mailer.html.erb (Duration: 0.1ms | GC: 0.0ms)
+Rendering layout layouts/mailer.text.erb
+Rendering usuario_mailer/redefinicao_senha.text.erb within layouts/mailer
+Rendered usuario_mailer/redefinicao_senha.text.erb within layouts/mailer (Duration: 0.0ms | GC: 0.0ms)
+Rendered layout layouts/mailer.text.erb (Duration: 0.0ms | GC: 0.0ms)
+ +

UsuarioMailer#redefinicao_senha: processed outbound mail in 1.1ms Delivered mail 6a43fdd0f07c3_18563ea08425f@MacBook-Air-de-Elvis.local.mail (1.2ms) Date: Tue, 30 Jun 2026 14:33:04 -0300 From: camaar@gmail.com To: usuario@teste.com Message-ID: <6a43fdd0f07c3_18563ea08425f@MacBook-Air-de-Elvis.local.mail> Subject: =?UTF-8?Q?Redefini=C3=A7=C3=A3o_de_senha?= MIME-Version: 1.0 Content-Type: multipart/alternative;

+ +
boundary="--==_mimepart_6a43fdd0f05d7_18563ea084110";
+charset=UTF-8
+
+ +

Content-Transfer-Encoding: 7bit

+ +

—-==_mimepart_6a43fdd0f05d7_18563ea084110 Content-Type: text/plain;

+ +
charset=UTF-8
+
+ +

Content-Transfer-Encoding: quoted-printable

+ +

Ol=C3=A1, Usu=C3=A1rio Teste.

+ +

Voc=C3=AA solicitou a redefini=C3=A7=C3=A3o da sua senha. Acesse o link a= baixo:

+ +

example.com/redefinir_senha/dEOnwgQEPHn6reaLYKWDeAByQI6aq5vqXfIV7n= 6rtSM

+ +

—-==_mimepart_6a43fdd0f05d7_18563ea084110 Content-Type: text/html;

+ +
charset=UTF-8
+
+ +

Content-Transfer-Encoding: quoted-printable

+ +

<!DOCTYPE html> <html>

+ +
<head>
+  <meta http-equiv=3D"Content-Type" content=3D"text/html; charset=3Dutf=
+ +

-8“>

+ +
  <style>
+    /* Email styles need to be inline */
+  </style>
+</head>
+
+<body>
+  <p>Ol=C3=A1, Usu=C3=A1rio Teste.</p>
+ +

<p>Voc=C3=AA solicitou a redefini=C3=A7=C3=A3o da sua senha. Acesse o lin= k abaixo:</p>

+ +

<p><a href=3D“example.com/redefinir_senha/dEOnwgQEPHn6reaLYKWDeABy= QI6aq5vqXfIV7n6rtSM”>example.com/redefinir_senha/dEOnwgQEPHn6reaLY= KWDeAByQI6aq5vqXfIV7n6rtSM</a></p>

+ +
</body>
+ +

</html>

+ +

—-==_mimepart_6a43fdd0f05d7_18563ea084110–

+ +

Started GET “/redefinir_senha/dEOnwgQEPHn6reaLYKWDeAByQI6aq5vqXfIV7n6rtSM” for 127.0.0.1 at 2026-06-30 14:33:04 -0300 Processing by RedefinicaoSenhasController#edit as HTML

+ +
Parameters: {"token" => "[FILTERED]"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`redefinicao_senha_token` = 'dEOnwgQEPHn6reaLYKWDeAByQI6aq5vqXfIV7n6rtSM' LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering redefinicao_senhas/edit.html.erb within layouts/application
+Rendered redefinicao_senhas/edit.html.erb within layouts/application (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.5ms | ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started PATCH “/redefinir_senha/dEOnwgQEPHn6reaLYKWDeAByQI6aq5vqXfIV7n6rtSM” for 127.0.0.1 at 2026-06-30 14:33:04 -0300 Processing by RedefinicaoSenhasController#update as HTML

+ +
Parameters: {"senha" => "NovaSenha123", "senha_confirmation" => "NovaSenha123", "commit" => "Redefinir senha", "token" => "[FILTERED]"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`redefinicao_senha_token` = 'dEOnwgQEPHn6reaLYKWDeAByQI6aq5vqXfIV7n6rtSM' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' AND `usuarios`.`id` != 297 LIMIT 1
+ +

Redirected to www.example.com/usuarios/296/avaliacoes Completed 302 Found in 199ms (ActiveRecord: 0.6ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:33:05.095468', 'Ciência da Computação', '2026-06-30 17:33:05.095468')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Usuario Update (0.5ms)  UPDATE `usuarios` SET `usuarios`.`redefinicao_senha_sent_at` = NULL, `usuarios`.`redefinicao_senha_token` = NULL, `usuarios`.`senha_hash` = '$2a$12$j9cqj3B77ieQPu.u6t06d.GDiBLf3QkBVFyDGXBiixHfOhf9vRRTO', `usuarios`.`updated_at` = '2026-06-30 17:33:05.189202' WHERE `usuarios`.`id` = 297
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to example.com/ Completed 302 Found in 201ms (ActiveRecord: 1.4ms (3 queries, 0 cached) | GC: 0.0ms) Started GET “/” for 127.0.0.1 at 2026-06-30 14:33:05 -0300 Processing by SessionsController#new as HTML

+ +
Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering sessions/new.html.erb within layouts/application
+Rendered sessions/new.html.erb within layouts/application (Duration: 0.2ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.5ms | ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/” for 127.0.0.1 at 2026-06-30 14:33:05 -0300 Processing by SessionsController#new as HTML

+ +
Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering sessions/new.html.erb within layouts/application
+Rendered sessions/new.html.erb within layouts/application (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.3ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.4ms | ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started POST “/login” for 127.0.0.1 at 2026-06-30 14:33:05 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "usuario@teste.com", "senha" => "Senha123", "commit" => "Entrar"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:05.294098', NULL, NULL, NULL, 249, 'admin@unb.br', NULL, 'adm001', 'Admin Teste', NULL, NULL, '$2a$12$oCYOsXczCmTQjYQpAMUv3uVWQ.GSHvHoqWnTW8cGmPm3eWwzS7OSS', 'Administrador', '2026-06-30 17:33:05.294098')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+ +

Redirected to www.example.com/ Completed 302 Found in 197ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/” for 127.0.0.1 at 2026-06-30 14:33:05 -0300 Processing by SessionsController#new as HTML

+ +
Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering sessions/new.html.erb within layouts/application
+Rendered sessions/new.html.erb within layouts/application (Duration: 0.2ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.6ms | ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '485015' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:05.491097', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Prof Teste', NULL, NULL, '$2a$12$tz5kiymh6W/.IvFajwgyTuGu3OWHoqIclv3mcBLvHQUHLLtVGPPi6', 'Docente', '2026-06-30 17:33:05.491097')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:33:05 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "prof@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Usuario Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:05.595318', NULL, NULL, NULL, NULL, 'usuario@teste.com', NULL, '485015', 'Usuário Teste', NULL, NULL, '$2a$12$a1LCK0KRrg9H1MWCINudGemkrOEkqnrH0myekV07XOYTWDlxBhxKG', NULL, '2026-06-30 17:33:05.595318')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/” for 127.0.0.1 at 2026-06-30 14:33:05 -0300 Processing by SessionsController#new as HTML

+ +
Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering sessions/new.html.erb within layouts/application
+Rendered sessions/new.html.erb within layouts/application (Duration: 0.2ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.6ms | ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Redirected to www.example.com/usuarios/299/avaliacoes Completed 302 Found in 195ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started DELETE “/logout” for 127.0.0.1 at 2026-06-30 14:33:05 -0300 Processing by SessionsController#destroy as HTML Redirected to www.example.com/ Completed 302 Found in 0ms (ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 0.0ms)

+ +
Usuario Delete All (90.5ms)  DELETE FROM `usuarios` WHERE `usuarios`.`email` = 'naoexiste@teste.com'
+TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+ +

Started GET “/redefinir_senha” for 127.0.0.1 at 2026-06-30 14:33:05 -0300

+ +
Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+ +

Processing by RedefinicaoSenhasController#new as HTML

+ +
Rendering layout layouts/application.html.erb
+Rendering redefinicao_senhas/new.html.erb within layouts/application
+Rendered redefinicao_senhas/new.html.erb within layouts/application (Duration: 0.1ms | GC: 0.0ms)
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Rendered layout layouts/application.html.erb (Duration: 0.4ms | GC: 0.0ms)
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+ +

Completed 200 OK in 1ms (Views: 0.6ms | ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 0.0ms)

+ +
Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:33:05.691645', 'Ciência da Computação', '2026-06-30 17:33:05.691645')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm001' LIMIT 1
+ +

Started POST “/redefinir_senha” for 127.0.0.1 at 2026-06-30 14:33:05 -0300 Processing by RedefinicaoSenhasController#create as HTML

+ +
Parameters: {"email" => "[FILTERED]", "commit" => "Solicitar redefinição"}
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'naoexiste@teste.com' LIMIT 1
+ +

Redirected to www.example.com/redefinir_senha Completed 302 Found in 1ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/redefinir_senha” for 127.0.0.1 at 2026-06-30 14:33:05 -0300 Processing by RedefinicaoSenhasController#new as HTML

+ +
Rendering layout layouts/application.html.erb
+Rendering redefinicao_senhas/new.html.erb within layouts/application
+Rendered redefinicao_senhas/new.html.erb within layouts/application (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.5ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.6ms | ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.3ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '843841' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' LIMIT 1
+Administrador Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:05.889415', NULL, NULL, NULL, 250, 'admin@unb.br', NULL, 'adm001', 'Admin Teste', NULL, NULL, '$2a$12$GYHiNtQBi22UZ.AT.fYqc.Z11Uc717TCoLDjT3i.jE4Fwdn/1dWgK', 'Administrador', '2026-06-30 17:33:05.889415')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.5ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Usuario Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:05.894974', NULL, NULL, NULL, NULL, 'usuario@teste.com', NULL, '843841', 'Usuário Teste', NULL, NULL, '$2a$12$itMcjBkrg.z53uHnxSmsg.MhNXc7UDMqyNZDvAar/aCJYoov/.JLS', NULL, '2026-06-30 17:33:05.894974')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/” for 127.0.0.1 at 2026-06-30 14:33:05 -0300 Processing by SessionsController#new as HTML

+ +
Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering sessions/new.html.erb within layouts/application
+Rendered sessions/new.html.erb within layouts/application (Duration: 0.2ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.5ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.6ms | ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/redefinir_senha” for 127.0.0.1 at 2026-06-30 14:33:05 -0300 Processing by RedefinicaoSenhasController#new as HTML

+ +
Rendering layout layouts/application.html.erb
+Rendering redefinicao_senhas/new.html.erb within layouts/application
+Rendered redefinicao_senhas/new.html.erb within layouts/application (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.5ms | ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 0.0ms) Started POST “/redefinir_senha” for 127.0.0.1 at 2026-06-30 14:33:05 -0300 Processing by RedefinicaoSenhasController#create as HTML

+ +
Parameters: {"email" => "[FILTERED]", "commit" => "Solicitar redefinição"}
+ +

Redirected to www.example.com/redefinir_senha Completed 302 Found in 0ms (ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 0.0ms) Started GET “/redefinir_senha” for 127.0.0.1 at 2026-06-30 14:33:05 -0300 Processing by RedefinicaoSenhasController#new as HTML

+ +
Rendering layout layouts/application.html.erb
+Rendering redefinicao_senhas/new.html.erb within layouts/application
+Rendered redefinicao_senhas/new.html.erb within layouts/application (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.5ms | ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.6ms)  ROLLBACK
+TRANSACTION (0.2ms)  BEGIN
+Usuario Load (0.5ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '519063' LIMIT 1
+Usuario Exists? (0.1ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:06.089693', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Prof Teste', NULL, NULL, '$2a$12$SlM.NV2j4vg63K5E/YMJDO/9FwiDPB2gkkibICEpCnmkltuBXvJNG', 'Docente', '2026-06-30 17:33:06.089693')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:33:06 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "prof@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Usuario Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:06.103033', NULL, NULL, NULL, NULL, 'usuario@teste.com', NULL, '519063', 'Usuário Teste', NULL, NULL, '$2a$12$PbLVwWVtnR0RzpGTY.t0P.rNt6yF3PcykyuquuXF25F.lR1YcAhzO', NULL, '2026-06-30 17:33:06.103033')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/” for 127.0.0.1 at 2026-06-30 14:33:06 -0300 Processing by SessionsController#new as HTML

+ +
Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering sessions/new.html.erb within layouts/application
+Rendered sessions/new.html.erb within layouts/application (Duration: 0.2ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.6ms | GC: 0.1ms)
+ +

Completed 200 OK in 1ms (Views: 0.7ms | ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.1ms)

+ +
Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' AND `usuarios`.`id` != 304 LIMIT 1
+Usuario Update (0.4ms)  UPDATE `usuarios` SET `usuarios`.`redefinicao_senha_sent_at` = '2026-06-30 17:33:06.106605', `usuarios`.`redefinicao_senha_token` = 'OT9Y4qOpKuOz07Z2D4gyAdlqjILV0vlnSsqGIdmLChY', `usuarios`.`updated_at` = '2026-06-30 17:33:06.107358' WHERE `usuarios`.`id` = 304
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Rendering layout layouts/mailer.html.erb
+Rendering usuario_mailer/redefinicao_senha.html.erb within layouts/mailer
+Rendered usuario_mailer/redefinicao_senha.html.erb within layouts/mailer (Duration: 0.0ms | GC: 0.0ms)
+Rendered layout layouts/mailer.html.erb (Duration: 0.1ms | GC: 0.0ms)
+Rendering layout layouts/mailer.text.erb
+Rendering usuario_mailer/redefinicao_senha.text.erb within layouts/mailer
+Rendered usuario_mailer/redefinicao_senha.text.erb within layouts/mailer (Duration: 0.0ms | GC: 0.0ms)
+Rendered layout layouts/mailer.text.erb (Duration: 0.0ms | GC: 0.0ms)
+ +

UsuarioMailer#redefinicao_senha: processed outbound mail in 0.9ms Delivered mail 6a43fdd21aaf9_18563ea0844f3@MacBook-Air-de-Elvis.local.mail (1.1ms) Date: Tue, 30 Jun 2026 14:33:06 -0300 From: camaar@gmail.com To: usuario@teste.com Message-ID: <6a43fdd21aaf9_18563ea0844f3@MacBook-Air-de-Elvis.local.mail> Subject: =?UTF-8?Q?Redefini=C3=A7=C3=A3o_de_senha?= MIME-Version: 1.0 Content-Type: multipart/alternative;

+ +
boundary="--==_mimepart_6a43fdd21a8f1_18563ea084370";
+charset=UTF-8
+
+ +

Content-Transfer-Encoding: 7bit

+ +

—-==_mimepart_6a43fdd21a8f1_18563ea084370 Content-Type: text/plain;

+ +
charset=UTF-8
+
+ +

Content-Transfer-Encoding: quoted-printable

+ +

Ol=C3=A1, Usu=C3=A1rio Teste.

+ +

Voc=C3=AA solicitou a redefini=C3=A7=C3=A3o da sua senha. Acesse o link a= baixo:

+ +

example.com/redefinir_senha/OT9Y4qOpKuOz07Z2D4gyAdlqjILV0vlnSsqGId= mLChY

+ +

—-==_mimepart_6a43fdd21a8f1_18563ea084370 Content-Type: text/html;

+ +
charset=UTF-8
+
+ +

Content-Transfer-Encoding: quoted-printable

+ +

<!DOCTYPE html> <html>

+ +
<head>
+  <meta http-equiv=3D"Content-Type" content=3D"text/html; charset=3Dutf=
+ +

-8“>

+ +
  <style>
+    /* Email styles need to be inline */
+  </style>
+</head>
+
+<body>
+  <p>Ol=C3=A1, Usu=C3=A1rio Teste.</p>
+ +

<p>Voc=C3=AA solicitou a redefini=C3=A7=C3=A3o da sua senha. Acesse o lin= k abaixo:</p>

+ +

<p><a href=3D“example.com/redefinir_senha/OT9Y4qOpKuOz07Z2D4gyAdlq= jILV0vlnSsqGIdmLChY”>example.com/redefinir_senha/OT9Y4qOpKuOz07Z2D= 4gyAdlqjILV0vlnSsqGIdmLChY</a></p>

+ +
</body>
+ +

</html>

+ +

—-==_mimepart_6a43fdd21a8f1_18563ea084370–

+ +

Started GET “/redefinir_senha/OT9Y4qOpKuOz07Z2D4gyAdlqjILV0vlnSsqGIdmLChY” for 127.0.0.1 at 2026-06-30 14:33:06 -0300 Processing by RedefinicaoSenhasController#edit as HTML

+ +
Parameters: {"token" => "[FILTERED]"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`redefinicao_senha_token` = 'OT9Y4qOpKuOz07Z2D4gyAdlqjILV0vlnSsqGIdmLChY' LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering redefinicao_senhas/edit.html.erb within layouts/application
+Rendered redefinicao_senhas/edit.html.erb within layouts/application (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.5ms | ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started PATCH “/redefinir_senha/OT9Y4qOpKuOz07Z2D4gyAdlqjILV0vlnSsqGIdmLChY” for 127.0.0.1 at 2026-06-30 14:33:06 -0300 Processing by RedefinicaoSenhasController#update as HTML

+ +
Parameters: {"senha" => "NovaSenha123", "senha_confirmation" => "NovaSenha321", "commit" => "Redefinir senha", "token" => "[FILTERED]"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`redefinicao_senha_token` = 'OT9Y4qOpKuOz07Z2D4gyAdlqjILV0vlnSsqGIdmLChY' LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering redefinicao_senhas/edit.html.erb within layouts/application
+Rendered redefinicao_senhas/edit.html.erb within layouts/application (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.3ms | GC: 0.0ms)
+ +

Completed 422 Unprocessable Content in 1ms (Views: 0.4ms | ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '839736' LIMIT 1
+Usuario Exists? (0.1ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' LIMIT 1
+ +

Redirected to www.example.com/usuarios/303/avaliacoes Completed 302 Found in 197ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started DELETE “/logout” for 127.0.0.1 at 2026-06-30 14:33:06 -0300 Processing by SessionsController#destroy as HTML Redirected to www.example.com/ Completed 302 Found in 0ms (ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 0.0ms) Started GET “/inicio” for 127.0.0.1 at 2026-06-30 14:33:06 -0300 Processing by HomeController#index as HTML

+ +
Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+ +

Redirected to www.example.com/ Filter chain halted as :require_login rendered or redirected Completed 302 Found in 1ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:33:06.294177', 'Ciência da Computação', '2026-06-30 17:33:06.294177')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '123' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Usuario Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:06.312893', NULL, NULL, NULL, NULL, 'usuario@teste.com', NULL, '839736', 'Usuário Teste', NULL, NULL, '$2a$12$dFid02EBVrpqdmZIzPeHyuJOp7MO9XDxc5MANefxnyGqIDK4RJUeu', NULL, '2026-06-30 17:33:06.312893')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/” for 127.0.0.1 at 2026-06-30 14:33:06 -0300 Processing by SessionsController#new as HTML

+ +
Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering sessions/new.html.erb within layouts/application
+Rendered sessions/new.html.erb within layouts/application (Duration: 0.2ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.6ms | ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'usuario@teste.com' AND `usuarios`.`id` != 305 LIMIT 1
+Usuario Update (0.4ms)  UPDATE `usuarios` SET `usuarios`.`redefinicao_senha_sent_at` = '2026-06-30 17:33:06.316188', `usuarios`.`redefinicao_senha_token` = '33fewyII6dgo5npAdBmHa80uQNbO99LvmgoCzziWvW8', `usuarios`.`updated_at` = '2026-06-30 17:33:06.316934' WHERE `usuarios`.`id` = 305
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Rendering layout layouts/mailer.html.erb
+Rendering usuario_mailer/redefinicao_senha.html.erb within layouts/mailer
+Rendered usuario_mailer/redefinicao_senha.html.erb within layouts/mailer (Duration: 0.0ms | GC: 0.0ms)
+Rendered layout layouts/mailer.html.erb (Duration: 0.1ms | GC: 0.0ms)
+Rendering layout layouts/mailer.text.erb
+Rendering usuario_mailer/redefinicao_senha.text.erb within layouts/mailer
+Rendered usuario_mailer/redefinicao_senha.text.erb within layouts/mailer (Duration: 0.0ms | GC: 0.0ms)
+Rendered layout layouts/mailer.text.erb (Duration: 0.0ms | GC: 0.0ms)
+ +

UsuarioMailer#redefinicao_senha: processed outbound mail in 0.9ms Delivered mail 6a43fdd24ddc4_18563ea0846df@MacBook-Air-de-Elvis.local.mail (1.0ms) Date: Tue, 30 Jun 2026 14:33:06 -0300 From: camaar@gmail.com To: usuario@teste.com Message-ID: <6a43fdd24ddc4_18563ea0846df@MacBook-Air-de-Elvis.local.mail> Subject: =?UTF-8?Q?Redefini=C3=A7=C3=A3o_de_senha?= MIME-Version: 1.0 Content-Type: multipart/alternative;

+ +
boundary="--==_mimepart_6a43fdd24dbb1_18563ea0845e6";
+charset=UTF-8
+
+ +

Content-Transfer-Encoding: 7bit

+ +

—-==_mimepart_6a43fdd24dbb1_18563ea0845e6 Content-Type: text/plain;

+ +
charset=UTF-8
+
+ +

Content-Transfer-Encoding: quoted-printable

+ +

Ol=C3=A1, Usu=C3=A1rio Teste.

+ +

Voc=C3=AA solicitou a redefini=C3=A7=C3=A3o da sua senha. Acesse o link a= baixo:

+ +

example.com/redefinir_senha/33fewyII6dgo5npAdBmHa80uQNbO99LvmgoCzz= iWvW8

+ +

—-==_mimepart_6a43fdd24dbb1_18563ea0845e6 Content-Type: text/html;

+ +
charset=UTF-8
+
+ +

Content-Transfer-Encoding: quoted-printable

+ +

<!DOCTYPE html> <html>

+ +
<head>
+  <meta http-equiv=3D"Content-Type" content=3D"text/html; charset=3Dutf=
+ +

-8“>

+ +
  <style>
+    /* Email styles need to be inline */
+  </style>
+</head>
+
+<body>
+  <p>Ol=C3=A1, Usu=C3=A1rio Teste.</p>
+ +

<p>Voc=C3=AA solicitou a redefini=C3=A7=C3=A3o da sua senha. Acesse o lin= k abaixo:</p>

+ +

<p><a href=3D“example.com/redefinir_senha/33fewyII6dgo5npAdBmHa80u= QNbO99LvmgoCzziWvW8”>example.com/redefinir_senha/33fewyII6dgo5npAd= BmHa80uQNbO99LvmgoCzziWvW8</a></p>

+ +
</body>
+ +

</html>

+ +

—-==_mimepart_6a43fdd24dbb1_18563ea0845e6–

+ +

Started GET “/redefinir_senha/33fewyII6dgo5npAdBmHa80uQNbO99LvmgoCzziWvW8” for 127.0.0.1 at 2026-06-30 14:33:06 -0300 Processing by RedefinicaoSenhasController#edit as HTML

+ +
Parameters: {"token" => "[FILTERED]"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`redefinicao_senha_token` = '33fewyII6dgo5npAdBmHa80uQNbO99LvmgoCzziWvW8' LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering redefinicao_senhas/edit.html.erb within layouts/application
+Rendered redefinicao_senhas/edit.html.erb within layouts/application (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.4ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.5ms | ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started PATCH “/redefinir_senha/33fewyII6dgo5npAdBmHa80uQNbO99LvmgoCzziWvW8” for 127.0.0.1 at 2026-06-30 14:33:06 -0300 Processing by RedefinicaoSenhasController#update as HTML

+ +
Parameters: {"senha" => "123", "senha_confirmation" => "123", "commit" => "Redefinir senha", "token" => "[FILTERED]"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`redefinicao_senha_token` = '33fewyII6dgo5npAdBmHa80uQNbO99LvmgoCzziWvW8' LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering redefinicao_senhas/edit.html.erb within layouts/application
+Rendered redefinicao_senhas/edit.html.erb within layouts/application (Duration: 0.1ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.3ms | GC: 0.0ms)
+ +

Completed 422 Unprocessable Content in 1ms (Views: 0.4ms | ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.3ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.4ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Departamento' AND `departamentos`.`codigo` = 'TST' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'TST' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('TST', '2026-06-30 17:33:06.326709', 'Departamento', '2026-06-30 17:33:06.326709')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Curso Load (0.2ms)  SELECT `cursos`.* FROM `cursos` WHERE `cursos`.`codigo` = 'TST' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Curso Exists? (0.3ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`codigo` = 'TST' LIMIT 1
+Curso Create (0.2ms)  INSERT INTO `cursos` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('TST', '2026-06-30 17:33:06.328151', 252, 'Curso Teste', '2026-06-30 17:33:06.328151')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Discente Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Discente' AND `usuarios`.`matricula` = '2024001' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '2024001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'discente@teste.com' LIMIT 1
+Administrador Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:06.492718', NULL, NULL, NULL, 251, 'admin@unb.br', NULL, '123', 'Admin', NULL, NULL, '$2a$12$RFz0vBWlkrR55a7nTmhSGuLaA.TuLEgRsQsJmiOsuMwoQN2KsHCca', 'Administrador', '2026-06-30 17:33:06.492718')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Template Create (0.5ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:33:06.494750', 'Template Base', '2026-06-30 17:33:06.494750', 306)
+Elemento Create (0.3ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:33:06.495532', 'Questão 1', 1, 57, '2026-06-30 17:33:06.495532')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:33:06 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin@unb.br", "senha" => "Senha123"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Discente Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:06.527828', 28, NULL, NULL, NULL, 'discente@teste.com', NULL, '2024001', 'Discente Teste', NULL, NULL, '$2a$12$MfY6t6ma87ufWg3SFWHBjuobzdx69b1ohRewQA5GnmG7mcIsw3GvS', 'Discente', '2026-06-30 17:33:06.527828')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Departamento' AND `departamentos`.`codigo` = 'TST' LIMIT 1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0001' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.4ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0001' LIMIT 1
+Disciplina Create (0.3ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0001', '2026-06-30 17:33:06.530954', 252, 'Engenharia de Software', '2026-06-30 17:33:06.530954')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`disciplina_id` = 123 AND `turmas`.`numero_da_turma` = '01' AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.5ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = '01' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 123 LIMIT 1
+Turma Create (0.3ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:33:06.532817', 123, '235M12', '01', '2026.1', '2026-06-30 17:33:06.532817')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Exists? (0.2ms)  SELECT 1 AS one FROM `turmas` INNER JOIN `discentes_turmas` ON `turmas`.`id` = `discentes_turmas`.`turma_id` WHERE `discentes_turmas`.`discente_id` = 307 AND `turmas`.`id` = 115 LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Discente::HABTM_Turmas Create (0.2ms)  INSERT INTO `discentes_turmas` (`discente_id`, `turma_id`) VALUES (307, 115)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Formulario Load (0.2ms)  SELECT `formularios`.* FROM `formularios` WHERE `formularios`.`turma_id` = 115 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:33:06.538562', NULL, NULL, NULL, 'Avaliação de Turma 2026.1', 115, '2026-06-30 17:33:06.538562')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ElementoForm Load (0.2ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`formulario_id` = 88 AND `elemento_forms`.`ordem` = 1 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:33:06.539893', 'Como você avalia o professor?', 88, 1, 'Múltipla Escolha', '2026-06-30 17:33:06.539893')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+CampoForm Load (0.3ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` = 65 AND `campo_forms`.`ordem` = 1 LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+CampoForm Create (0.4ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:33:06.541203', 65, 'Ótimo', 1, NULL, '2026-06-30 17:33:06.541203')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` = 65 AND `campo_forms`.`ordem` = 2 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.4ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:33:06.542434', 65, 'Bom', 2, NULL, '2026-06-30 17:33:06.542434')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+CampoForm Load (0.3ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` = 65 AND `campo_forms`.`ordem` = 3 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.4ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:33:06.543722', 65, 'Regular', 3, NULL, '2026-06-30 17:33:06.543722')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` = 65 AND `campo_forms`.`ordem` = 4 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.4ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:33:06.544898', 65, 'Ruim', 4, NULL, '2026-06-30 17:33:06.544898')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ElementoForm Load (0.2ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`formulario_id` = 88 AND `elemento_forms`.`ordem` = 2 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:33:06.546046', 'Comente sobre a didática', 88, 2, 'Texto', '2026-06-30 17:33:06.546046')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` = 66 AND `campo_forms`.`ordem` = 1 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.4ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:33:06.547223', 66, NULL, 1, NULL, '2026-06-30 17:33:06.547223')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/usuarios/307/avaliacoes” for 127.0.0.1 at 2026-06-30 14:33:06 -0300 Processing by UsuariosController#avaliacoes as HTML

+ +
Parameters: {"usuario_id" => "307"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 307 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering usuarios/avaliacoes.html.erb within layouts/application
+Formulario Load (0.2ms)  SELECT `formularios`.* FROM `formularios` INNER JOIN `turmas` ON `turmas`.`id` = `formularios`.`turma_id` WHERE `formularios`.`turma_id` IN (SELECT `turmas`.`id` FROM `turmas` INNER JOIN `discentes_turmas` ON `turmas`.`id` = `discentes_turmas`.`turma_id` WHERE `discentes_turmas`.`discente_id` = 307)
+Turma Load (0.1ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`id` = 115
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`id` = 123
+HABTM_Docentes Eager Load (0.3ms)  SELECT `docentes_turmas`.`docente_id` AS t0_r0, `docentes_turmas`.`turma_id` AS t0_r1, `usuarios`.`id` AS t1_r0, `usuarios`.`created_at` AS t1_r1, `usuarios`.`curso_id` AS t1_r2, `usuarios`.`definicao_senha_sent_at` AS t1_r3, `usuarios`.`definicao_senha_token` AS t1_r4, `usuarios`.`departamento_id` AS t1_r5, `usuarios`.`email` AS t1_r6, `usuarios`.`formacao` AS t1_r7, `usuarios`.`matricula` AS t1_r8, `usuarios`.`nome` AS t1_r9, `usuarios`.`redefinicao_senha_sent_at` AS t1_r10, `usuarios`.`redefinicao_senha_token` AS t1_r11, `usuarios`.`senha_hash` AS t1_r12, `usuarios`.`type` AS t1_r13, `usuarios`.`updated_at` AS t1_r14 FROM `docentes_turmas` LEFT OUTER JOIN `usuarios` ON `usuarios`.`id` = `docentes_turmas`.`docente_id` AND `usuarios`.`type` = 'Docente' WHERE `usuarios`.`type` = 'Docente' AND `docentes_turmas`.`turma_id` = 115
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`id` = 252
+Rendered usuarios/avaliacoes.html.erb within layouts/application (Duration: 3.8ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 4.2ms | GC: 0.0ms)
+ +

Completed 200 OK in 5ms (Views: 2.4ms | ActiveRecord: 2.3ms (6 queries, 0 cached) | GC: 0.0ms) Started GET “/usuarios/307/formularios/88/responder” for 127.0.0.1 at 2026-06-30 14:33:06 -0300 Processing by UsuariosController#responder_formulario as HTML

+ +
Parameters: {"usuario_id" => "307", "formulario_id" => "88"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 307 LIMIT 1
+Formulario Load (0.2ms)  SELECT `formularios`.* FROM `formularios` WHERE `formularios`.`id` = 88 LIMIT 1
+ElementoForm Load (0.2ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`formulario_id` = 88
+CampoForm Load (0.3ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` IN (65, 66)
+RespostaForm Exists? (0.2ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`formulario_id` = 88 AND `resposta_forms`.`usuario_id` = 307 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering usuarios/responder_formulario.html.erb within layouts/application
+ElementoForm Load (0.3ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`formulario_id` = 88 ORDER BY `elemento_forms`.`ordem` ASC
+CampoForm Load (0.3ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` = 65 ORDER BY `campo_forms`.`ordem` ASC
+Rendered usuarios/responder_formulario.html.erb within layouts/application (Duration: 1.8ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 2.0ms | GC: 0.0ms)
+ +

Completed 200 OK in 5ms (Views: 1.5ms | ActiveRecord: 1.7ms (7 queries, 0 cached) | GC: 0.0ms)

+ +
ElementoForm Load (0.2ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`formulario_id` = 88
+ElementoForm Load (0.2ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`formulario_id` = 88 ORDER BY `elemento_forms`.`ordem` ASC
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` = 65 ORDER BY `campo_forms`.`ordem` ASC LIMIT 1
+ +

Started POST “/usuarios/307/formularios/88/responder” for 127.0.0.1 at 2026-06-30 14:33:06 -0300 Processing by UsuariosController#submeter_resposta as HTML

+ +
Parameters: {"respostas" => {"65" => "52", "66" => "Uma resposta qualquer"}, "usuario_id" => "307", "formulario_id" => "88"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 307 LIMIT 1
+Formulario Load (0.1ms)  SELECT `formularios`.* FROM `formularios` WHERE `formularios`.`id` = 88 LIMIT 1
+ElementoForm Load (0.1ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`formulario_id` = 88
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` IN (65, 66)
+RespostaForm Exists? (0.2ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`formulario_id` = 88 AND `resposta_forms`.`usuario_id` = 307 LIMIT 1
+ElementoForm Load (0.2ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`formulario_id` = 88 ORDER BY `elemento_forms`.`ordem` ASC
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaForm Exists? (0.4ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 307 AND `resposta_forms`.`formulario_id` = 88 LIMIT 1
+RespostaForm Create (0.3ms)  INSERT INTO `resposta_forms` (`created_at`, `data_submissao`, `formulario_id`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:33:06.570301', '2026-06-30', 88, '2026-06-30 17:33:06.570301', 307)
+ElementoForm Load (0.2ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`formulario_id` = 88 ORDER BY `elemento_forms`.`ordem` ASC
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` = 65 AND `campo_forms`.`id` = 52 LIMIT 1
+RespostaElem Create (0.3ms)  INSERT INTO `resposta_elems` (`campo_form_id`, `created_at`, `elemento_form_id`, `resposta_form_id`, `texto_resposta`, `updated_at`) VALUES (52, '2026-06-30 17:33:06.572095', 65, 34, 'Ótimo', '2026-06-30 17:33:06.572095')
+RespostaElem Create (0.2ms)  INSERT INTO `resposta_elems` (`campo_form_id`, `created_at`, `elemento_form_id`, `resposta_form_id`, `texto_resposta`, `updated_at`) VALUES (NULL, '2026-06-30 17:33:06.572731', 66, 34, 'Uma resposta qualquer', '2026-06-30 17:33:06.572731')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/usuarios/307/avaliacoes Completed 302 Found in 7ms (ActiveRecord: 2.8ms (12 queries, 0 cached) | GC: 0.3ms) Started GET “/usuarios/307/avaliacoes” for 127.0.0.1 at 2026-06-30 14:33:06 -0300 Processing by UsuariosController#avaliacoes as HTML

+ +
Parameters: {"usuario_id" => "307"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 307 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering usuarios/avaliacoes.html.erb within layouts/application
+Formulario Load (0.4ms)  SELECT `formularios`.* FROM `formularios` INNER JOIN `turmas` ON `turmas`.`id` = `formularios`.`turma_id` WHERE `formularios`.`turma_id` IN (SELECT `turmas`.`id` FROM `turmas` INNER JOIN `discentes_turmas` ON `turmas`.`id` = `discentes_turmas`.`turma_id` WHERE `discentes_turmas`.`discente_id` = 307)
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`id` = 115
+Disciplina Load (0.3ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`id` = 123
+HABTM_Docentes Eager Load (0.3ms)  SELECT `docentes_turmas`.`docente_id` AS t0_r0, `docentes_turmas`.`turma_id` AS t0_r1, `usuarios`.`id` AS t1_r0, `usuarios`.`created_at` AS t1_r1, `usuarios`.`curso_id` AS t1_r2, `usuarios`.`definicao_senha_sent_at` AS t1_r3, `usuarios`.`definicao_senha_token` AS t1_r4, `usuarios`.`departamento_id` AS t1_r5, `usuarios`.`email` AS t1_r6, `usuarios`.`formacao` AS t1_r7, `usuarios`.`matricula` AS t1_r8, `usuarios`.`nome` AS t1_r9, `usuarios`.`redefinicao_senha_sent_at` AS t1_r10, `usuarios`.`redefinicao_senha_token` AS t1_r11, `usuarios`.`senha_hash` AS t1_r12, `usuarios`.`type` AS t1_r13, `usuarios`.`updated_at` AS t1_r14 FROM `docentes_turmas` LEFT OUTER JOIN `usuarios` ON `usuarios`.`id` = `docentes_turmas`.`docente_id` AND `usuarios`.`type` = 'Docente' WHERE `usuarios`.`type` = 'Docente' AND `docentes_turmas`.`turma_id` = 115
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`id` = 252
+Rendered usuarios/avaliacoes.html.erb within layouts/application (Duration: 3.1ms | GC: 0.2ms)
+Rendered layout layouts/application.html.erb (Duration: 3.4ms | GC: 0.2ms)
+ +

Completed 200 OK in 4ms (Views: 2.2ms | ActiveRecord: 1.5ms (6 queries, 0 cached) | GC: 0.2ms)

+ +
RespostaForm Exists? (0.2ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`formulario_id` = 88 AND `resposta_forms`.`usuario_id` = 307 LIMIT 1
+ +

Started GET “/usuarios/307/formularios/88/responder” for 127.0.0.1 at 2026-06-30 14:33:06 -0300 Processing by UsuariosController#responder_formulario as HTML

+ +
Parameters: {"usuario_id" => "307", "formulario_id" => "88"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 307 LIMIT 1
+Formulario Load (0.2ms)  SELECT `formularios`.* FROM `formularios` WHERE `formularios`.`id` = 88 LIMIT 1
+ElementoForm Load (0.2ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`formulario_id` = 88
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` IN (65, 66)
+RespostaForm Exists? (0.2ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`formulario_id` = 88 AND `resposta_forms`.`usuario_id` = 307 LIMIT 1
+ +

Redirected to www.example.com/usuarios/307/avaliacoes Completed 302 Found in 2ms (ActiveRecord: 1.0ms (5 queries, 0 cached) | GC: 0.2ms) Started GET “/usuarios/307/avaliacoes” for 127.0.0.1 at 2026-06-30 14:33:06 -0300 Processing by UsuariosController#avaliacoes as HTML

+ +
Parameters: {"usuario_id" => "307"}
+Usuario Load (0.1ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 307 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering usuarios/avaliacoes.html.erb within layouts/application
+Formulario Load (0.4ms)  SELECT `formularios`.* FROM `formularios` INNER JOIN `turmas` ON `turmas`.`id` = `formularios`.`turma_id` WHERE `formularios`.`turma_id` IN (SELECT `turmas`.`id` FROM `turmas` INNER JOIN `discentes_turmas` ON `turmas`.`id` = `discentes_turmas`.`turma_id` WHERE `discentes_turmas`.`discente_id` = 307)
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`id` = 115
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`id` = 123
+HABTM_Docentes Eager Load (0.3ms)  SELECT `docentes_turmas`.`docente_id` AS t0_r0, `docentes_turmas`.`turma_id` AS t0_r1, `usuarios`.`id` AS t1_r0, `usuarios`.`created_at` AS t1_r1, `usuarios`.`curso_id` AS t1_r2, `usuarios`.`definicao_senha_sent_at` AS t1_r3, `usuarios`.`definicao_senha_token` AS t1_r4, `usuarios`.`departamento_id` AS t1_r5, `usuarios`.`email` AS t1_r6, `usuarios`.`formacao` AS t1_r7, `usuarios`.`matricula` AS t1_r8, `usuarios`.`nome` AS t1_r9, `usuarios`.`redefinicao_senha_sent_at` AS t1_r10, `usuarios`.`redefinicao_senha_token` AS t1_r11, `usuarios`.`senha_hash` AS t1_r12, `usuarios`.`type` AS t1_r13, `usuarios`.`updated_at` AS t1_r14 FROM `docentes_turmas` LEFT OUTER JOIN `usuarios` ON `usuarios`.`id` = `docentes_turmas`.`docente_id` AND `usuarios`.`type` = 'Docente' WHERE `usuarios`.`type` = 'Docente' AND `docentes_turmas`.`turma_id` = 115
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`id` = 252
+Rendered usuarios/avaliacoes.html.erb within layouts/application (Duration: 2.8ms | GC: 0.1ms)
+Rendered layout layouts/application.html.erb (Duration: 3.0ms | GC: 0.1ms)
+ +

Completed 200 OK in 4ms (Views: 2.0ms | ActiveRecord: 1.3ms (6 queries, 0 cached) | GC: 0.1ms)

+ +
TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.4ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Departamento' AND `departamentos`.`codigo` = 'TST' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'TST' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('TST', '2026-06-30 17:33:06.591087', 'Departamento', '2026-06-30 17:33:06.591087')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Curso Load (0.2ms)  SELECT `cursos`.* FROM `cursos` WHERE `cursos`.`codigo` = 'TST' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Curso Exists? (0.4ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`codigo` = 'TST' LIMIT 1
+Curso Create (0.4ms)  INSERT INTO `cursos` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('TST', '2026-06-30 17:33:06.592632', 253, 'Curso Teste', '2026-06-30 17:33:06.592632')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Discente Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Discente' AND `usuarios`.`matricula` = '2024001' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '2024001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'discente@teste.com' LIMIT 1
+ +

Redirected to www.example.com/admin/306/avaliacoes Completed 302 Found in 201ms (ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/admin/306/templates” for 127.0.0.1 at 2026-06-30 14:33:06 -0300 Processing by TemplatesController#index as HTML

+ +
Parameters: {"admin_id" => "306"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 306 LIMIT 1
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 306 LIMIT 1
+Rendering layout layouts/gerenciamento.html.erb
+Rendering templates/index.html.erb within layouts/gerenciamento
+Template Exists? (0.2ms)  SELECT 1 AS one FROM `templates` WHERE `templates`.`usuario_id` = 306 LIMIT 1
+Template Load (0.2ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`usuario_id` = 306
+Elemento Load (0.2ms)  SELECT `elementos`.* FROM `elementos` WHERE `elementos`.`template_id` = 57
+Campo Load (0.2ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` = 73
+Rendered templates/_grid.html.erb (Duration: 2.3ms | GC: 0.0ms)
+Rendered templates/index.html.erb within layouts/gerenciamento (Duration: 2.5ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 2.6ms | GC: 0.0ms)
+ +

Completed 200 OK in 4ms (Views: 2.0ms | ActiveRecord: 1.4ms (6 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.6ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:33:06.706208', 'Ciência da Computação', '2026-06-30 17:33:06.706208')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '123' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Discente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:06.791890', 29, NULL, NULL, NULL, 'discente@teste.com', NULL, '2024001', 'Discente Teste', NULL, NULL, '$2a$12$Ya7QfOTAa79m1uv8KATLQOvRBOzjoPfs3O6vlUKG4fHIf5DhGLFoq', 'Discente', '2026-06-30 17:33:06.791890')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Departamento' AND `departamentos`.`codigo` = 'TST' LIMIT 1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0001' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0001' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0001', '2026-06-30 17:33:06.794911', 253, 'Engenharia de Software', '2026-06-30 17:33:06.794911')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`disciplina_id` = 124 AND `turmas`.`numero_da_turma` = '01' AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = '01' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 124 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:33:06.796467', 124, '235M12', '01', '2026.1', '2026-06-30 17:33:06.796467')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Exists? (0.2ms)  SELECT 1 AS one FROM `turmas` INNER JOIN `discentes_turmas` ON `turmas`.`id` = `discentes_turmas`.`turma_id` WHERE `discentes_turmas`.`discente_id` = 308 AND `turmas`.`id` = 116 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Discente::HABTM_Turmas Create (0.3ms)  INSERT INTO `discentes_turmas` (`discente_id`, `turma_id`) VALUES (308, 116)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Formulario Load (0.2ms)  SELECT `formularios`.* FROM `formularios` WHERE `formularios`.`turma_id` = 116 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:33:06.798789', NULL, NULL, NULL, 'Avaliação de Turma 2026.1', 116, '2026-06-30 17:33:06.798789')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ElementoForm Load (0.2ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`formulario_id` = 89 AND `elemento_forms`.`ordem` = 1 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:33:06.800101', 'Como você avalia o professor?', 89, 1, 'Múltipla Escolha', '2026-06-30 17:33:06.800101')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` = 67 AND `campo_forms`.`ordem` = 1 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.4ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:33:06.801286', 67, 'Ótimo', 1, NULL, '2026-06-30 17:33:06.801286')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` = 67 AND `campo_forms`.`ordem` = 2 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.3ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:33:06.802375', 67, 'Bom', 2, NULL, '2026-06-30 17:33:06.802375')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` = 67 AND `campo_forms`.`ordem` = 3 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.3ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:33:06.803498', 67, 'Regular', 3, NULL, '2026-06-30 17:33:06.803498')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` = 67 AND `campo_forms`.`ordem` = 4 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.3ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:33:06.804556', 67, 'Ruim', 4, NULL, '2026-06-30 17:33:06.804556')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ElementoForm Load (0.2ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`formulario_id` = 89 AND `elemento_forms`.`ordem` = 2 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.3ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:33:06.805624', 'Comente sobre a didática', 89, 2, 'Texto', '2026-06-30 17:33:06.805624')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+CampoForm Load (0.3ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` = 68 AND `campo_forms`.`ordem` = 1 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.3ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:33:06.806789', 68, NULL, 1, NULL, '2026-06-30 17:33:06.806789')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/usuarios/308/avaliacoes” for 127.0.0.1 at 2026-06-30 14:33:06 -0300 Processing by UsuariosController#avaliacoes as HTML

+ +
Parameters: {"usuario_id" => "308"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 308 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering usuarios/avaliacoes.html.erb within layouts/application
+Formulario Load (0.3ms)  SELECT `formularios`.* FROM `formularios` INNER JOIN `turmas` ON `turmas`.`id` = `formularios`.`turma_id` WHERE `formularios`.`turma_id` IN (SELECT `turmas`.`id` FROM `turmas` INNER JOIN `discentes_turmas` ON `turmas`.`id` = `discentes_turmas`.`turma_id` WHERE `discentes_turmas`.`discente_id` = 308)
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`id` = 116
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`id` = 124
+HABTM_Docentes Eager Load (0.3ms)  SELECT `docentes_turmas`.`docente_id` AS t0_r0, `docentes_turmas`.`turma_id` AS t0_r1, `usuarios`.`id` AS t1_r0, `usuarios`.`created_at` AS t1_r1, `usuarios`.`curso_id` AS t1_r2, `usuarios`.`definicao_senha_sent_at` AS t1_r3, `usuarios`.`definicao_senha_token` AS t1_r4, `usuarios`.`departamento_id` AS t1_r5, `usuarios`.`email` AS t1_r6, `usuarios`.`formacao` AS t1_r7, `usuarios`.`matricula` AS t1_r8, `usuarios`.`nome` AS t1_r9, `usuarios`.`redefinicao_senha_sent_at` AS t1_r10, `usuarios`.`redefinicao_senha_token` AS t1_r11, `usuarios`.`senha_hash` AS t1_r12, `usuarios`.`type` AS t1_r13, `usuarios`.`updated_at` AS t1_r14 FROM `docentes_turmas` LEFT OUTER JOIN `usuarios` ON `usuarios`.`id` = `docentes_turmas`.`docente_id` AND `usuarios`.`type` = 'Docente' WHERE `usuarios`.`type` = 'Docente' AND `docentes_turmas`.`turma_id` = 116
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`id` = 253
+Rendered usuarios/avaliacoes.html.erb within layouts/application (Duration: 2.5ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 2.7ms | GC: 0.0ms)
+ +

Completed 200 OK in 4ms (Views: 1.7ms | ActiveRecord: 1.4ms (6 queries, 0 cached) | GC: 0.1ms) Started GET “/usuarios/308/formularios/89/responder” for 127.0.0.1 at 2026-06-30 14:33:06 -0300 Processing by UsuariosController#responder_formulario as HTML

+ +
Parameters: {"usuario_id" => "308", "formulario_id" => "89"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 308 LIMIT 1
+Formulario Load (0.2ms)  SELECT `formularios`.* FROM `formularios` WHERE `formularios`.`id` = 89 LIMIT 1
+ElementoForm Load (0.2ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`formulario_id` = 89
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` IN (67, 68)
+RespostaForm Exists? (0.2ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`formulario_id` = 89 AND `resposta_forms`.`usuario_id` = 308 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering usuarios/responder_formulario.html.erb within layouts/application
+ElementoForm Load (0.2ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`formulario_id` = 89 ORDER BY `elemento_forms`.`ordem` ASC
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` = 67 ORDER BY `campo_forms`.`ordem` ASC
+Rendered usuarios/responder_formulario.html.erb within layouts/application (Duration: 1.1ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.4ms | GC: 0.1ms)
+ +

Completed 200 OK in 4ms (Views: 1.1ms | ActiveRecord: 1.5ms (7 queries, 0 cached) | GC: 0.1ms)

+ +
ElementoForm Load (0.2ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`formulario_id` = 89 AND `elemento_forms`.`tipo` = 'Texto' LIMIT 1
+ +

Started POST “/usuarios/308/formularios/89/responder” for 127.0.0.1 at 2026-06-30 14:33:06 -0300 Processing by UsuariosController#submeter_resposta as HTML

+ +
Parameters: {"respostas" => {"68" => ""}, "usuario_id" => "308", "formulario_id" => "89"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 308 LIMIT 1
+Formulario Load (0.2ms)  SELECT `formularios`.* FROM `formularios` WHERE `formularios`.`id` = 89 LIMIT 1
+ElementoForm Load (0.2ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`formulario_id` = 89
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` IN (67, 68)
+RespostaForm Exists? (0.2ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`formulario_id` = 89 AND `resposta_forms`.`usuario_id` = 308 LIMIT 1
+ElementoForm Load (0.2ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`formulario_id` = 89 ORDER BY `elemento_forms`.`ordem` ASC
+Rendering layout layouts/application.html.erb
+Rendering usuarios/responder_formulario.html.erb within layouts/application
+CACHE ElementoForm Load (0.0ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`formulario_id` = 89 ORDER BY `elemento_forms`.`ordem` ASC
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` = 67 ORDER BY `campo_forms`.`ordem` ASC
+Rendered usuarios/responder_formulario.html.erb within layouts/application (Duration: 0.7ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.9ms | GC: 0.0ms)
+ +

Completed 422 Unprocessable Content in 3ms (Views: 0.8ms | ActiveRecord: 1.4ms (8 queries, 1 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.3ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Departamento' AND `departamentos`.`codigo` = 'TST' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'TST' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('TST', '2026-06-30 17:33:06.824895', 'Departamento', '2026-06-30 17:33:06.824895')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '123456789' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.3ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:06.826549', NULL, NULL, NULL, 255, 'admin@unb.br', NULL, '123456789', 'Admin', NULL, NULL, '123456', 'Administrador', '2026-06-30 17:33:06.826549')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Administrador Load (0.1ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' ORDER BY `usuarios`.`id` ASC LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Campo Exists? (0.3ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Template Create (0.2ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:33:06.829372', 'Template Prova Matemática 2º semestre', '2026-06-30 17:33:06.829372', 309)
+Elemento Create (0.2ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:33:06.829796', 'Questão Fantasma', 1, 58, '2026-06-30 17:33:06.829796')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:33:06.830199', 74, NULL, 1, 'Texto', '2026-06-30 17:33:06.830199')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Campo Exists? (0.3ms)  SELECT 1 AS one FROM `campos` WHERE `campos`.`ordem` = 1 AND `campos`.`elemento_id` IS NULL LIMIT 1
+Template Create (0.2ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:33:06.831674', 'Template Prova Português 2º semestre', '2026-06-30 17:33:06.831674', 309)
+Elemento Create (0.2ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:33:06.832056', 'Questão Fantasma', 1, 59, '2026-06-30 17:33:06.832056')
+Campo Create (0.2ms)  INSERT INTO `campos` (`created_at`, `elemento_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:33:06.832436', 75, NULL, 1, 'Texto', '2026-06-30 17:33:06.832436')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Administrador Load (0.1ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' ORDER BY `usuarios`.`id` ASC LIMIT 1
+ +

Started GET “/admin/309/templates” for 127.0.0.1 at 2026-06-30 14:33:06 -0300 Processing by TemplatesController#index as HTML

+ +
Parameters: {"admin_id" => "309"}
+Rendering layout layouts/gerenciamento.html.erb
+Rendering templates/index.html.erb within layouts/gerenciamento
+Template Exists? (0.3ms)  SELECT 1 AS one FROM `templates` WHERE `templates`.`usuario_id` = 309 LIMIT 1
+Template Load (0.2ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`usuario_id` = 309
+Elemento Load (0.2ms)  SELECT `elementos`.* FROM `elementos` WHERE `elementos`.`template_id` IN (58, 59)
+Campo Load (0.2ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` IN (74, 75)
+Rendered templates/_grid.html.erb (Duration: 2.2ms | GC: 0.1ms)
+Rendered templates/index.html.erb within layouts/gerenciamento (Duration: 2.2ms | GC: 0.1ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 2.4ms | GC: 0.1ms)
+ +

Completed 200 OK in 3ms (Views: 1.7ms | ActiveRecord: 0.9ms (4 queries, 0 cached) | GC: 0.1ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.4ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Departamento' AND `departamentos`.`codigo` = 'TST' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'TST' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('TST', '2026-06-30 17:33:06.842491', 'Departamento', '2026-06-30 17:33:06.842491')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '123456789' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.2ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:06.844405', NULL, NULL, NULL, 256, 'admin@unb.br', NULL, '123456789', 'Admin', NULL, NULL, '123456', 'Administrador', '2026-06-30 17:33:06.844405')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Template Load (0.2ms)  SELECT `templates`.* FROM `templates`
+Administrador Load (0.1ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' ORDER BY `usuarios`.`id` ASC LIMIT 1
+ +

Started GET “/admin/310/templates” for 127.0.0.1 at 2026-06-30 14:33:06 -0300 Processing by TemplatesController#index as HTML

+ +
Parameters: {"admin_id" => "310"}
+Rendering layout layouts/gerenciamento.html.erb
+Rendering templates/index.html.erb within layouts/gerenciamento
+Template Exists? (0.2ms)  SELECT 1 AS one FROM `templates` WHERE `templates`.`usuario_id` = 310 LIMIT 1
+Rendered templates/_grid.html.erb (Duration: 0.4ms | GC: 0.0ms)
+Rendered templates/index.html.erb within layouts/gerenciamento (Duration: 0.5ms | GC: 0.0ms)
+Rendered layout layouts/gerenciamento.html.erb (Duration: 0.7ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.6ms | ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.2ms)  ROLLBACK
+Administrador Create (7.1ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:06.910014', NULL, NULL, NULL, 254, 'admin@unb.br', NULL, '123', 'Admin', NULL, NULL, '$2a$12$Ug7IDWyItiy3iRI0Ra3zheCAFYK1BwvrfXSALEsD9OqdF.CzYNVZm', 'Administrador', '2026-06-30 17:33:06.910014')
+TRANSACTION (0.5ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (1.8ms)  SAVEPOINT active_record_1
+Template Create (2.6ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:33:06.918968', 'Template Base', '2026-06-30 17:33:06.918968', 311)
+Elemento Create (0.8ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:33:06.921921', 'Questão 1', 1, 60, '2026-06-30 17:33:06.921921')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:33:06 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin@unb.br", "senha" => "Senha123"}
+Usuario Load (53.8ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/311/avaliacoes Completed 302 Found in 244ms (ActiveRecord: 53.8ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Template Count (0.3ms)  SELECT COUNT(*) FROM `templates`
+ +

Started POST “/admin/311/templates” for 127.0.0.1 at 2026-06-30 14:33:07 -0300 Processing by TemplatesController#create as HTML

+ +
Parameters: {"template" => {"nome" => "Avaliação Nova", "administrador_id" => "311", "elementos_attributes" => [{"enunciado" => "Questão 1", "ordem" => "1"}]}, "admin_id" => "311"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 311 LIMIT 1
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 311 LIMIT 1
+ +

Unpermitted parameter: :administrador_id. Context: { controller: TemplatesController, action: create, request: + +

CACHE Administrador Load (0.0ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 311 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Template Create (0.5ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:33:07.172303', 'Avaliação Nova', '2026-06-30 17:33:07.172303', 311)
+Elemento Create (0.2ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:33:07.173095', 'Questão 1', 1, 61, '2026-06-30 17:33:07.173095')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/admin/311/templates Completed 302 Found in 4ms (ActiveRecord: 1.5ms (5 queries, 1 cached) | GC: 0.0ms)

+ +
Template Count (0.2ms)  SELECT COUNT(*) FROM `templates`
+TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:33:07.176731', 'Ciência da Computação', '2026-06-30 17:33:07.176731')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '123' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:07.365914', NULL, NULL, NULL, 257, 'admin@unb.br', NULL, '123', 'Admin', NULL, NULL, '$2a$12$QSTi.7MAXxUCu8ZOulZ4Z.72rOB3OJdK1RXUsifwaqw66c4kasFxS', 'Administrador', '2026-06-30 17:33:07.365914')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Template Create (0.5ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:33:07.367293', 'Template Base', '2026-06-30 17:33:07.367293', 312)
+Elemento Create (0.2ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:33:07.367942', 'Questão 1', 1, 62, '2026-06-30 17:33:07.367942')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:33:07 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/312/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started PATCH “/admin/312/templates/62” for 127.0.0.1 at 2026-06-30 14:33:07 -0300 Processing by TemplatesController#update as HTML

+ +
Parameters: {"template" => {"nome" => "Nome Atualizado"}, "admin_id" => "312", "id" => "62"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 312 LIMIT 1
+Administrador Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 312 LIMIT 1
+Template Load (0.2ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`usuario_id` = 312 AND `templates`.`id` = 62 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Elemento Load (0.4ms)  SELECT `elementos`.* FROM `elementos` WHERE `elementos`.`template_id` = 62
+Campo Load (0.2ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` = 78
+Template Update (0.4ms)  UPDATE `templates` SET `templates`.`nome` = 'Nome Atualizado', `templates`.`updated_at` = '2026-06-30 17:33:07.562758' WHERE `templates`.`id` = 62
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/admin/312/templates Completed 302 Found in 5ms (ActiveRecord: 2.2ms (6 queries, 0 cached) | GC: 0.0ms)

+ +
Template Load (0.2ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`id` = 62 LIMIT 1
+TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.2ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:33:07.566846', 'Ciência da Computação', '2026-06-30 17:33:07.566846')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = '123' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:07.756749', NULL, NULL, NULL, 258, 'admin@unb.br', NULL, '123', 'Admin', NULL, NULL, '$2a$12$ahuhkRCvG.EUkI6ZD2Y2bekqk1qokttKdPIkPl9AT7TEmKvrGA7na', 'Administrador', '2026-06-30 17:33:07.756749')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Template Create (0.6ms)  INSERT INTO `templates` (`created_at`, `nome`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:33:07.758597', 'Template Base', '2026-06-30 17:33:07.758597', 313)
+Elemento Create (0.3ms)  INSERT INTO `elementos` (`created_at`, `enunciado`, `ordem`, `template_id`, `updated_at`) VALUES ('2026-06-30 17:33:07.759366', 'Questão 1', 1, 63, '2026-06-30 17:33:07.759366')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:33:07 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/313/avaliacoes Completed 302 Found in 190ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Template Count (0.2ms)  SELECT COUNT(*) FROM `templates`
+ +

Started DELETE “/admin/313/templates/63” for 127.0.0.1 at 2026-06-30 14:33:07 -0300 Processing by TemplatesController#destroy as HTML

+ +
Parameters: {"admin_id" => "313", "id" => "63"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 313 LIMIT 1
+Administrador Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Administrador' AND `usuarios`.`id` = 313 LIMIT 1
+Template Load (0.2ms)  SELECT `templates`.* FROM `templates` WHERE `templates`.`usuario_id` = 313 AND `templates`.`id` = 63 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Elemento Load (0.4ms)  SELECT `elementos`.* FROM `elementos` WHERE `elementos`.`template_id` = 63
+Campo Load (0.2ms)  SELECT `campos`.* FROM `campos` WHERE `campos`.`elemento_id` = 79
+Elemento Destroy (0.3ms)  DELETE FROM `elementos` WHERE `elementos`.`id` = 79
+Template Destroy (0.2ms)  DELETE FROM `templates` WHERE `templates`.`id` = 63
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/admin/313/templates Completed 303 See Other in 4ms (ActiveRecord: 1.9ms (7 queries, 0 cached) | GC: 0.0ms)

+ +
Template Count (0.2ms)  SELECT COUNT(*) FROM `templates`
+TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_turma' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_turma@unb.br' LIMIT 1
+Docente Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:08.155769', NULL, NULL, NULL, NULL, 'doc_turma@unb.br', 'Doutorado', 'doc_turma', 'Docente Turma', NULL, NULL, '$2a$12$EdTYCoblxO5aiT5VbaJTVeNVGwJINokIFP0NLybOzRr91.WnA3ioG', 'Docente', '2026-06-30 17:33:08.155769')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.4ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:33:08.158246', 'Ciência da Computação', '2026-06-30 17:33:08.158246')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.3ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 259 LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.4ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.3ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:33:08.159937', 259, 'Engenharia de Software', '2026-06-30 17:33:08.159937')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 125 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:33:08.161196', 125, NULL, 'TA', '2026.1', '2026-06-30 17:33:08.161196')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:33:08 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_turma@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_turma@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/314/avaliacoes Completed 302 Found in 193ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started DELETE “/logout” for 127.0.0.1 at 2026-06-30 14:33:08 -0300 Processing by SessionsController#destroy as HTML Redirected to www.example.com/ Completed 302 Found in 0ms (ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 0.0ms) Started GET “/turmas” for 127.0.0.1 at 2026-06-30 14:33:08 -0300 Processing by TurmasController#index as HTML

+ +
Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+ +

Redirected to www.example.com/ Filter chain halted as :require_login rendered or redirected Completed 302 Found in 1ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.6ms)  ROLLBACK
+TRANSACTION (0.2ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.5ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_turma' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_turma@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:08.548880', NULL, NULL, NULL, NULL, 'doc_turma@unb.br', 'Doutorado', 'doc_turma', 'Docente Turma', NULL, NULL, '$2a$12$.YeKqGBNo/32GS/6oOjAieLlb.UlJmAuzKHzg/AbsbNduanL7TG0y', 'Docente', '2026-06-30 17:33:08.548880')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:33:08.551207', 'Ciência da Computação', '2026-06-30 17:33:08.551207')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 260 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:33:08.552624', 260, 'Engenharia de Software', '2026-06-30 17:33:08.552624')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 126 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:33:08.553754', 126, NULL, 'TA', '2026.1', '2026-06-30 17:33:08.553754')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:33:08 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_turma@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_turma@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/315/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/turmas” for 127.0.0.1 at 2026-06-30 14:33:08 -0300 Processing by TurmasController#index as HTML

+ +
Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 315 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering turmas/index.html.erb within layouts/application
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas`
+Rendered turmas/_turma.html.erb (Duration: 0.2ms | GC: 0.0ms)
+Rendered turmas/index.html.erb within layouts/application (Duration: 1.3ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.6ms | GC: 0.0ms)
+ +

Completed 200 OK in 3ms (Views: 1.8ms | ActiveRecord: 0.6ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_turma' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_turma@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:08.938431', NULL, NULL, NULL, NULL, 'doc_turma@unb.br', 'Doutorado', 'doc_turma', 'Docente Turma', NULL, NULL, '$2a$12$eQttk/l7jZwKDOUR8D3sBed/yoJ7pKjnMvT2oKgc8M8dsVGlsLaDW', 'Docente', '2026-06-30 17:33:08.938431')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:33:08.940742', 'Ciência da Computação', '2026-06-30 17:33:08.940742')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 261 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:33:08.942104', 261, 'Engenharia de Software', '2026-06-30 17:33:08.942104')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.3ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 127 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:33:08.943170', 127, NULL, 'TA', '2026.1', '2026-06-30 17:33:08.943170')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:33:08 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_turma@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_turma@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/316/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/turmas/new” for 127.0.0.1 at 2026-06-30 14:33:09 -0300 Processing by TurmasController#new as HTML

+ +
Usuario Load (0.5ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 316 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering turmas/new.html.erb within layouts/application
+Rendered turmas/_form.html.erb (Duration: 0.7ms | GC: 0.0ms)
+Rendered turmas/new.html.erb within layouts/application (Duration: 1.1ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.3ms | GC: 0.0ms)
+ +

Completed 200 OK in 3ms (Views: 1.4ms | ActiveRecord: 0.5ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.6ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_turma' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_turma@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:09.325700', NULL, NULL, NULL, NULL, 'doc_turma@unb.br', 'Doutorado', 'doc_turma', 'Docente Turma', NULL, NULL, '$2a$12$Dp.vN6C97MjMmKeX57bWN.mCrH1W8h6omusA3eDj66Yc3wBfJCVCm', 'Docente', '2026-06-30 17:33:09.325700')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:33:09.327757', 'Ciência da Computação', '2026-06-30 17:33:09.327757')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 262 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:33:09.329176', 262, 'Engenharia de Software', '2026-06-30 17:33:09.329176')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 128 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:33:09.330319', 128, NULL, 'TA', '2026.1', '2026-06-30 17:33:09.330319')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:33:09 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_turma@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_turma@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/317/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Turma Count (0.4ms)  SELECT COUNT(*) FROM `turmas`
+ +

Started POST “/turmas” for 127.0.0.1 at 2026-06-30 14:33:09 -0300 Processing by TurmasController#create as HTML

+ +
Parameters: {"turma" => {"numero_da_turma" => "TC", "semestre" => "2026.2", "disciplina_id" => "128"}}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 317 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Load (0.4ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`id` = 128 LIMIT 1
+Turma Exists? (0.2ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TC' AND `turmas`.`semestre` = '2026.2' AND `turmas`.`disciplina_id` = 128 LIMIT 1
+Turma Create (0.3ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:33:09.522193', 128, NULL, 'TC', '2026.2', '2026-06-30 17:33:09.522193')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/turmas/121 Completed 302 Found in 3ms (ActiveRecord: 1.5ms (4 queries, 0 cached) | GC: 0.0ms)

+ +
Turma Count (0.2ms)  SELECT COUNT(*) FROM `turmas`
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` ORDER BY `turmas`.`id` DESC LIMIT 1
+TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_turma' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_turma@unb.br' LIMIT 1
+Docente Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:09.713169', NULL, NULL, NULL, NULL, 'doc_turma@unb.br', 'Doutorado', 'doc_turma', 'Docente Turma', NULL, NULL, '$2a$12$//D28UHC7lXPh0ZRerll4.E/vua08fRUFe1vqs5SvbyZ55SsUwwyG', 'Docente', '2026-06-30 17:33:09.713169')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:33:09.715427', 'Ciência da Computação', '2026-06-30 17:33:09.715427')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 263 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:33:09.716803', 263, 'Engenharia de Software', '2026-06-30 17:33:09.716803')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 129 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:33:09.717939', 129, NULL, 'TA', '2026.1', '2026-06-30 17:33:09.717939')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:33:09 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_turma@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_turma@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/318/avaliacoes Completed 302 Found in 190ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Turma Count (0.3ms)  SELECT COUNT(*) FROM `turmas`
+ +

Started POST “/turmas” for 127.0.0.1 at 2026-06-30 14:33:09 -0300 Processing by TurmasController#create as HTML

+ +
Parameters: {"turma" => {"numero_da_turma" => "", "semestre" => "", "disciplina_id" => "129"}}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 318 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Load (0.4ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`id` = 129 LIMIT 1
+Turma Exists? (0.3ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = '' AND `turmas`.`semestre` = '' AND `turmas`.`disciplina_id` = 129 LIMIT 1
+TRANSACTION (0.1ms)  ROLLBACK TO SAVEPOINT active_record_1
+Rendering layout layouts/application.html.erb
+Rendering turmas/new.html.erb within layouts/application
+Rendered turmas/_form.html.erb (Duration: 1.1ms | GC: 0.0ms)
+Rendered turmas/new.html.erb within layouts/application (Duration: 1.1ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.4ms | GC: 0.0ms)
+ +

Completed 422 Unprocessable Content in 4ms (Views: 1.5ms | ActiveRecord: 1.2ms (3 queries, 0 cached) | GC: 0.0ms)

+ +
Turma Count (0.2ms)  SELECT COUNT(*) FROM `turmas`
+TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_turma' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_turma@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:10.107146', NULL, NULL, NULL, NULL, 'doc_turma@unb.br', 'Doutorado', 'doc_turma', 'Docente Turma', NULL, NULL, '$2a$12$zAiVv77bXOxGm27jAyZR0OWrXigqLppLz01ENjlvqVOCGS7Zefknu', 'Docente', '2026-06-30 17:33:10.107146')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:33:10.109255', 'Ciência da Computação', '2026-06-30 17:33:10.109255')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.3ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 264 LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.4ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.3ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:33:10.110929', 264, 'Engenharia de Software', '2026-06-30 17:33:10.110929')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 130 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:33:10.112160', 130, NULL, 'TA', '2026.1', '2026-06-30 17:33:10.112160')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:33:10 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_turma@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_turma@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/319/avaliacoes Completed 302 Found in 190ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/turmas/123” for 127.0.0.1 at 2026-06-30 14:33:10 -0300 Processing by TurmasController#show as HTML

+ +
Parameters: {"id" => "123"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 319 LIMIT 1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`id` = 123 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering turmas/show.html.erb within layouts/application
+Rendered turmas/_turma.html.erb (Duration: 0.0ms | GC: 0.0ms)
+Rendered turmas/show.html.erb within layouts/application (Duration: 0.4ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.6ms | GC: 0.0ms)
+ +

Completed 200 OK in 3ms (Views: 0.8ms | ActiveRecord: 0.6ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_turma' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_turma@unb.br' LIMIT 1
+Docente Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:10.497435', NULL, NULL, NULL, NULL, 'doc_turma@unb.br', 'Doutorado', 'doc_turma', 'Docente Turma', NULL, NULL, '$2a$12$JMVoCxm.ImS8bUJBLN2K3.Gshud/VnJhEuTHpcHyOCXFwP7Vr/5dy', 'Docente', '2026-06-30 17:33:10.497435')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:33:10.499953', 'Ciência da Computação', '2026-06-30 17:33:10.499953')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 265 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.3ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:33:10.501482', 265, 'Engenharia de Software', '2026-06-30 17:33:10.501482')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 131 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:33:10.502698', 131, NULL, 'TA', '2026.1', '2026-06-30 17:33:10.502698')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:33:10 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_turma@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_turma@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/320/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/turmas/124/edit” for 127.0.0.1 at 2026-06-30 14:33:10 -0300 Processing by TurmasController#edit as HTML

+ +
Parameters: {"id" => "124"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 320 LIMIT 1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`id` = 124 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering turmas/edit.html.erb within layouts/application
+Rendered turmas/_form.html.erb (Duration: 0.5ms | GC: 0.0ms)
+Rendered turmas/edit.html.erb within layouts/application (Duration: 0.8ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.0ms | GC: 0.0ms)
+ +

Completed 200 OK in 3ms (Views: 1.2ms | ActiveRecord: 0.6ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_turma' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_turma@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:10.885167', NULL, NULL, NULL, NULL, 'doc_turma@unb.br', 'Doutorado', 'doc_turma', 'Docente Turma', NULL, NULL, '$2a$12$JzZ5xoOibgEV1l6jDygic.fjmO19eaUG9UYnb24egkXtkUxQwb8Iq', 'Docente', '2026-06-30 17:33:10.885167')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:33:10.887297', 'Ciência da Computação', '2026-06-30 17:33:10.887297')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 266 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.4ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:33:10.888830', 266, 'Engenharia de Software', '2026-06-30 17:33:10.888830')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 132 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:33:10.890067', 132, NULL, 'TA', '2026.1', '2026-06-30 17:33:10.890067')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:33:10 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_turma@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_turma@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/321/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started PATCH “/turmas/125” for 127.0.0.1 at 2026-06-30 14:33:11 -0300 Processing by TurmasController#update as HTML

+ +
Parameters: {"turma" => {"numero_da_turma" => "TA", "semestre" => "2027.1", "disciplina_id" => "132"}, "id" => "125"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 321 LIMIT 1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`id` = 125 LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Turma Exists? (0.5ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`id` != 125 AND `turmas`.`semestre` = '2027.1' AND `turmas`.`disciplina_id` = 132 LIMIT 1
+Turma Update (0.4ms)  UPDATE `turmas` SET `turmas`.`semestre` = '2027.1', `turmas`.`updated_at` = '2026-06-30 17:33:11.082290' WHERE `turmas`.`id` = 125
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/turmas/125 Completed 303 See Other in 3ms (ActiveRecord: 1.7ms (4 queries, 0 cached) | GC: 0.0ms)

+ +
Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`id` = 125 LIMIT 1
+TRANSACTION (1.3ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_turma' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_turma@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:11.273807', NULL, NULL, NULL, NULL, 'doc_turma@unb.br', 'Doutorado', 'doc_turma', 'Docente Turma', NULL, NULL, '$2a$12$zldjkC.DVm7GSWCUknoHm.0FRbyb.HqWEuO2jvb2qwRDvzDLGi9OS', 'Docente', '2026-06-30 17:33:11.273807')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:33:11.275749', 'Ciência da Computação', '2026-06-30 17:33:11.275749')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 267 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:33:11.277252', 267, 'Engenharia de Software', '2026-06-30 17:33:11.277252')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 133 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:33:11.278448', 133, NULL, 'TA', '2026.1', '2026-06-30 17:33:11.278448')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:33:11 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_turma@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_turma@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/322/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started PATCH “/turmas/126” for 127.0.0.1 at 2026-06-30 14:33:11 -0300 Processing by TurmasController#update as HTML

+ +
Parameters: {"turma" => {"numero_da_turma" => "", "semestre" => "", "disciplina_id" => "133"}, "id" => "126"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 322 LIMIT 1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`id` = 126 LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Turma Exists? (0.5ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = '' AND `turmas`.`id` != 126 AND `turmas`.`semestre` = '' AND `turmas`.`disciplina_id` = 133 LIMIT 1
+TRANSACTION (0.2ms)  ROLLBACK TO SAVEPOINT active_record_1
+Rendering layout layouts/application.html.erb
+Rendering turmas/edit.html.erb within layouts/application
+Rendered turmas/_form.html.erb (Duration: 1.1ms | GC: 0.0ms)
+Rendered turmas/edit.html.erb within layouts/application (Duration: 1.1ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.4ms | GC: 0.0ms)
+ +

Completed 422 Unprocessable Content in 4ms (Views: 1.5ms | ActiveRecord: 1.4ms (3 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc_turma' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'doc_turma@unb.br' LIMIT 1
+Docente Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:11.661581', NULL, NULL, NULL, NULL, 'doc_turma@unb.br', 'Doutorado', 'doc_turma', 'Docente Turma', NULL, NULL, '$2a$12$I5iYQ70EXggD0uFHM4QRwufcwT5900TMfTmHb5PCOKtSKEdPFgZsO', 'Docente', '2026-06-30 17:33:11.661581')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:33:11.663387', 'Ciência da Computação', '2026-06-30 17:33:11.663387')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.3ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Engenharia de Software' AND `disciplinas`.`codigo` = 'CIC0097' AND `disciplinas`.`departamento_id` = 268 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'CIC0097' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC0097', '2026-06-30 17:33:11.664879', 268, 'Engenharia de Software', '2026-06-30 17:33:11.664879')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 134 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:33:11.666065', 134, NULL, 'TA', '2026.1', '2026-06-30 17:33:11.666065')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:33:11 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "doc_turma@unb.br", "senha" => "Senha123"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'doc_turma@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/323/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Turma Exists? (0.7ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TZ' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 134 LIMIT 1
+Turma Create (0.3ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:33:11.857450', 134, NULL, 'TZ', '2026.1', '2026-06-30 17:33:11.857450')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Count (0.2ms)  SELECT COUNT(*) FROM `turmas`
+ +

Started DELETE “/turmas/128” for 127.0.0.1 at 2026-06-30 14:33:11 -0300 Processing by TurmasController#destroy as HTML

+ +
Parameters: {"id" => "128"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 323 LIMIT 1
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`id` = 128 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Load (0.4ms)  SELECT `formularios`.* FROM `formularios` WHERE `formularios`.`turma_id` = 128
+Turma::HABTM_Docentes Delete All (0.2ms)  DELETE FROM `docentes_turmas` WHERE `docentes_turmas`.`turma_id` = 128
+Turma::HABTM_Discentes Delete All (0.2ms)  DELETE FROM `discentes_turmas` WHERE `discentes_turmas`.`turma_id` = 128
+Turma Destroy (0.2ms)  DELETE FROM `turmas` WHERE `turmas`.`id` = 128
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/turmas Completed 303 See Other in 4ms (ActiveRecord: 1.6ms (6 queries, 0 cached) | GC: 0.0ms)

+ +
Turma Count (0.2ms)  SELECT COUNT(*) FROM `turmas`
+TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:33:11.865536', 'Ciência da Computação', '2026-06-30 17:33:11.865536')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm001' LIMIT 1
+Usuario Exists? (0.1ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:12.055434', NULL, NULL, NULL, 269, 'admin@unb.br', NULL, 'adm001', 'Admin Teste', NULL, NULL, '$2a$12$ujw7QGdoyeWUtww1adloQO7IGRp8s/4JESbORTYxFMULZHcISL02G', 'Administrador', '2026-06-30 17:33:12.055434')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Docente Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:12.244917', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Prof Teste', NULL, NULL, '$2a$12$Ve5QYRaz1UhcFfvzMBKFM.plyMglOlnCPC8Oh0ys0tcRBxGvxIf3C', 'Docente', '2026-06-30 17:33:12.244917')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/usuarios” for 127.0.0.1 at 2026-06-30 14:33:12 -0300 Processing by UsuariosController#index as HTML

+ +
Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+ +

Redirected to www.example.com/ Filter chain halted as :require_login rendered or redirected Completed 302 Found in 1ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/” for 127.0.0.1 at 2026-06-30 14:33:12 -0300 Processing by SessionsController#new as HTML

+ +
Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering sessions/new.html.erb within layouts/application
+Rendered sessions/new.html.erb within layouts/application (Duration: 0.2ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.5ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.6ms | ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:33:12.252654', 'Ciência da Computação', '2026-06-30 17:33:12.252654')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:12.441149', NULL, NULL, NULL, 270, 'admin@unb.br', NULL, 'adm001', 'Admin Teste', NULL, NULL, '$2a$12$WYDvTVZvbF7imt1T.q.E4.VqEWytfKBduXxhdX9DS/4SXqDmi7HaS', 'Administrador', '2026-06-30 17:33:12.441149')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Docente Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:12.629935', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Prof Teste', NULL, NULL, '$2a$12$4qEyfvK5nZswY6JqJBljaerbzOXSK6vXKPrvqiu3/6PBWolnn9HZO', 'Docente', '2026-06-30 17:33:12.629935')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:33:12 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "prof@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/327/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/usuarios” for 127.0.0.1 at 2026-06-30 14:33:12 -0300 Processing by UsuariosController#index as HTML

+ +
Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 327 LIMIT 1
+ +

Redirected to www.example.com/inicio Filter chain halted as :require_admin rendered or redirected Completed 302 Found in 1ms (ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/inicio” for 127.0.0.1 at 2026-06-30 14:33:12 -0300 Processing by HomeController#index as HTML

+ +
Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 327 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering home/index.html.erb within layouts/application
+Rendered home/index.html.erb within layouts/application (Duration: 0.0ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.3ms | GC: 0.0ms)
+ +

Completed 200 OK in 1ms (Views: 0.4ms | ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:33:12.826478', 'Ciência da Computação', '2026-06-30 17:33:12.826478')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:13.016342', NULL, NULL, NULL, 271, 'admin@unb.br', NULL, 'adm001', 'Admin Teste', NULL, NULL, '$2a$12$R7MOYPVN7iVcNSw9MXqEaeh6KXvTLfsepTcmvG/qDRp1lkk9.TTGG', 'Administrador', '2026-06-30 17:33:13.016342')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:13.207696', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Prof Teste', NULL, NULL, '$2a$12$BGSCSZR9YX.n00R4rQEHx.MZhJGuipmyg/ntw.9uuUp5lxp7HFGZ6', 'Docente', '2026-06-30 17:33:13.207696')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:33:13 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/328/avaliacoes Completed 302 Found in 190ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/usuarios” for 127.0.0.1 at 2026-06-30 14:33:13 -0300 Processing by UsuariosController#index as HTML

+ +
Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 328 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering usuarios/index.html.erb within layouts/application
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios`
+Rendered usuarios/_usuario.html.erb (Duration: 0.2ms | GC: 0.0ms)
+Rendered usuarios/_usuario.html.erb (Duration: 0.0ms | GC: 0.0ms)
+Rendered usuarios/index.html.erb within layouts/application (Duration: 1.4ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.6ms | GC: 0.0ms)
+ +

Completed 200 OK in 3ms (Views: 1.7ms | ActiveRecord: 0.6ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:33:13.406749', 'Ciência da Computação', '2026-06-30 17:33:13.406749')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm001' LIMIT 1
+Usuario Exists? (0.1ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:13.597457', NULL, NULL, NULL, 272, 'admin@unb.br', NULL, 'adm001', 'Admin Teste', NULL, NULL, '$2a$12$TItIIK1QxmyTEKesvjvp3OKH5i5ww07llcnNR85hNPXyRmI8fMOGK', 'Administrador', '2026-06-30 17:33:13.597457')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.5ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:13.789735', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Prof Teste', NULL, NULL, '$2a$12$Q7txK.Tf0uJPp.nMqykQu.YXQ/G6n76Yl8NsRU/1eyOKicxsTsjA.', 'Docente', '2026-06-30 17:33:13.789735')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/usuarios/331” for 127.0.0.1 at 2026-06-30 14:33:13 -0300 Processing by UsuariosController#show as HTML

+ +
Parameters: {"id" => "331"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+ +

Redirected to www.example.com/ Filter chain halted as :require_login rendered or redirected Completed 302 Found in 1ms (ActiveRecord: 0.2ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:33:13.794871', 'Ciência da Computação', '2026-06-30 17:33:13.794871')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:13.986124', NULL, NULL, NULL, 273, 'admin@unb.br', NULL, 'adm001', 'Admin Teste', NULL, NULL, '$2a$12$5I0SzUwi4KvpQEjChTqD2.UEJayF00kfue0d1bvNRwo5m9pc8x3k2', 'Administrador', '2026-06-30 17:33:13.986124')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.5ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:14.178149', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Prof Teste', NULL, NULL, '$2a$12$5amYVZVuaQjnwzJvDGzaN.LaSQcTihxZbytn2rzxeFqra8IP7QO26', 'Docente', '2026-06-30 17:33:14.178149')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:33:14 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "prof@unb.br", "senha" => "Senha123"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/333/avaliacoes Completed 302 Found in 190ms (ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/usuarios/333” for 127.0.0.1 at 2026-06-30 14:33:14 -0300 Processing by UsuariosController#show as HTML

+ +
Parameters: {"id" => "333"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 333 LIMIT 1
+ +

Redirected to www.example.com/inicio Filter chain halted as :require_admin rendered or redirected Completed 302 Found in 1ms (ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.2ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:33:14.375007', 'Ciência da Computação', '2026-06-30 17:33:14.375007')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:14.565576', NULL, NULL, NULL, 274, 'admin@unb.br', NULL, 'adm001', 'Admin Teste', NULL, NULL, '$2a$12$rPbMV09WDzTHvS/O2h5ZA.fNiXJZ5N19qOx0pjFmOuvpF43Ge5Zgu', 'Administrador', '2026-06-30 17:33:14.565576')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.5ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Docente Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:14.757114', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Prof Teste', NULL, NULL, '$2a$12$6wAH469LbLF7Eq83PV6lG.ZU.lmbdygrq/b/veE0ZICW3v9C279WC', 'Docente', '2026-06-30 17:33:14.757114')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:33:14 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin@unb.br", "senha" => "Senha123"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/334/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/usuarios/335” for 127.0.0.1 at 2026-06-30 14:33:14 -0300 Processing by UsuariosController#show as HTML

+ +
Parameters: {"id" => "335"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 334 LIMIT 1
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 335 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering usuarios/show.html.erb within layouts/application
+Rendered docentes/_docente.html.erb (Duration: 0.0ms | GC: 0.0ms)
+Rendered usuarios/show.html.erb within layouts/application (Duration: 0.4ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 0.6ms | GC: 0.0ms)
+ +

Completed 200 OK in 3ms (Views: 0.8ms | ActiveRecord: 0.7ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:33:14.954324', 'Ciência da Computação', '2026-06-30 17:33:14.954324')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:15.144578', NULL, NULL, NULL, 275, 'admin@unb.br', NULL, 'adm001', 'Admin Teste', NULL, NULL, '$2a$12$IUKS6cIKHXq7wMnHyf6Wc.ea1oRvwKKuX11eIuCaeomKiUi1.6J/W', 'Administrador', '2026-06-30 17:33:15.144578')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.5ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Docente Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:15.336457', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Prof Teste', NULL, NULL, '$2a$12$HRD5pz2L2iESDxdbJWsl9OnjLkFgjNxN1qLWzfcs1N0huqUr/AstC', 'Docente', '2026-06-30 17:33:15.336457')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started DELETE “/usuarios/337” for 127.0.0.1 at 2026-06-30 14:33:15 -0300 Processing by UsuariosController#destroy as HTML

+ +
Parameters: {"id" => "337"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` IS NULL LIMIT 1
+ +

Redirected to www.example.com/ Filter chain halted as :require_login rendered or redirected Completed 302 Found in 1ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:33:15.341993', 'Ciência da Computação', '2026-06-30 17:33:15.341993')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:15.531703', NULL, NULL, NULL, 276, 'admin@unb.br', NULL, 'adm001', 'Admin Teste', NULL, NULL, '$2a$12$rmuOeM4BKJrtc2EJQo67pehFlONep5xBLh/h9gn8GXv.z36I887Gi', 'Administrador', '2026-06-30 17:33:15.531703')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.1ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:15.721770', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Prof Teste', NULL, NULL, '$2a$12$zOuyCoHZUqhDZDrAnTKwaOQECANQzU8DX/pwE9jVey3UK.8qbJbVy', 'Docente', '2026-06-30 17:33:15.721770')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:33:15 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "prof@unb.br", "senha" => "Senha123"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/339/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms) Started DELETE “/usuarios/339” for 127.0.0.1 at 2026-06-30 14:33:15 -0300 Processing by UsuariosController#destroy as HTML

+ +
Parameters: {"id" => "339"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 339 LIMIT 1
+ +

Redirected to www.example.com/inicio Filter chain halted as :require_admin rendered or redirected Completed 302 Found in 1ms (ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:33:15.917628', 'Ciência da Computação', '2026-06-30 17:33:15.917628')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:16.106987', NULL, NULL, NULL, 277, 'admin@unb.br', NULL, 'adm001', 'Admin Teste', NULL, NULL, '$2a$12$7d9Yoz3DV6XgooGT2t9o3OlauWqYgUAf53dLLHMfTJ5k8HwVXx5Yu', 'Administrador', '2026-06-30 17:33:16.106987')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:16.296426', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Prof Teste', NULL, NULL, '$2a$12$GzLBsf0BBo48Ivzxc2exdOOB3kTDCPwYIWouodxeTmfdJCaup3yym', 'Docente', '2026-06-30 17:33:16.296426')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:33:16 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/340/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started DELETE “/usuarios/341” for 127.0.0.1 at 2026-06-30 14:33:16 -0300 Processing by UsuariosController#destroy as HTML

+ +
Parameters: {"id" => "341"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 340 LIMIT 1
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 341 LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Docente::HABTM_Turmas Delete All (0.4ms)  DELETE FROM `docentes_turmas` WHERE `docentes_turmas`.`docente_id` = 341
+Docente Destroy (0.4ms)  DELETE FROM `usuarios` WHERE `usuarios`.`id` = 341
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/usuarios Completed 303 See Other in 3ms (ActiveRecord: 1.8ms (4 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (1.4ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:33:16.493599', 'Ciência da Computação', '2026-06-30 17:33:16.493599')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:16.682242', NULL, NULL, NULL, 278, 'admin@unb.br', NULL, 'adm001', 'Admin Teste', NULL, NULL, '$2a$12$G1MJIcZdOVh0iSKmVlJm/uaJPNAphYYXNuyjoqbK54QSUp7bXxuJ2', 'Administrador', '2026-06-30 17:33:16.682242')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:16.871496', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Prof Teste', NULL, NULL, '$2a$12$y6mQXPjIsrbEqHqMrpKGSekpfmu4olNXJ6HMXgHXnlCivbYA1Gx7W', 'Docente', '2026-06-30 17:33:16.871496')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:33:16 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/342/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/usuarios/new” for 127.0.0.1 at 2026-06-30 14:33:17 -0300 Processing by UsuariosController#new as HTML

+ +
Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 342 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering usuarios/new.html.erb within layouts/application
+Rendered usuarios/_form.html.erb (Duration: 0.8ms | GC: 0.0ms)
+Rendered usuarios/new.html.erb within layouts/application (Duration: 1.2ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.5ms | GC: 0.0ms)
+ +

Completed 200 OK in 3ms (Views: 1.6ms | ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:33:17.067775', 'Ciência da Computação', '2026-06-30 17:33:17.067775')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:17.256377', NULL, NULL, NULL, 279, 'admin@unb.br', NULL, 'adm001', 'Admin Teste', NULL, NULL, '$2a$12$UcevIWAYjbVNjwaoHAiadeAZpet.QU2K8cFvddcK1XAz00d05DuLS', 'Administrador', '2026-06-30 17:33:17.256377')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Docente Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:17.445554', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Prof Teste', NULL, NULL, '$2a$12$PaaTvk4eQFq1t3tCNI7rieE102WjHLof0qV5tm1gsEV8A9UE4sYXC', 'Docente', '2026-06-30 17:33:17.445554')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:33:17 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/344/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/usuarios/345/edit” for 127.0.0.1 at 2026-06-30 14:33:17 -0300 Processing by UsuariosController#edit as HTML

+ +
Parameters: {"id" => "345"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 344 LIMIT 1
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 345 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering usuarios/edit.html.erb within layouts/application
+Rendered usuarios/_form.html.erb (Duration: 0.7ms | GC: 0.0ms)
+Rendered usuarios/edit.html.erb within layouts/application (Duration: 0.9ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.2ms | GC: 0.0ms)
+ +

Completed 200 OK in 3ms (Views: 1.3ms | ActiveRecord: 0.6ms (2 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:33:17.641750', 'Ciência da Computação', '2026-06-30 17:33:17.641750')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:17.831033', NULL, NULL, NULL, 280, 'admin@unb.br', NULL, 'adm001', 'Admin Teste', NULL, NULL, '$2a$12$65SKbnnYfSXhBwVw6dLbuOR6ZAffjhtgnJJPC43iTcOUAU.m.hXe2', 'Administrador', '2026-06-30 17:33:17.831033')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:18.020873', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Prof Teste', NULL, NULL, '$2a$12$CFf0DCYMoNgWz8FkrO0Ys.xeV2LVmzNOyeDn8XicULNSowRClUpBO', 'Docente', '2026-06-30 17:33:18.020873')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:33:18 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/346/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Usuario Count (0.3ms)  SELECT COUNT(*) FROM `usuarios`
+ +

Started POST “/usuarios” for 127.0.0.1 at 2026-06-30 14:33:18 -0300 Processing by UsuariosController#create as HTML

+ +
Parameters: {"usuario" => {"matricula" => "novo123", "email" => "[FILTERED]", "nome" => "Novo Teste", "type" => "Docente", "senha" => "Senha123", "senha_confirmation" => "Senha123", "formacao" => "Mestrado"}}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 346 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'novo123' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'novo@unb.br' LIMIT 1
+Docente Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:18.213917', NULL, NULL, NULL, NULL, 'novo@unb.br', 'Mestrado', 'novo123', 'Novo Teste', NULL, NULL, NULL, 'Docente', '2026-06-30 17:33:18.213917')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/docentes/348 Completed 302 Found in 3ms (ActiveRecord: 1.5ms (4 queries, 0 cached) | GC: 0.0ms)

+ +
Usuario Count (0.2ms)  SELECT COUNT(*) FROM `usuarios`
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` ORDER BY `usuarios`.`id` DESC LIMIT 1
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` ORDER BY `usuarios`.`id` DESC LIMIT 1
+TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:33:18.218780', 'Ciência da Computação', '2026-06-30 17:33:18.218780')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:18.407304', NULL, NULL, NULL, 281, 'admin@unb.br', NULL, 'adm001', 'Admin Teste', NULL, NULL, '$2a$12$dsDxrNjct7.OHe25T3cE5ORDXtFS506zyLJvOigdCjbpm1KnYStZm', 'Administrador', '2026-06-30 17:33:18.407304')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Docente Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:18.596325', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Prof Teste', NULL, NULL, '$2a$12$2sVxOfg9KmcT8beUi/7IveOjEtJOrxXDZZ4bGvDpDo5Y7YvbdHzNS', 'Docente', '2026-06-30 17:33:18.596325')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:33:18 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/349/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
Usuario Count (0.3ms)  SELECT COUNT(*) FROM `usuarios`
+ +

Started POST “/usuarios” for 127.0.0.1 at 2026-06-30 14:33:18 -0300 Processing by UsuariosController#create as HTML

+ +
Parameters: {"usuario" => {"email" => "[FILTERED]"}}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 349 LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.5ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` IS NULL LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = '' LIMIT 1
+TRANSACTION (0.2ms)  ROLLBACK TO SAVEPOINT active_record_1
+Rendering layout layouts/application.html.erb
+Rendering usuarios/new.html.erb within layouts/application
+Rendered usuarios/_form.html.erb (Duration: 1.4ms | GC: 0.0ms)
+Rendered usuarios/new.html.erb within layouts/application (Duration: 1.5ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.7ms | GC: 0.0ms)
+ +

Completed 422 Unprocessable Content in 4ms (Views: 1.9ms | ActiveRecord: 1.4ms (3 queries, 0 cached) | GC: 0.0ms)

+ +
Usuario Count (0.3ms)  SELECT COUNT(*) FROM `usuarios`
+TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:33:18.795662', 'Ciência da Computação', '2026-06-30 17:33:18.795662')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:18.985496', NULL, NULL, NULL, 282, 'admin@unb.br', NULL, 'adm001', 'Admin Teste', NULL, NULL, '$2a$12$O0d03EMck/4zISKJDhV/7ukStDDZmcpRzIWQywP56g3H3WxXHnwt2', 'Administrador', '2026-06-30 17:33:18.985496')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.5ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:19.175458', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Prof Teste', NULL, NULL, '$2a$12$S7bD7FfTuO.M7cRUrBPnAeq6y6kQ8MsozcWE1qmBmVoGuQUsIaCZG', 'Docente', '2026-06-30 17:33:19.175458')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:33:19 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin@unb.br", "senha" => "Senha123"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/351/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms) Started PATCH “/usuarios/352” for 127.0.0.1 at 2026-06-30 14:33:19 -0300 Processing by UsuariosController#update as HTML

+ +
Parameters: {"usuario" => {"nome" => "Nome Atualizado"}, "id" => "352"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 351 LIMIT 1
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 352 LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.5ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' AND `usuarios`.`id` != 352 LIMIT 1
+Docente Update (0.4ms)  UPDATE `usuarios` SET `usuarios`.`nome` = 'Nome Atualizado', `usuarios`.`updated_at` = '2026-06-30 17:33:19.369515' WHERE `usuarios`.`id` = 352
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/docentes/352 Completed 303 See Other in 4ms (ActiveRecord: 2.0ms (4 queries, 0 cached) | GC: 0.0ms)

+ +
Docente Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`type` = 'Docente' AND `usuarios`.`id` = 352 LIMIT 1
+TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.3ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:33:19.374121', 'Ciência da Computação', '2026-06-30 17:33:19.374121')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:19.563335', NULL, NULL, NULL, 283, 'admin@unb.br', NULL, 'adm001', 'Admin Teste', NULL, NULL, '$2a$12$Gm.Xcb5JkMmn8KVDrt.WzO8l6W3hGep9.v9mNr56b3CmE1r0RQnA.', 'Administrador', '2026-06-30 17:33:19.563335')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.5ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:19.753444', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Prof Teste', NULL, NULL, '$2a$12$IdJ3c5l6ROIJiPSsMyTiQuXaf9DvIFruPNDJHeW8B5KbppAiy9yde', 'Docente', '2026-06-30 17:33:19.753444')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:33:19 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin@unb.br", "senha" => "Senha123"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/353/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.0ms) Started PATCH “/usuarios/354” for 127.0.0.1 at 2026-06-30 14:33:19 -0300 Processing by UsuariosController#update as HTML

+ +
Parameters: {"usuario" => {"email" => "[FILTERED]"}, "id" => "354"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 353 LIMIT 1
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 354 LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.5ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = '' AND `usuarios`.`id` != 354 LIMIT 1
+TRANSACTION (0.1ms)  ROLLBACK TO SAVEPOINT active_record_1
+Rendering layout layouts/application.html.erb
+Rendering usuarios/edit.html.erb within layouts/application
+Rendered usuarios/_form.html.erb (Duration: 1.0ms | GC: 0.0ms)
+Rendered usuarios/edit.html.erb within layouts/application (Duration: 1.1ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.4ms | GC: 0.0ms)
+ +

Completed 422 Unprocessable Content in 4ms (Views: 1.5ms | ActiveRecord: 1.4ms (3 queries, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.1ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.4ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:33:19.951787', 'Ciência da Computação', '2026-06-30 17:33:19.951787')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:20.140678', NULL, NULL, NULL, 284, 'admin@unb.br', NULL, 'adm001', 'Admin Teste', NULL, NULL, '$2a$12$FU4kdHTCGL/hBmyde3g0MuHjdj4sUIvgXmtQIoABa.q01dHXu7s6C', 'Administrador', '2026-06-30 17:33:20.140678')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:20.329875', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Prof Teste', NULL, NULL, '$2a$12$.nbXLpsOPSz07Q5fVwlhVuFveBq9uy6Y/L2F2IueDnRySgeLFWrci', 'Docente', '2026-06-30 17:33:20.329875')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.3ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Software' AND `disciplinas`.`codigo` = 'SW1' AND `disciplinas`.`departamento_id` = 284 LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.4ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'SW1' LIMIT 1
+Disciplina Create (0.3ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('SW1', '2026-06-30 17:33:20.332159', 284, 'Software', '2026-06-30 17:33:20.332159')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 135 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 135 LIMIT 1
+Turma Create (0.3ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:33:20.333953', 135, NULL, 'TA', '2026.1', '2026-06-30 17:33:20.333953')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:33:20.334665', NULL, NULL, NULL, NULL, 129, '2026-06-30 17:33:20.334665')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:33:20.335668', 'Avalie o professor', 90, 1, 'Texto', '2026-06-30 17:33:20.335668')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.4ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:33:20.336635', 69, 'Resposta', 1, NULL, '2026-06-30 17:33:20.336635')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Turma::HABTM_Docentes Create (0.4ms)  INSERT INTO `docentes_turmas` (`docente_id`, `turma_id`) VALUES (356, 129)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Curso Load (0.2ms)  SELECT `cursos`.* FROM `cursos` WHERE `cursos`.`nome` = 'Ciência da Computação' AND `cursos`.`codigo` = 'CIC' AND `cursos`.`departamento_id` = 284 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Curso Exists? (0.4ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`codigo` = 'CIC' LIMIT 1
+Curso Create (0.3ms)  INSERT INTO `cursos` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:33:20.340018', 284, 'Ciência da Computação', '2026-06-30 17:33:20.340018')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'disc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'aluno@unb.br' LIMIT 1
+Discente Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:20.528562', 30, NULL, NULL, NULL, 'aluno@unb.br', NULL, 'disc001', 'Aluno Teste', NULL, NULL, '$2a$12$L7ihpvHDVI0clK5V4aH6ye2ki8yc3Sqqg.TzTzVuK6fKVdRz049vO', 'Discente', '2026-06-30 17:33:20.528562')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Turma::HABTM_Discentes Create (0.4ms)  INSERT INTO `discentes_turmas` (`discente_id`, `turma_id`) VALUES (357, 129)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:33:20 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "prof@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/356/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/usuarios/356/avaliacoes” for 127.0.0.1 at 2026-06-30 14:33:20 -0300 Processing by UsuariosController#avaliacoes as HTML

+ +
Parameters: {"usuario_id" => "356"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 356 LIMIT 1
+CACHE Usuario Load (0.0ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 356 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering usuarios/avaliacoes.html.erb within layouts/application
+Formulario Load (0.6ms)  SELECT `formularios`.* FROM `formularios` INNER JOIN `turmas` ON `turmas`.`id` = `formularios`.`turma_id` WHERE `formularios`.`turma_id` IN (SELECT `turmas`.`id` FROM `turmas` INNER JOIN `docentes_turmas` ON `turmas`.`id` = `docentes_turmas`.`turma_id` WHERE `docentes_turmas`.`docente_id` = 356)
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`id` = 129
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`id` = 135
+HABTM_Docentes Eager Load (0.5ms)  SELECT `docentes_turmas`.`docente_id` AS t0_r0, `docentes_turmas`.`turma_id` AS t0_r1, `usuarios`.`id` AS t1_r0, `usuarios`.`created_at` AS t1_r1, `usuarios`.`curso_id` AS t1_r2, `usuarios`.`definicao_senha_sent_at` AS t1_r3, `usuarios`.`definicao_senha_token` AS t1_r4, `usuarios`.`departamento_id` AS t1_r5, `usuarios`.`email` AS t1_r6, `usuarios`.`formacao` AS t1_r7, `usuarios`.`matricula` AS t1_r8, `usuarios`.`nome` AS t1_r9, `usuarios`.`redefinicao_senha_sent_at` AS t1_r10, `usuarios`.`redefinicao_senha_token` AS t1_r11, `usuarios`.`senha_hash` AS t1_r12, `usuarios`.`type` AS t1_r13, `usuarios`.`updated_at` AS t1_r14 FROM `docentes_turmas` LEFT OUTER JOIN `usuarios` ON `usuarios`.`id` = `docentes_turmas`.`docente_id` AND `usuarios`.`type` = 'Docente' WHERE `usuarios`.`type` = 'Docente' AND `docentes_turmas`.`turma_id` = 129
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`id` = 284
+Rendered usuarios/avaliacoes.html.erb within layouts/application (Duration: 8.6ms | GC: 3.4ms)
+Rendered layout layouts/application.html.erb (Duration: 8.9ms | GC: 3.4ms)
+ +

Completed 200 OK in 11ms (Views: 7.4ms | ActiveRecord: 2.0ms (7 queries, 1 cached) | GC: 3.4ms)

+ +
TRANSACTION (0.9ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:33:20.733977', 'Ciência da Computação', '2026-06-30 17:33:20.733977')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:20.923115', NULL, NULL, NULL, 285, 'admin@unb.br', NULL, 'adm001', 'Admin Teste', NULL, NULL, '$2a$12$N3DenRvmyBpzlPXBihW/0uExELRsVDTYSc2ujK3.INpuu0o16LKg6', 'Administrador', '2026-06-30 17:33:20.923115')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Docente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:21.112617', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Prof Teste', NULL, NULL, '$2a$12$hGi0KcanUIsnGtlaUBTKJuWElokXAUE/JwMCZE8d49SHEywzoYL.i', 'Docente', '2026-06-30 17:33:21.112617')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.3ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Software' AND `disciplinas`.`codigo` = 'SW1' AND `disciplinas`.`departamento_id` = 285 LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.4ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'SW1' LIMIT 1
+Disciplina Create (0.3ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('SW1', '2026-06-30 17:33:21.115361', 285, 'Software', '2026-06-30 17:33:21.115361')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 136 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 136 LIMIT 1
+Turma Create (0.3ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:33:21.117121', 136, NULL, 'TA', '2026.1', '2026-06-30 17:33:21.117121')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:33:21.117800', NULL, NULL, NULL, NULL, 130, '2026-06-30 17:33:21.117800')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:33:21.118767', 'Avalie o professor', 91, 1, 'Texto', '2026-06-30 17:33:21.118767')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.4ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:33:21.119680', 70, 'Resposta', 1, NULL, '2026-06-30 17:33:21.119680')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma::HABTM_Docentes Create (0.4ms)  INSERT INTO `docentes_turmas` (`docente_id`, `turma_id`) VALUES (359, 130)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Curso Load (0.2ms)  SELECT `cursos`.* FROM `cursos` WHERE `cursos`.`nome` = 'Ciência da Computação' AND `cursos`.`codigo` = 'CIC' AND `cursos`.`departamento_id` = 285 LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Curso Exists? (0.7ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`codigo` = 'CIC' LIMIT 1
+Curso Create (0.2ms)  INSERT INTO `cursos` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:33:21.122653', 285, 'Ciência da Computação', '2026-06-30 17:33:21.122653')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'disc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'aluno@unb.br' LIMIT 1
+Discente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:21.311148', 31, NULL, NULL, NULL, 'aluno@unb.br', NULL, 'disc001', 'Aluno Teste', NULL, NULL, '$2a$12$g3QkiNGFEmu8ohdwfFLepOZmPGwKlsuESrM6Q43w1uzEi6tZElkCO', 'Discente', '2026-06-30 17:33:21.311148')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma::HABTM_Discentes Create (0.4ms)  INSERT INTO `discentes_turmas` (`discente_id`, `turma_id`) VALUES (360, 130)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:33:21 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "aluno@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'aluno@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/360/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/usuarios/360/avaliacoes” for 127.0.0.1 at 2026-06-30 14:33:21 -0300 Processing by UsuariosController#avaliacoes as HTML

+ +
Parameters: {"usuario_id" => "360"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 360 LIMIT 1
+CACHE Usuario Load (0.0ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 360 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering usuarios/avaliacoes.html.erb within layouts/application
+Formulario Load (0.4ms)  SELECT `formularios`.* FROM `formularios` INNER JOIN `turmas` ON `turmas`.`id` = `formularios`.`turma_id` WHERE `formularios`.`turma_id` IN (SELECT `turmas`.`id` FROM `turmas` INNER JOIN `discentes_turmas` ON `turmas`.`id` = `discentes_turmas`.`turma_id` WHERE `discentes_turmas`.`discente_id` = 360)
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`id` = 130
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`id` = 136
+HABTM_Docentes Eager Load (0.4ms)  SELECT `docentes_turmas`.`docente_id` AS t0_r0, `docentes_turmas`.`turma_id` AS t0_r1, `usuarios`.`id` AS t1_r0, `usuarios`.`created_at` AS t1_r1, `usuarios`.`curso_id` AS t1_r2, `usuarios`.`definicao_senha_sent_at` AS t1_r3, `usuarios`.`definicao_senha_token` AS t1_r4, `usuarios`.`departamento_id` AS t1_r5, `usuarios`.`email` AS t1_r6, `usuarios`.`formacao` AS t1_r7, `usuarios`.`matricula` AS t1_r8, `usuarios`.`nome` AS t1_r9, `usuarios`.`redefinicao_senha_sent_at` AS t1_r10, `usuarios`.`redefinicao_senha_token` AS t1_r11, `usuarios`.`senha_hash` AS t1_r12, `usuarios`.`type` AS t1_r13, `usuarios`.`updated_at` AS t1_r14 FROM `docentes_turmas` LEFT OUTER JOIN `usuarios` ON `usuarios`.`id` = `docentes_turmas`.`docente_id` AND `usuarios`.`type` = 'Docente' WHERE `usuarios`.`type` = 'Docente' AND `docentes_turmas`.`turma_id` = 130
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`id` = 285
+Rendered usuarios/avaliacoes.html.erb within layouts/application (Duration: 3.7ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 3.9ms | GC: 0.0ms)
+ +

Completed 200 OK in 6ms (Views: 2.7ms | ActiveRecord: 1.8ms (7 queries, 1 cached) | GC: 0.3ms)

+ +
TRANSACTION (0.9ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:33:21.511608', 'Ciência da Computação', '2026-06-30 17:33:21.511608')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:21.700126', NULL, NULL, NULL, 286, 'admin@unb.br', NULL, 'adm001', 'Admin Teste', NULL, NULL, '$2a$12$RcelZbWQoxWyC.OrGlyR1eIQzDc6Hup0gEk/vL7IAnN44BCtcD5.S', 'Administrador', '2026-06-30 17:33:21.700126')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Docente Create (0.7ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:21.889507', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Prof Teste', NULL, NULL, '$2a$12$xafCzb2gdM6vgdBvmIIhSOTMJEDr3PeJvVMIDLJxbRo0PxMDS8LMS', 'Docente', '2026-06-30 17:33:21.889507')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.4ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Software' AND `disciplinas`.`codigo` = 'SW1' AND `disciplinas`.`departamento_id` = 286 LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.4ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'SW1' LIMIT 1
+Disciplina Create (0.3ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('SW1', '2026-06-30 17:33:21.892414', 286, 'Software', '2026-06-30 17:33:21.892414')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 137 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 137 LIMIT 1
+Turma Create (0.3ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:33:21.894240', 137, NULL, 'TA', '2026.1', '2026-06-30 17:33:21.894240')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:33:21.894948', NULL, NULL, NULL, NULL, 131, '2026-06-30 17:33:21.894948')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:33:21.896180', 'Avalie o professor', 92, 1, 'Texto', '2026-06-30 17:33:21.896180')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+CampoForm Create (0.4ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:33:21.897082', 71, 'Resposta', 1, NULL, '2026-06-30 17:33:21.897082')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma::HABTM_Docentes Create (0.3ms)  INSERT INTO `docentes_turmas` (`docente_id`, `turma_id`) VALUES (362, 131)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Curso Load (0.2ms)  SELECT `cursos`.* FROM `cursos` WHERE `cursos`.`nome` = 'Ciência da Computação' AND `cursos`.`codigo` = 'CIC' AND `cursos`.`departamento_id` = 286 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Curso Exists? (0.3ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`codigo` = 'CIC' LIMIT 1
+Curso Create (0.2ms)  INSERT INTO `cursos` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:33:21.899726', 286, 'Ciência da Computação', '2026-06-30 17:33:21.899726')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'disc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'aluno@unb.br' LIMIT 1
+Discente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:22.088684', 32, NULL, NULL, NULL, 'aluno@unb.br', NULL, 'disc001', 'Aluno Teste', NULL, NULL, '$2a$12$/ivFyN08F3nL4SK1foM1le29HJ5c5KzXHX4crCmyLlkBnbjVG5T2C', 'Discente', '2026-06-30 17:33:22.088684')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma::HABTM_Discentes Create (0.4ms)  INSERT INTO `discentes_turmas` (`discente_id`, `turma_id`) VALUES (363, 131)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:33:22 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "admin@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+ +

Redirected to www.example.com/admin/361/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms) Started GET “/usuarios/361/avaliacoes” for 127.0.0.1 at 2026-06-30 14:33:22 -0300 Processing by UsuariosController#avaliacoes as HTML

+ +
Parameters: {"usuario_id" => "361"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 361 LIMIT 1
+CACHE Usuario Load (0.0ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 361 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering usuarios/avaliacoes.html.erb within layouts/application
+Formulario Load (0.3ms)  SELECT `formularios`.* FROM `formularios` INNER JOIN `turmas` ON `turmas`.`id` = `formularios`.`turma_id` WHERE `formularios`.`turma_id` IN (SELECT `turmas`.`id` FROM `turmas` WHERE (1=0))
+Rendered usuarios/avaliacoes.html.erb within layouts/application (Duration: 1.0ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.3ms | GC: 0.0ms)
+ +

Completed 200 OK in 3ms (Views: 1.2ms | ActiveRecord: 0.6ms (3 queries, 1 cached) | GC: 0.0ms)

+ +
TRANSACTION (1.5ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.3ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:33:22.287050', 'Ciência da Computação', '2026-06-30 17:33:22.287050')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:22.475624', NULL, NULL, NULL, 287, 'admin@unb.br', NULL, 'adm001', 'Admin Teste', NULL, NULL, '$2a$12$RdlesIc.Aa5JA5XPm7F/ueMmzZijphwe2NL5qi7lGiSmvlmLuzau6', 'Administrador', '2026-06-30 17:33:22.475624')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.5ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:22.664689', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Prof Teste', NULL, NULL, '$2a$12$G6Ey2BRL7UCOVecNe2kAPObe9zc.h8/JVOXUATXpicyTkIHBN6sCG', 'Docente', '2026-06-30 17:33:22.664689')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.3ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Software' AND `disciplinas`.`codigo` = 'SW1' AND `disciplinas`.`departamento_id` = 287 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'SW1' LIMIT 1
+Disciplina Create (0.2ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('SW1', '2026-06-30 17:33:22.666715', 287, 'Software', '2026-06-30 17:33:22.666715')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 138 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 138 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:33:22.668248', 138, NULL, 'TA', '2026.1', '2026-06-30 17:33:22.668248')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:33:22.668856', NULL, NULL, NULL, NULL, 132, '2026-06-30 17:33:22.668856')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:33:22.669781', 'Avalie o professor', 93, 1, 'Texto', '2026-06-30 17:33:22.669781')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.4ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:33:22.670897', 72, 'Resposta', 1, NULL, '2026-06-30 17:33:22.670897')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma::HABTM_Docentes Create (0.3ms)  INSERT INTO `docentes_turmas` (`docente_id`, `turma_id`) VALUES (365, 132)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Curso Load (0.2ms)  SELECT `cursos`.* FROM `cursos` WHERE `cursos`.`nome` = 'Ciência da Computação' AND `cursos`.`codigo` = 'CIC' AND `cursos`.`departamento_id` = 287 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Curso Exists? (0.3ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`codigo` = 'CIC' LIMIT 1
+Curso Create (0.2ms)  INSERT INTO `cursos` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:33:22.673321', 287, 'Ciência da Computação', '2026-06-30 17:33:22.673321')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'disc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'aluno@unb.br' LIMIT 1
+Discente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:22.861729', 33, NULL, NULL, NULL, 'aluno@unb.br', NULL, 'disc001', 'Aluno Teste', NULL, NULL, '$2a$12$zYS9rTD8.Sk1j78EcbgO.u5uibB2iBCrY9.vmzGeCy7xWX20qFeTu', 'Discente', '2026-06-30 17:33:22.861729')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma::HABTM_Discentes Create (0.4ms)  INSERT INTO `discentes_turmas` (`discente_id`, `turma_id`) VALUES (366, 132)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:33:22 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "aluno@unb.br", "senha" => "Senha123"}
+Usuario Load (0.4ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'aluno@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/366/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.4ms (1 query, 0 cached) | GC: 0.3ms) Started GET “/usuarios/366/formularios/93/responder” for 127.0.0.1 at 2026-06-30 14:33:23 -0300 Processing by UsuariosController#responder_formulario as HTML

+ +
Parameters: {"usuario_id" => "366", "formulario_id" => "93"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 366 LIMIT 1
+CACHE Usuario Load (0.0ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 366 LIMIT 1
+Formulario Load (0.2ms)  SELECT `formularios`.* FROM `formularios` WHERE `formularios`.`id` = 93 LIMIT 1
+ElementoForm Load (0.2ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`formulario_id` = 93
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` = 72
+RespostaForm Exists? (0.2ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`formulario_id` = 93 AND `resposta_forms`.`usuario_id` = 366 LIMIT 1
+Rendering layout layouts/application.html.erb
+Rendering usuarios/responder_formulario.html.erb within layouts/application
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`id` = 132 LIMIT 1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`id` = 138 LIMIT 1
+ElementoForm Load (0.2ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`formulario_id` = 93 ORDER BY `elemento_forms`.`ordem` ASC
+Rendered usuarios/responder_formulario.html.erb within layouts/application (Duration: 2.5ms | GC: 0.2ms)
+Rendered layout layouts/application.html.erb (Duration: 2.7ms | GC: 0.2ms)
+ +

Completed 200 OK in 6ms (Views: 2.3ms | ActiveRecord: 1.8ms (9 queries, 1 cached) | GC: 0.2ms)

+ +
TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:33:23.062698', 'Ciência da Computação', '2026-06-30 17:33:23.062698')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:23.251161', NULL, NULL, NULL, 288, 'admin@unb.br', NULL, 'adm001', 'Admin Teste', NULL, NULL, '$2a$12$kD9n8zSga5eotiVOuwOj0Oy2SJlFi8ftw1f3JjKYDHLuk1xtzF0MS', 'Administrador', '2026-06-30 17:33:23.251161')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Docente Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:23.440261', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Prof Teste', NULL, NULL, '$2a$12$DUx8MktQDel1tmGPUc2JGugptUG/04ioE9ETjOnk7FEIzYtuiSw3O', 'Docente', '2026-06-30 17:33:23.440261')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.3ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Software' AND `disciplinas`.`codigo` = 'SW1' AND `disciplinas`.`departamento_id` = 288 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.3ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'SW1' LIMIT 1
+Disciplina Create (0.3ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('SW1', '2026-06-30 17:33:23.442160', 288, 'Software', '2026-06-30 17:33:23.442160')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 139 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 139 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:33:23.443790', 139, NULL, 'TA', '2026.1', '2026-06-30 17:33:23.443790')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:33:23.444393', NULL, NULL, NULL, NULL, 133, '2026-06-30 17:33:23.444393')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:33:23.445256', 'Avalie o professor', 94, 1, 'Texto', '2026-06-30 17:33:23.445256')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.4ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:33:23.446096', 73, 'Resposta', 1, NULL, '2026-06-30 17:33:23.446096')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma::HABTM_Docentes Create (0.3ms)  INSERT INTO `docentes_turmas` (`docente_id`, `turma_id`) VALUES (368, 133)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Curso Load (0.2ms)  SELECT `cursos`.* FROM `cursos` WHERE `cursos`.`nome` = 'Ciência da Computação' AND `cursos`.`codigo` = 'CIC' AND `cursos`.`departamento_id` = 288 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Curso Exists? (0.3ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`codigo` = 'CIC' LIMIT 1
+Curso Create (0.2ms)  INSERT INTO `cursos` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:33:23.448496', 288, 'Ciência da Computação', '2026-06-30 17:33:23.448496')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'disc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'aluno@unb.br' LIMIT 1
+Discente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:23.636823', 34, NULL, NULL, NULL, 'aluno@unb.br', NULL, 'disc001', 'Aluno Teste', NULL, NULL, '$2a$12$S4A92MqPOFYhnv9tKz7wwOPuKEcNTbWJLq.m4xf.usdH2oPrOJC4a', 'Discente', '2026-06-30 17:33:23.636823')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma::HABTM_Discentes Create (0.4ms)  INSERT INTO `discentes_turmas` (`discente_id`, `turma_id`) VALUES (369, 133)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:33:23 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "aluno@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'aluno@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/369/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+RespostaForm Exists? (0.6ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 369 AND `resposta_forms`.`formulario_id` = 94 LIMIT 1
+RespostaForm Create (0.4ms)  INSERT INTO `resposta_forms` (`created_at`, `data_submissao`, `formulario_id`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:33:23.829972', '2026-06-30', 94, '2026-06-30 17:33:23.829972', 369)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started GET “/usuarios/369/formularios/94/responder” for 127.0.0.1 at 2026-06-30 14:33:23 -0300 Processing by UsuariosController#responder_formulario as HTML

+ +
Parameters: {"usuario_id" => "369", "formulario_id" => "94"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 369 LIMIT 1
+CACHE Usuario Load (0.0ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 369 LIMIT 1
+Formulario Load (0.2ms)  SELECT `formularios`.* FROM `formularios` WHERE `formularios`.`id` = 94 LIMIT 1
+ElementoForm Load (0.2ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`formulario_id` = 94
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` = 73
+RespostaForm Exists? (0.2ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`formulario_id` = 94 AND `resposta_forms`.`usuario_id` = 369 LIMIT 1
+ +

Redirected to www.example.com/usuarios/369/avaliacoes Completed 302 Found in 3ms (ActiveRecord: 1.2ms (6 queries, 1 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.9ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:33:23.837186', 'Ciência da Computação', '2026-06-30 17:33:23.837186')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:24.026871', NULL, NULL, NULL, 289, 'admin@unb.br', NULL, 'adm001', 'Admin Teste', NULL, NULL, '$2a$12$RG9HSvvY55ryQgHKXe4pxeJ1k4TtjuoLSXx4zwPh8unpRZ4uT..9q', 'Administrador', '2026-06-30 17:33:24.026871')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.4ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:24.217150', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Prof Teste', NULL, NULL, '$2a$12$YMxY8V/Ql2T8fIPWv7Svd.00mDi8/q.34V5RK6uR0.YRMYCKUHAP6', 'Docente', '2026-06-30 17:33:24.217150')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.3ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Software' AND `disciplinas`.`codigo` = 'SW1' AND `disciplinas`.`departamento_id` = 289 LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.4ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'SW1' LIMIT 1
+Disciplina Create (0.3ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('SW1', '2026-06-30 17:33:24.219666', 289, 'Software', '2026-06-30 17:33:24.219666')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 140 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 140 LIMIT 1
+Turma Create (0.3ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:33:24.221402', 140, NULL, 'TA', '2026.1', '2026-06-30 17:33:24.221402')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:33:24.222082', NULL, NULL, NULL, NULL, 134, '2026-06-30 17:33:24.222082')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.5ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:33:24.223115', 'Avalie o professor', 95, 1, 'Texto', '2026-06-30 17:33:24.223115')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.4ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:33:24.224136', 74, 'Resposta', 1, NULL, '2026-06-30 17:33:24.224136')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma::HABTM_Docentes Create (0.3ms)  INSERT INTO `docentes_turmas` (`docente_id`, `turma_id`) VALUES (371, 134)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Curso Load (0.2ms)  SELECT `cursos`.* FROM `cursos` WHERE `cursos`.`nome` = 'Ciência da Computação' AND `cursos`.`codigo` = 'CIC' AND `cursos`.`departamento_id` = 289 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Curso Exists? (0.3ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`codigo` = 'CIC' LIMIT 1
+Curso Create (0.2ms)  INSERT INTO `cursos` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:33:24.226733', 289, 'Ciência da Computação', '2026-06-30 17:33:24.226733')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'disc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'aluno@unb.br' LIMIT 1
+Discente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:24.416298', 35, NULL, NULL, NULL, 'aluno@unb.br', NULL, 'disc001', 'Aluno Teste', NULL, NULL, '$2a$12$v9D8X19mZFN3jl55nzYhMOTjy07jAEDknXF.46xYXBZydoBuup7Dq', 'Discente', '2026-06-30 17:33:24.416298')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma::HABTM_Discentes Create (0.4ms)  INSERT INTO `discentes_turmas` (`discente_id`, `turma_id`) VALUES (372, 134)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:33:24 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "aluno@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'aluno@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/372/avaliacoes Completed 302 Found in 189ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
RespostaElem Count (0.3ms)  SELECT COUNT(*) FROM `resposta_elems`
+RespostaForm Count (0.2ms)  SELECT COUNT(*) FROM `resposta_forms`
+ +

Started POST “/usuarios/372/formularios/95/responder” for 127.0.0.1 at 2026-06-30 14:33:24 -0300 Processing by UsuariosController#submeter_resposta as HTML

+ +
Parameters: {"respostas" => {"74" => "O professor foi ótimo"}, "usuario_id" => "372", "formulario_id" => "95"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 372 LIMIT 1
+CACHE Usuario Load (0.0ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 372 LIMIT 1
+Formulario Load (0.2ms)  SELECT `formularios`.* FROM `formularios` WHERE `formularios`.`id` = 95 LIMIT 1
+ElementoForm Load (0.3ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`formulario_id` = 95
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` = 74
+RespostaForm Exists? (0.2ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`formulario_id` = 95 AND `resposta_forms`.`usuario_id` = 372 LIMIT 1
+ElementoForm Load (0.3ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`formulario_id` = 95 ORDER BY `elemento_forms`.`ordem` ASC
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+RespostaForm Exists? (0.4ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 372 AND `resposta_forms`.`formulario_id` = 95 LIMIT 1
+RespostaForm Create (0.3ms)  INSERT INTO `resposta_forms` (`created_at`, `data_submissao`, `formulario_id`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:33:24.614450', '2026-06-30', 95, '2026-06-30 17:33:24.614450', 372)
+ElementoForm Load (0.2ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`formulario_id` = 95 ORDER BY `elemento_forms`.`ordem` ASC
+RespostaElem Create (0.3ms)  INSERT INTO `resposta_elems` (`campo_form_id`, `created_at`, `elemento_form_id`, `resposta_form_id`, `texto_resposta`, `updated_at`) VALUES (NULL, '2026-06-30 17:33:24.615665', 74, 36, 'O professor foi ótimo', '2026-06-30 17:33:24.615665')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Redirected to www.example.com/usuarios/372/avaliacoes Completed 302 Found in 6ms (ActiveRecord: 3.0ms (11 queries, 1 cached) | GC: 0.1ms)

+ +
RespostaForm Count (0.2ms)  SELECT COUNT(*) FROM `resposta_forms`
+RespostaElem Count (0.2ms)  SELECT COUNT(*) FROM `resposta_elems`
+TRANSACTION (0.7ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:33:24.619719', 'Ciência da Computação', '2026-06-30 17:33:24.619719')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:24.809009', NULL, NULL, NULL, 290, 'admin@unb.br', NULL, 'adm001', 'Admin Teste', NULL, NULL, '$2a$12$hpuqV7sMz8AVlk461AkpAeeFUdX3CZEclKwxw78TPOxaIZSvllG7m', 'Administrador', '2026-06-30 17:33:24.809009')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.5ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Docente Create (0.6ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:24.999393', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Prof Teste', NULL, NULL, '$2a$12$ABtlLjgY5eTJkvorN0L8J.IeOn2q5CzvjMHfdC8Dot2vS85nI1YjS', 'Docente', '2026-06-30 17:33:24.999393')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.4ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Software' AND `disciplinas`.`codigo` = 'SW1' AND `disciplinas`.`departamento_id` = 290 LIMIT 1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.4ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'SW1' LIMIT 1
+Disciplina Create (0.3ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('SW1', '2026-06-30 17:33:25.002116', 290, 'Software', '2026-06-30 17:33:25.002116')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 141 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 141 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:33:25.003853', 141, NULL, 'TA', '2026.1', '2026-06-30 17:33:25.003853')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:33:25.004525', NULL, NULL, NULL, NULL, 135, '2026-06-30 17:33:25.004525')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:33:25.005480', 'Avalie o professor', 96, 1, 'Texto', '2026-06-30 17:33:25.005480')
+TRANSACTION (0.2ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+CampoForm Create (0.4ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:33:25.006461', 75, 'Resposta', 1, NULL, '2026-06-30 17:33:25.006461')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma::HABTM_Docentes Create (0.3ms)  INSERT INTO `docentes_turmas` (`docente_id`, `turma_id`) VALUES (374, 135)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Curso Load (0.2ms)  SELECT `cursos`.* FROM `cursos` WHERE `cursos`.`nome` = 'Ciência da Computação' AND `cursos`.`codigo` = 'CIC' AND `cursos`.`departamento_id` = 290 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Curso Exists? (0.3ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`codigo` = 'CIC' LIMIT 1
+Curso Create (0.2ms)  INSERT INTO `cursos` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:33:25.009109', 290, 'Ciência da Computação', '2026-06-30 17:33:25.009109')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'disc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'aluno@unb.br' LIMIT 1
+Discente Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:25.197601', 36, NULL, NULL, NULL, 'aluno@unb.br', NULL, 'disc001', 'Aluno Teste', NULL, NULL, '$2a$12$KGs6gJBALkaaafPdcvLNQusY3Q3R3X/IqkeeBEPiHuq1a7i84aaTi', 'Discente', '2026-06-30 17:33:25.197601')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma::HABTM_Discentes Create (0.3ms)  INSERT INTO `discentes_turmas` (`discente_id`, `turma_id`) VALUES (375, 135)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:33:25 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "aluno@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'aluno@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/375/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
RespostaForm Count (0.2ms)  SELECT COUNT(*) FROM `resposta_forms`
+ +

Started POST “/usuarios/375/formularios/96/responder” for 127.0.0.1 at 2026-06-30 14:33:25 -0300 Processing by UsuariosController#submeter_resposta as HTML

+ +
Parameters: {"respostas" => {"75" => ""}, "usuario_id" => "375", "formulario_id" => "96"}
+Usuario Load (0.2ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 375 LIMIT 1
+CACHE Usuario Load (0.0ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 375 LIMIT 1
+Formulario Load (0.2ms)  SELECT `formularios`.* FROM `formularios` WHERE `formularios`.`id` = 96 LIMIT 1
+ElementoForm Load (0.2ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`formulario_id` = 96
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` = 75
+RespostaForm Exists? (0.2ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`formulario_id` = 96 AND `resposta_forms`.`usuario_id` = 375 LIMIT 1
+ElementoForm Load (0.2ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`formulario_id` = 96 ORDER BY `elemento_forms`.`ordem` ASC
+Rendering layout layouts/application.html.erb
+Rendering usuarios/responder_formulario.html.erb within layouts/application
+Turma Load (0.2ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`id` = 135 LIMIT 1
+Disciplina Load (0.2ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`id` = 141 LIMIT 1
+CACHE ElementoForm Load (0.0ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`formulario_id` = 96 ORDER BY `elemento_forms`.`ordem` ASC
+Rendered usuarios/responder_formulario.html.erb within layouts/application (Duration: 1.5ms | GC: 0.0ms)
+Rendered layout layouts/application.html.erb (Duration: 1.8ms | GC: 0.0ms)
+ +

Completed 422 Unprocessable Content in 5ms (Views: 1.7ms | ActiveRecord: 1.7ms (10 queries, 2 cached) | GC: 0.1ms)

+ +
RespostaForm Count (0.2ms)  SELECT COUNT(*) FROM `resposta_forms`
+TRANSACTION (0.8ms)  ROLLBACK
+TRANSACTION (0.1ms)  BEGIN
+Departamento Load (0.2ms)  SELECT `departamentos`.* FROM `departamentos` WHERE `departamentos`.`nome` = 'Ciência da Computação' AND `departamentos`.`codigo` = 'CIC' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Departamento Exists? (0.3ms)  SELECT 1 AS one FROM `departamentos` WHERE `departamentos`.`codigo` = 'CIC' LIMIT 1
+Departamento Create (0.2ms)  INSERT INTO `departamentos` (`codigo`, `created_at`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:33:25.397543', 'Ciência da Computação', '2026-06-30 17:33:25.397543')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'adm001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'admin@unb.br' LIMIT 1
+Administrador Create (0.3ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:25.586212', NULL, NULL, NULL, 291, 'admin@unb.br', NULL, 'adm001', 'Admin Teste', NULL, NULL, '$2a$12$jvees2tu9Leb3uP.3e7MX./yMx1YBROW1PG8Qd0iMofl1PgGRtrOO', 'Administrador', '2026-06-30 17:33:25.586212')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'doc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'prof@unb.br' LIMIT 1
+Docente Create (0.4ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:25.775165', NULL, NULL, NULL, NULL, 'prof@unb.br', 'Doutorado', 'doc001', 'Prof Teste', NULL, NULL, '$2a$12$Nrjd8cvMDBxwTZJuo6RgM.gXtPD0FabS.m3hUB.7pvGpZYVK936Lm', 'Docente', '2026-06-30 17:33:25.775165')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Disciplina Load (0.3ms)  SELECT `disciplinas`.* FROM `disciplinas` WHERE `disciplinas`.`nome` = 'Software' AND `disciplinas`.`codigo` = 'SW1' AND `disciplinas`.`departamento_id` = 291 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Disciplina Exists? (0.4ms)  SELECT 1 AS one FROM `disciplinas` WHERE `disciplinas`.`codigo` = 'SW1' LIMIT 1
+Disciplina Create (0.3ms)  INSERT INTO `disciplinas` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('SW1', '2026-06-30 17:33:25.777493', 291, 'Software', '2026-06-30 17:33:25.777493')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Turma Load (0.3ms)  SELECT `turmas`.* FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`disciplina_id` = 142 AND `turmas`.`semestre` = '2026.1' LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma Exists? (0.4ms)  SELECT 1 AS one FROM `turmas` WHERE `turmas`.`numero_da_turma` = 'TA' AND `turmas`.`semestre` = '2026.1' AND `turmas`.`disciplina_id` = 142 LIMIT 1
+Turma Create (0.2ms)  INSERT INTO `turmas` (`created_at`, `disciplina_id`, `horario`, `numero_da_turma`, `semestre`, `updated_at`) VALUES ('2026-06-30 17:33:25.779202', 142, NULL, 'TA', '2026.1', '2026-06-30 17:33:25.779202')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Formulario Create (0.4ms)  INSERT INTO `formularios` (`created_at`, `data_fim`, `data_inicio`, `nome`, `titulo`, `turma_id`, `updated_at`) VALUES ('2026-06-30 17:33:25.779848', NULL, NULL, NULL, NULL, 136, '2026-06-30 17:33:25.779848')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+ElementoForm Create (0.4ms)  INSERT INTO `elemento_forms` (`created_at`, `enunciado`, `formulario_id`, `ordem`, `tipo`, `updated_at`) VALUES ('2026-06-30 17:33:25.780802', 'Avalie o professor', 97, 1, 'Texto', '2026-06-30 17:33:25.780802')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+CampoForm Create (0.4ms)  INSERT INTO `campo_forms` (`created_at`, `elemento_form_id`, `enunciado`, `ordem`, `tipo_elemento`, `updated_at`) VALUES ('2026-06-30 17:33:25.781664', 76, 'Resposta', 1, NULL, '2026-06-30 17:33:25.781664')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma::HABTM_Docentes Create (0.3ms)  INSERT INTO `docentes_turmas` (`docente_id`, `turma_id`) VALUES (377, 136)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+Curso Load (0.2ms)  SELECT `cursos`.* FROM `cursos` WHERE `cursos`.`nome` = 'Ciência da Computação' AND `cursos`.`codigo` = 'CIC' AND `cursos`.`departamento_id` = 291 LIMIT 1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Curso Exists? (0.3ms)  SELECT 1 AS one FROM `cursos` WHERE `cursos`.`codigo` = 'CIC' LIMIT 1
+Curso Create (0.2ms)  INSERT INTO `cursos` (`codigo`, `created_at`, `departamento_id`, `nome`, `updated_at`) VALUES ('CIC', '2026-06-30 17:33:25.784247', 291, 'Ciência da Computação', '2026-06-30 17:33:25.784247')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Usuario Exists? (0.3ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`matricula` = 'disc001' LIMIT 1
+Usuario Exists? (0.2ms)  SELECT 1 AS one FROM `usuarios` WHERE `usuarios`.`email` = 'aluno@unb.br' LIMIT 1
+Discente Create (0.5ms)  INSERT INTO `usuarios` (`created_at`, `curso_id`, `definicao_senha_sent_at`, `definicao_senha_token`, `departamento_id`, `email`, `formacao`, `matricula`, `nome`, `redefinicao_senha_sent_at`, `redefinicao_senha_token`, `senha_hash`, `type`, `updated_at`) VALUES ('2026-06-30 17:33:25.973065', 37, NULL, NULL, NULL, 'aluno@unb.br', NULL, 'disc001', 'Aluno Teste', NULL, NULL, '$2a$12$vexM0Z8YblDyOo.fqaurOuefhCaF/8qzjhWRlJ2EAIwrWs6JspT.W', 'Discente', '2026-06-30 17:33:25.973065')
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+TRANSACTION (0.1ms)  SAVEPOINT active_record_1
+Turma::HABTM_Discentes Create (0.4ms)  INSERT INTO `discentes_turmas` (`discente_id`, `turma_id`) VALUES (378, 136)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/login” for 127.0.0.1 at 2026-06-30 14:33:25 -0300 Processing by SessionsController#create as HTML

+ +
Parameters: {"login" => "aluno@unb.br", "senha" => "Senha123"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`email` = 'aluno@unb.br' LIMIT 1
+ +

Redirected to www.example.com/usuarios/378/avaliacoes Completed 302 Found in 188ms (ActiveRecord: 0.3ms (1 query, 0 cached) | GC: 0.0ms)

+ +
TRANSACTION (0.2ms)  SAVEPOINT active_record_1
+RespostaForm Exists? (0.6ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`usuario_id` = 378 AND `resposta_forms`.`formulario_id` = 97 LIMIT 1
+RespostaForm Create (0.3ms)  INSERT INTO `resposta_forms` (`created_at`, `data_submissao`, `formulario_id`, `updated_at`, `usuario_id`) VALUES ('2026-06-30 17:33:26.165242', '2026-06-30', 97, '2026-06-30 17:33:26.165242', 378)
+TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
+ +

Started POST “/usuarios/378/formularios/97/responder” for 127.0.0.1 at 2026-06-30 14:33:26 -0300 Processing by UsuariosController#submeter_resposta as HTML

+ +
Parameters: {"respostas" => {"76" => "O professor foi ótimo"}, "usuario_id" => "378", "formulario_id" => "97"}
+Usuario Load (0.3ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 378 LIMIT 1
+CACHE Usuario Load (0.0ms)  SELECT `usuarios`.* FROM `usuarios` WHERE `usuarios`.`id` = 378 LIMIT 1
+Formulario Load (0.2ms)  SELECT `formularios`.* FROM `formularios` WHERE `formularios`.`id` = 97 LIMIT 1
+ElementoForm Load (0.2ms)  SELECT `elemento_forms`.* FROM `elemento_forms` WHERE `elemento_forms`.`formulario_id` = 97
+CampoForm Load (0.2ms)  SELECT `campo_forms`.* FROM `campo_forms` WHERE `campo_forms`.`elemento_form_id` = 76
+RespostaForm Exists? (0.2ms)  SELECT 1 AS one FROM `resposta_forms` WHERE `resposta_forms`.`formulario_id` = 97 AND `resposta_forms`.`usuario_id` = 378 LIMIT 1
+ +

Redirected to www.example.com/usuarios/378/avaliacoes Completed 302 Found in 3ms (ActiveRecord: 1.2ms (6 queries, 1 cached) | GC: 0.0ms)

+ +
TRANSACTION (1.0ms)  ROLLBACK
+ +
+ + + + + + + + diff --git a/doc/public/400_html.html b/doc/public/400_html.html new file mode 100644 index 0000000000..7efb4113f3 --- /dev/null +++ b/doc/public/400_html.html @@ -0,0 +1,1764 @@ + + + + + + + +400.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!doctype html>

+ +

<html lang=“en”>

+ +
<head>
+
+  <title>The server cannot process the request due to a client error (400 Bad Request)</title>
+
+  <meta charset="utf-8">
+  <meta name="viewport" content="initial-scale=1, width=device-width">
+  <meta name="robots" content="noindex, nofollow">
+
+  <style>
+
+    *, *::before, *::after {
+      box-sizing: border-box;
+    }
+
+    * {
+      margin: 0;
+    }
+
+    html {
+      font-size: 16px;
+    }
+
+    body {
+      background: #FFF;
+      color: #261B23;
+      display: grid;
+      font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, Aptos, Roboto, "Segoe UI", "Helvetica Neue", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
+      font-size: clamp(1rem, 2.5vw, 2rem);
+      -webkit-font-smoothing: antialiased;
+      font-style: normal;
+      font-weight: 400;
+      letter-spacing: -0.0025em;
+      line-height: 1.4;
+      min-height: 100dvh;
+      place-items: center;
+      text-rendering: optimizeLegibility;
+      -webkit-text-size-adjust: 100%;
+    }
+
+    #error-description {
+      fill: #d30001;
+    }
+
+    #error-id {
+      fill: #f0eff0;
+    }
+
+    @media (prefers-color-scheme: dark) {
+      body {
+        background: #101010;
+        color: #e0e0e0;
+      }
+
+      #error-description {
+        fill: #FF6161;
+      }
+
+      #error-id {
+        fill: #2c2c2c;
+      }
+    }
+
+    a {
+      color: inherit;
+      font-weight: 700;
+      text-decoration: underline;
+      text-underline-offset: 0.0925em;
+    }
+
+    b, strong {
+      font-weight: 700;
+    }
+
+    i, em {
+      font-style: italic;
+    }
+
+    main {
+      display: grid;
+      gap: 1em;
+      padding: 2em;
+      place-items: center;
+      text-align: center;
+    }
+
+    main header {
+      width: min(100%, 12em);
+    }
+
+    main header svg {
+      height: auto;
+      max-width: 100%;
+      width: 100%;
+    }
+
+    main article {
+      width: min(100%, 30em);
+    }
+
+    main article p {
+      font-size: 75%;
+    }
+
+    main article br {
+      display: none;
+
+      @media(min-width: 48em) {
+        display: inline;
+      }
+    }
+
+  </style>
+
+</head>
+
+<body>
+
+  <!-- This file lives in public/400.html -->
+
+  <main>
+    <header>
+      <svg height="172" viewBox="0 0 480 172" width="480" xmlns="http://www.w3.org/2000/svg"><path d="m124.48 3.00509-45.6889 100.02991h26.2239v-28.1168h38.119v28.1168h21.628v35.145h-21.628v30.82h-37.308v-30.82h-72.1833v-31.901l50.2851-103.27391zm115.583 168.69891c-40.822 0-64.884-35.146-64.884-85.7015 0-50.5554 24.062-85.700907 64.884-85.700907 40.823 0 64.884 35.145507 64.884 85.700907 0 50.5555-24.061 85.7015-64.884 85.7015zm0-133.2831c-17.572 0-22.709 21.8984-22.709 47.5816 0 25.6835 5.137 47.5815 22.709 47.5815 17.303 0 22.71-21.898 22.71-47.5815 0-25.6832-5.407-47.5816-22.71-47.5816zm140.456 133.2831c-40.823 0-64.884-35.146-64.884-85.7015 0-50.5554 24.061-85.700907 64.884-85.700907 40.822 0 64.884 35.145507 64.884 85.700907 0 50.5555-24.062 85.7015-64.884 85.7015zm0-133.2831c-17.573 0-22.71 21.8984-22.71 47.5816 0 25.6835 5.137 47.5815 22.71 47.5815 17.302 0 22.709-21.898 22.709-47.5815 0-25.6832-5.407-47.5816-22.709-47.5816z" id="error-id"/><path d="m123.606 85.4445c3.212 1.0523 5.538 4.2089 5.538 8.0301 0 6.1472-4.209 9.5254-11.298 9.5254h-15.617v-34.0033h14.565c7.089 0 11.353 3.1566 11.353 9.2484 0 3.6551-2.049 6.3134-4.541 7.1994zm-12.904-2.9905h5.095c2.603 0 3.988-.9968 3.988-3.1013 0-2.1044-1.385-3.0459-3.988-3.0459h-5.095zm0 6.6456v6.5902h5.981c2.492 0 3.877-1.3291 3.877-3.2674 0-2.049-1.385-3.3228-3.877-3.3228zm43.786 13.9004h-8.362v-1.274c-.831.831-3.323 1.717-5.981 1.717-4.929 0-9.083-2.769-9.083-8.0301 0-4.818 4.154-7.9193 9.581-7.9193 2.049 0 4.486.6646 5.483 1.3845v-1.606c0-1.606-.942-2.9905-3.046-2.9905-1.606 0-2.548.7199-2.935 1.8275h-8.197c.72-4.8181 4.985-8.6393 11.409-8.6393 7.088 0 11.131 3.7659 11.131 10.2453zm-8.362-6.9779v-1.4399c-.554-1.0522-2.049-1.7167-3.655-1.7167-1.717 0-3.434.7199-3.434 2.3813 0 1.7168 1.717 2.4367 3.434 2.4367 1.606 0 3.101-.6645 3.655-1.6614zm27.996 6.9779v-1.994c-1.163 1.329-3.599 2.548-6.147 2.548-7.199 0-11.131-5.8151-11.131-13.0145s3.932-13.0143 11.131-13.0143c2.548 0 4.984 1.2184 6.147 2.5475v-13.0697h8.695v35.997zm0-9.1931v-6.5902c-.664-1.3291-2.159-2.326-3.821-2.326-2.99 0-4.763 2.4368-4.763 5.6488s1.773 5.5934 4.763 5.5934c1.717 0 3.157-.9415 3.821-2.326zm35.471-2.049h-3.101v11.2421h-8.806v-34.0033h15.285c7.31 0 12.35 4.1535 12.35 11.5744 0 5.1503-2.603 8.6947-6.757 10.2453l7.975 12.1836h-9.858zm-3.101-15.2849v8.1962h5.538c3.156 0 4.596-1.606 4.596-4.0981s-1.44-4.0981-4.596-4.0981zm36.957 17.8323h8.03c-.886 5.7597-5.206 9.2487-11.685 9.2487-7.643 0-12.682-5.2613-12.682-13.0145 0-7.6978 5.316-13.0143 12.515-13.0143 7.643 0 11.962 5.095 11.962 12.5159v2.1598h-16.115c.277 2.9905 1.827 4.5965 4.32 4.5965 1.772 0 3.156-.7753 3.655-2.4921zm-3.822-10.0237c-2.049 0-3.433 1.2737-3.987 3.5997h7.532c-.111-2.0491-1.385-3.5997-3.545-3.5997zm30.98 27.5234v-10.799c-1.163 1.329-3.6 2.548-6.147 2.548-7.2 0-11.132-5.9259-11.132-13.0145 0-7.144 3.932-13.0143 11.132-13.0143 2.547 0 4.984 1.2184 6.147 2.5475v-1.9937h8.695v33.726zm0-17.9981v-6.5902c-.665-1.3291-2.105-2.326-3.821-2.326-2.991 0-4.763 2.4368-4.763 5.6488s1.772 5.5934 4.763 5.5934c1.661 0 3.156-.9415 3.821-2.326zm36.789-15.7279v24.921h-8.695v-2.16c-1.329 1.551-3.821 2.714-6.646 2.714-5.482 0-8.75-3.5999-8.75-9.1379v-16.3371h8.64v14.288c0 2.1045.996 3.5997 3.212 3.5997 1.606 0 3.101-1.0522 3.544-2.769v-15.1187zm19.084 16.2263h8.03c-.886 5.7597-5.206 9.2487-11.685 9.2487-7.643 0-12.682-5.2613-12.682-13.0145 0-7.6978 5.316-13.0143 12.515-13.0143 7.643 0 11.963 5.095 11.963 12.5159v2.1598h-16.116c.277 2.9905 1.828 4.5965 4.32 4.5965 1.772 0 3.156-.7753 3.655-2.4921zm-3.822-10.0237c-2.049 0-3.433 1.2737-3.987 3.5997h7.532c-.111-2.0491-1.385-3.5997-3.545-3.5997zm13.428 11.0206h8.474c.387 1.3845 1.606 2.1598 3.156 2.1598 1.44 0 2.548-.5538 2.548-1.7168 0-.9414-.72-1.2737-1.939-1.5506l-4.873-.9969c-4.154-.886-6.867-2.8797-6.867-7.2547 0-5.3165 4.762-8.4178 10.633-8.4178 6.812 0 10.522 3.1567 11.297 8.0855h-8.03c-.277-1.0522-1.052-1.9937-3.046-1.9937-1.273 0-2.326.5538-2.326 1.6614 0 .7753.554 1.163 1.717 1.3845l4.929 1.163c4.541 1.0522 6.978 3.4335 6.978 7.4763 0 5.3168-4.818 8.2518-10.91 8.2518-6.369 0-10.965-2.88-11.741-8.2518zm27.538-.8861v-9.5807h-3.655v-6.7564h3.655v-6.8671h8.584v6.8671h5.205v6.7564h-5.205v8.307c0 1.9383.941 2.769 2.658 2.769.941 0 1.993-.2216 2.769-.5538v7.3654c-.997.443-2.88.775-4.818.775-5.871 0-9.193-2.769-9.193-9.0819z" id="error-description"/></svg>
+    </header>
+    <article>
+      <p><strong>The server cannot process the request due to a client error.</strong> Please check the request and try again. If you're the application owner check the logs for more information.</p>
+    </article>
+  </main>
+
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/public/404_html.html b/doc/public/404_html.html new file mode 100644 index 0000000000..0953584c7a --- /dev/null +++ b/doc/public/404_html.html @@ -0,0 +1,1764 @@ + + + + + + + +404.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!doctype html>

+ +

<html lang=“en”>

+ +
<head>
+
+  <title>The page you were looking for doesn't exist (404 Not found)</title>
+
+  <meta charset="utf-8">
+  <meta name="viewport" content="initial-scale=1, width=device-width">
+  <meta name="robots" content="noindex, nofollow">
+
+  <style>
+
+    *, *::before, *::after {
+      box-sizing: border-box;
+    }
+
+    * {
+      margin: 0;
+    }
+
+    html {
+      font-size: 16px;
+    }
+
+    body {
+      background: #FFF;
+      color: #261B23;
+      display: grid;
+      font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, Aptos, Roboto, "Segoe UI", "Helvetica Neue", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
+      font-size: clamp(1rem, 2.5vw, 2rem);
+      -webkit-font-smoothing: antialiased;
+      font-style: normal;
+      font-weight: 400;
+      letter-spacing: -0.0025em;
+      line-height: 1.4;
+      min-height: 100dvh;
+      place-items: center;
+      text-rendering: optimizeLegibility;
+      -webkit-text-size-adjust: 100%;
+    }
+
+    #error-description {
+      fill: #d30001;
+    }
+
+    #error-id {
+      fill: #f0eff0;
+    }
+
+    @media (prefers-color-scheme: dark) {
+      body {
+        background: #101010;
+        color: #e0e0e0;
+      }
+
+      #error-description {
+        fill: #FF6161;
+      }
+
+      #error-id {
+        fill: #2c2c2c;
+      }
+    }
+
+    a {
+      color: inherit;
+      font-weight: 700;
+      text-decoration: underline;
+      text-underline-offset: 0.0925em;
+    }
+
+    b, strong {
+      font-weight: 700;
+    }
+
+    i, em {
+      font-style: italic;
+    }
+
+    main {
+      display: grid;
+      gap: 1em;
+      padding: 2em;
+      place-items: center;
+      text-align: center;
+    }
+
+    main header {
+      width: min(100%, 12em);
+    }
+
+    main header svg {
+      height: auto;
+      max-width: 100%;
+      width: 100%;
+    }
+
+    main article {
+      width: min(100%, 30em);
+    }
+
+    main article p {
+      font-size: 75%;
+    }
+
+    main article br {
+      display: none;
+
+      @media(min-width: 48em) {
+        display: inline;
+      }
+    }
+
+  </style>
+
+</head>
+
+<body>
+
+  <!-- This file lives in public/404.html -->
+
+  <main>
+    <header>
+      <svg height="172" viewBox="0 0 480 172" width="480" xmlns="http://www.w3.org/2000/svg"><path d="m124.48 3.00509-45.6889 100.02991h26.2239v-28.1168h38.119v28.1168h21.628v35.145h-21.628v30.82h-37.308v-30.82h-72.1833v-31.901l50.2851-103.27391zm115.583 168.69891c-40.822 0-64.884-35.146-64.884-85.7015 0-50.5554 24.062-85.700907 64.884-85.700907 40.823 0 64.884 35.145507 64.884 85.700907 0 50.5555-24.061 85.7015-64.884 85.7015zm0-133.2831c-17.572 0-22.709 21.8984-22.709 47.5816 0 25.6835 5.137 47.5815 22.709 47.5815 17.303 0 22.71-21.898 22.71-47.5815 0-25.6832-5.407-47.5816-22.71-47.5816zm165.328-35.41581-45.689 100.02991h26.224v-28.1168h38.119v28.1168h21.628v35.145h-21.628v30.82h-37.308v-30.82h-72.184v-31.901l50.285-103.27391z" id="error-id"/><path d="m157.758 68.9967v34.0033h-7.199l-14.233-19.8814v19.8814h-8.584v-34.0033h8.307l13.125 18.7184v-18.7184zm28.454 21.5428c0 7.6978-5.15 13.0145-12.737 13.0145-7.532 0-12.738-5.3167-12.738-13.0145s5.206-13.0143 12.738-13.0143c7.587 0 12.737 5.3165 12.737 13.0143zm-8.528 0c0-3.4336-1.496-5.8703-4.209-5.8703-2.659 0-4.154 2.4367-4.154 5.8703s1.495 5.8149 4.154 5.8149c2.713 0 4.209-2.3813 4.209-5.8149zm13.184 3.8766v-9.5807h-3.655v-6.7564h3.655v-6.8671h8.584v6.8671h5.205v6.7564h-5.205v8.307c0 1.9383.941 2.769 2.658 2.769.941 0 1.994-.2216 2.769-.5538v7.3654c-.997.443-2.88.775-4.818.775-5.87 0-9.193-2.769-9.193-9.0819zm37.027 8.5839h-8.806v-34.0033h23.924v7.6978h-15.118v6.7564h13.9v7.5316h-13.9zm41.876-12.4605c0 7.6978-5.15 13.0145-12.737 13.0145-7.532 0-12.738-5.3167-12.738-13.0145s5.206-13.0143 12.738-13.0143c7.587 0 12.737 5.3165 12.737 13.0143zm-8.529 0c0-3.4336-1.495-5.8703-4.208-5.8703-2.659 0-4.154 2.4367-4.154 5.8703s1.495 5.8149 4.154 5.8149c2.713 0 4.208-2.3813 4.208-5.8149zm35.337-12.4605v24.921h-8.695v-2.16c-1.329 1.551-3.821 2.714-6.646 2.714-5.482 0-8.75-3.5999-8.75-9.1379v-16.3371h8.64v14.288c0 2.1045.997 3.5997 3.212 3.5997 1.606 0 3.101-1.0522 3.544-2.769v-15.1187zm4.076 24.921v-24.921h8.694v2.1598c1.385-1.5506 3.822-2.7136 6.701-2.7136 5.538 0 8.806 3.5997 8.806 9.1377v16.3371h-8.639v-14.2327c0-2.049-1.053-3.5443-3.268-3.5443-1.717 0-3.156.9969-3.6 2.7136v15.0634zm44.113 0v-1.994c-1.163 1.329-3.6 2.548-6.147 2.548-7.2 0-11.132-5.8151-11.132-13.0145s3.932-13.0143 11.132-13.0143c2.547 0 4.984 1.2184 6.147 2.5475v-13.0697h8.695v35.997zm0-9.1931v-6.5902c-.665-1.3291-2.16-2.326-3.821-2.326-2.991 0-4.763 2.4368-4.763 5.6488s1.772 5.5934 4.763 5.5934c1.717 0 3.156-.9415 3.821-2.326z" id="error-description"/></svg>
+    </header>
+    <article>
+      <p><strong>The page you were looking for doesn't exist.</strong> You may have mistyped the address or the page may have moved. If you're the application owner check the logs for more information.</p>
+    </article>
+  </main>
+
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/public/406-unsupported-browser_html.html b/doc/public/406-unsupported-browser_html.html new file mode 100644 index 0000000000..ccc3319efe --- /dev/null +++ b/doc/public/406-unsupported-browser_html.html @@ -0,0 +1,1764 @@ + + + + + + + +406-unsupported-browser.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!doctype html>

+ +

<html lang=“en”>

+ +
<head>
+
+  <title>Your browser is not supported (406 Not Acceptable)</title>
+
+  <meta charset="utf-8">
+  <meta name="viewport" content="initial-scale=1, width=device-width">
+  <meta name="robots" content="noindex, nofollow">
+
+  <style>
+
+    *, *::before, *::after {
+      box-sizing: border-box;
+    }
+
+    * {
+      margin: 0;
+    }
+
+    html {
+      font-size: 16px;
+    }
+
+    body {
+      background: #FFF;
+      color: #261B23;
+      display: grid;
+      font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, Aptos, Roboto, "Segoe UI", "Helvetica Neue", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
+      font-size: clamp(1rem, 2.5vw, 2rem);
+      -webkit-font-smoothing: antialiased;
+      font-style: normal;
+      font-weight: 400;
+      letter-spacing: -0.0025em;
+      line-height: 1.4;
+      min-height: 100dvh;
+      place-items: center;
+      text-rendering: optimizeLegibility;
+      -webkit-text-size-adjust: 100%;
+    }
+
+    #error-description {
+      fill: #d30001;
+    }
+
+    #error-id {
+      fill: #f0eff0;
+    }
+
+    @media (prefers-color-scheme: dark) {
+      body {
+        background: #101010;
+        color: #e0e0e0;
+      }
+
+      #error-description {
+        fill: #FF6161;
+      }
+
+      #error-id {
+        fill: #2c2c2c;
+      }
+    }
+
+    a {
+      color: inherit;
+      font-weight: 700;
+      text-decoration: underline;
+      text-underline-offset: 0.0925em;
+    }
+
+    b, strong {
+      font-weight: 700;
+    }
+
+    i, em {
+      font-style: italic;
+    }
+
+    main {
+      display: grid;
+      gap: 1em;
+      padding: 2em;
+      place-items: center;
+      text-align: center;
+    }
+
+    main header {
+      width: min(100%, 12em);
+    }
+
+    main header svg {
+      height: auto;
+      max-width: 100%;
+      width: 100%;
+    }
+
+    main article {
+      width: min(100%, 30em);
+    }
+
+    main article p {
+      font-size: 75%;
+    }
+
+    main article br {
+      display: none;
+
+      @media(min-width: 48em) {
+        display: inline;
+      }
+    }
+
+  </style>
+
+</head>
+
+<body>
+
+  <!-- This file lives in public/406-unsupported-browser.html -->
+
+  <main>
+    <header>
+      <svg height="172" viewBox="0 0 480 172" width="480" xmlns="http://www.w3.org/2000/svg"><path d="m124.48 3.00509-45.6889 100.02991h26.2239v-28.1168h38.119v28.1168h21.628v35.145h-21.628v30.82h-37.308v-30.82h-72.1833v-31.901l50.2851-103.27391zm115.583 168.69891c-40.822 0-64.884-35.146-64.884-85.7015 0-50.5554 24.062-85.700907 64.884-85.700907 40.823 0 64.884 35.145507 64.884 85.700907 0 50.5555-24.061 85.7015-64.884 85.7015zm0-133.2831c-17.572 0-22.709 21.8984-22.709 47.5816 0 25.6835 5.137 47.5815 22.709 47.5815 17.303 0 22.71-21.898 22.71-47.5815 0-25.6832-5.407-47.5816-22.71-47.5816zm202.906 9.7326h-41.093c-2.433-7.2994-7.84-12.4361-17.302-12.4361-16.221 0-25.413 17.5728-25.954 34.8752v1.3517c5.137-7.0291 16.221-12.4361 30.82-12.4361 33.524 0 54.881 24.0612 54.881 53.7998 0 33.253-23.791 58.396-61.64 58.396-21.628 0-39.741-10.003-50.825-27.576-9.733-14.599-13.788-32.442-13.788-54.3406 0-51.9072 24.331-89.485807 66.236-89.485807 32.712 0 53.258 18.654107 58.665 47.851907zm-82.727 66.2355c0 13.247 9.463 22.439 22.71 22.439 12.977 0 22.439-9.192 22.439-22.439 0-13.517-9.462-22.7091-22.439-22.7091-13.247 0-22.71 9.1921-22.71 22.7091z" id="error-id"/><path d="m100.761 68.9967v34.0033h-7.1991l-14.2326-19.8814v19.8814h-8.5839v-34.0033h8.307l13.125 18.7184v-18.7184zm28.454 21.5428c0 7.6978-5.15 13.0145-12.737 13.0145-7.532 0-12.738-5.3167-12.738-13.0145s5.206-13.0143 12.738-13.0143c7.587 0 12.737 5.3165 12.737 13.0143zm-8.529 0c0-3.4336-1.495-5.8703-4.208-5.8703-2.659 0-4.154 2.4367-4.154 5.8703s1.495 5.8149 4.154 5.8149c2.713 0 4.208-2.3813 4.208-5.8149zm13.185 3.8766v-9.5807h-3.655v-6.7564h3.655v-6.8671h8.584v6.8671h5.205v6.7564h-5.205v8.307c0 1.9383.941 2.769 2.658 2.769.941 0 1.994-.2216 2.769-.5538v7.3654c-.997.443-2.88.775-4.818.775-5.87 0-9.193-2.769-9.193-9.0819zm39.02-25.4194h9.083l12.958 34.0033h-9.027l-2.436-6.5902h-12.35l-2.381 6.5902h-8.806zm4.431 10.5222-3.489 9.5807h6.978zm17.44 11.0206c0-7.6978 5.095-13.0143 12.572-13.0143 6.701 0 10.854 3.9874 11.574 9.8023h-8.418c-.221-1.4953-1.384-2.6029-3.156-2.6029-2.437 0-3.988 2.2706-3.988 5.8149s1.551 5.7595 3.988 5.7595c1.772 0 2.935-1.0522 3.156-2.5475h8.418c-.72 5.7596-4.873 9.8025-11.574 9.8025-7.477 0-12.572-5.3167-12.572-13.0145zm25.676 0c0-7.6978 5.095-13.0143 12.572-13.0143 6.701 0 10.854 3.9874 11.574 9.8023h-8.418c-.221-1.4953-1.384-2.6029-3.156-2.6029-2.437 0-3.988 2.2706-3.988 5.8149s1.551 5.7595 3.988 5.7595c1.772 0 2.935-1.0522 3.156-2.5475h8.418c-.72 5.7596-4.873 9.8025-11.574 9.8025-7.477 0-12.572-5.3167-12.572-13.0145zm42.013 3.7658h8.031c-.887 5.7597-5.206 9.2487-11.686 9.2487-7.642 0-12.682-5.2613-12.682-13.0145 0-7.6978 5.317-13.0143 12.516-13.0143 7.643 0 11.962 5.095 11.962 12.5159v2.1598h-16.115c.277 2.9905 1.827 4.5965 4.319 4.5965 1.773 0 3.157-.7753 3.655-2.4921zm-3.821-10.0237c-2.049 0-3.433 1.2737-3.987 3.5997h7.532c-.111-2.0491-1.385-3.5997-3.545-3.5997zm23.4 16.7244v10.799h-8.694v-33.726h8.694v1.9937c1.163-1.3291 3.6-2.5475 6.148-2.5475 7.199 0 11.131 5.8703 11.131 13.0143 0 7.0886-3.932 13.0145-11.131 13.0145-2.548 0-4.985-1.219-6.148-2.548zm0-13.7893v6.5902c.665 1.3845 2.16 2.326 3.822 2.326 2.99 0 4.762-2.3814 4.762-5.5934s-1.772-5.6488-4.762-5.6488c-1.717 0-3.157.9969-3.822 2.326zm21.892 7.1994v-9.5807h-3.655v-6.7564h3.655v-6.8671h8.584v6.8671h5.206v6.7564h-5.206v8.307c0 1.9383.941 2.769 2.658 2.769.942 0 1.994-.2216 2.769-.5538v7.3654c-.997.443-2.88.775-4.818.775-5.87 0-9.193-2.769-9.193-9.0819zm39.458 8.5839h-8.363v-1.274c-.83.831-3.322 1.717-5.981 1.717-4.928 0-9.082-2.769-9.082-8.0301 0-4.818 4.154-7.9193 9.581-7.9193 2.049 0 4.486.6646 5.482 1.3845v-1.606c0-1.606-.941-2.9905-3.045-2.9905-1.606 0-2.548.7199-2.936 1.8275h-8.196c.72-4.8181 4.984-8.6393 11.408-8.6393 7.089 0 11.132 3.7659 11.132 10.2453zm-8.363-6.9779v-1.4399c-.553-1.0522-2.049-1.7167-3.655-1.7167-1.716 0-3.433.7199-3.433 2.3813 0 1.7168 1.717 2.4367 3.433 2.4367 1.606 0 3.102-.6645 3.655-1.6614zm20.742 4.9839v1.994h-8.694v-35.997h8.694v13.0697c1.163-1.3291 3.6-2.5475 6.148-2.5475 7.199 0 11.131 5.8149 11.131 13.0143s-3.932 13.0145-11.131 13.0145c-2.548 0-4.985-1.219-6.148-2.548zm0-13.7893v6.5902c.665 1.3845 2.105 2.326 3.822 2.326 2.99 0 4.762-2.3814 4.762-5.5934s-1.772-5.6488-4.762-5.6488c-1.662 0-3.157.9969-3.822 2.326zm28.759-20.2137v35.997h-8.695v-35.997zm19.172 27.3023h8.03c-.886 5.7597-5.206 9.2487-11.685 9.2487-7.643 0-12.682-5.2613-12.682-13.0145 0-7.6978 5.316-13.0143 12.516-13.0143 7.642 0 11.962 5.095 11.962 12.5159v2.1598h-16.116c.277 2.9905 1.828 4.5965 4.32 4.5965 1.772 0 3.157-.7753 3.655-2.4921zm-3.821-10.0237c-2.049 0-3.434 1.2737-3.988 3.5997h7.532c-.111-2.0491-1.384-3.5997-3.544-3.5997z" id="error-description"/></svg>
+    </header>
+    <article>
+      <p><strong>Your browser is not supported.</strong><br> Please upgrade your browser to continue.</p>
+    </article>
+  </main>
+
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/public/422_html.html b/doc/public/422_html.html new file mode 100644 index 0000000000..387db64101 --- /dev/null +++ b/doc/public/422_html.html @@ -0,0 +1,1764 @@ + + + + + + + +422.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!doctype html>

+ +

<html lang=“en”>

+ +
<head>
+
+  <title>The change you wanted was rejected (422 Unprocessable Entity)</title>
+
+  <meta charset="utf-8">
+  <meta name="viewport" content="initial-scale=1, width=device-width">
+  <meta name="robots" content="noindex, nofollow">
+
+  <style>
+
+    *, *::before, *::after {
+      box-sizing: border-box;
+    }
+
+    * {
+      margin: 0;
+    }
+
+    html {
+      font-size: 16px;
+    }
+
+    body {
+      background: #FFF;
+      color: #261B23;
+      display: grid;
+      font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, Aptos, Roboto, "Segoe UI", "Helvetica Neue", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
+      font-size: clamp(1rem, 2.5vw, 2rem);
+      -webkit-font-smoothing: antialiased;
+      font-style: normal;
+      font-weight: 400;
+      letter-spacing: -0.0025em;
+      line-height: 1.4;
+      min-height: 100dvh;
+      place-items: center;
+      text-rendering: optimizeLegibility;
+      -webkit-text-size-adjust: 100%;
+    }
+
+    #error-description {
+      fill: #d30001;
+    }
+
+    #error-id {
+      fill: #f0eff0;
+    }
+
+    @media (prefers-color-scheme: dark) {
+      body {
+        background: #101010;
+        color: #e0e0e0;
+      }
+
+      #error-description {
+        fill: #FF6161;
+      }
+
+      #error-id {
+        fill: #2c2c2c;
+      }
+    }
+
+    a {
+      color: inherit;
+      font-weight: 700;
+      text-decoration: underline;
+      text-underline-offset: 0.0925em;
+    }
+
+    b, strong {
+      font-weight: 700;
+    }
+
+    i, em {
+      font-style: italic;
+    }
+
+    main {
+      display: grid;
+      gap: 1em;
+      padding: 2em;
+      place-items: center;
+      text-align: center;
+    }
+
+    main header {
+      width: min(100%, 12em);
+    }
+
+    main header svg {
+      height: auto;
+      max-width: 100%;
+      width: 100%;
+    }
+
+    main article {
+      width: min(100%, 30em);
+    }
+
+    main article p {
+      font-size: 75%;
+    }
+
+    main article br {
+      display: none;
+
+      @media(min-width: 48em) {
+        display: inline;
+      }
+    }
+
+  </style>
+
+</head>
+
+<body>
+
+  <!-- This file lives in public/422.html -->
+
+  <main>
+    <header>
+      <svg height="172" viewBox="0 0 480 172" width="480" xmlns="http://www.w3.org/2000/svg"><path d="m124.48 3.00509-45.6889 100.02991h26.2239v-28.1168h38.119v28.1168h21.628v35.145h-21.628v30.82h-37.308v-30.82h-72.1833v-31.901l50.2851-103.27391zm130.453 51.63681c0-8.9215-6.218-15.4099-15.681-15.4099-10.273 0-15.95 7.5698-16.491 16.4913h-44.608c3.244-30.8199 25.683-55.421707 61.099-55.421707 36.498 0 59.477 20.816907 59.477 51.636807 0 21.3577-14.869 36.7676-31.901 52.7186l-27.305 27.035h59.747v37.308h-120.306v-27.846l57.044-56.7736c11.084-11.8954 18.925-20.0059 18.925-29.7385zm140.455 0c0-8.9215-6.218-15.4099-15.68-15.4099-10.274 0-15.951 7.5698-16.492 16.4913h-44.608c3.245-30.8199 25.684-55.421707 61.1-55.421707 36.497 0 59.477 20.816907 59.477 51.636807 0 21.3577-14.87 36.7676-31.902 52.7186l-27.305 27.035h59.747v37.308h-120.305v-27.846l57.043-56.7736c11.085-11.8954 18.925-20.0059 18.925-29.7385z" id="error-id"/><path d="m19.3936 103.554c-8.9715 0-14.84183-5.0952-14.84183-14.4544v-20.1029h8.86083v19.3276c0 4.8181 2.2706 7.3102 5.981 7.3102 3.6551 0 5.9257-2.4921 5.9257-7.3102v-19.3276h8.8608v20.1583c0 9.3038-5.8149 14.399-14.7865 14.399zm18.734-.554v-24.921h8.6947v2.1598c1.3845-1.5506 3.8212-2.7136 6.701-2.7136 5.538 0 8.8054 3.5997 8.8054 9.1377v16.3371h-8.6393v-14.2327c0-2.049-1.0522-3.5443-3.2674-3.5443-1.7168 0-3.1567.9969-3.5997 2.7136v15.0634zm36.8584-1.994v10.799h-8.6946v-33.726h8.6946v1.9937c1.163-1.3291 3.5997-2.5475 6.1472-2.5475 7.1994 0 11.1314 5.8703 11.1314 13.0143 0 7.0886-3.932 13.0145-11.1314 13.0145-2.5475 0-4.9842-1.219-6.1472-2.548zm0-13.7893v6.5902c.6646 1.3845 2.1599 2.326 3.8213 2.326 2.9905 0 4.7626-2.3814 4.7626-5.5934s-1.7721-5.6488-4.7626-5.6488c-1.7168 0-3.1567.9969-3.8213 2.326zm36.789-9.2485v8.3624c-1.052-.5538-2.215-.7753-3.6-.7753-2.381 0-3.987 1.0522-4.43 2.8244v14.6203h-8.6949v-24.921h8.6949v2.2152c1.218-1.6614 3.156-2.769 5.648-2.769 1.108 0 1.994.2215 2.382.443zm26.769 12.5713c0 7.6978-5.15 13.0145-12.737 13.0145-7.532 0-12.738-5.3167-12.738-13.0145s5.206-13.0143 12.738-13.0143c7.587 0 12.737 5.3165 12.737 13.0143zm-8.528 0c0-3.4336-1.496-5.8703-4.209-5.8703-2.659 0-4.154 2.4367-4.154 5.8703s1.495 5.8149 4.154 5.8149c2.713 0 4.209-2.3813 4.209-5.8149zm10.352 0c0-7.6978 5.095-13.0143 12.571-13.0143 6.701 0 10.855 3.9874 11.574 9.8023h-8.417c-.222-1.4953-1.385-2.6029-3.157-2.6029-2.437 0-3.987 2.2706-3.987 5.8149s1.55 5.7595 3.987 5.7595c1.772 0 2.935-1.0522 3.157-2.5475h8.417c-.719 5.7596-4.873 9.8025-11.574 9.8025-7.476 0-12.571-5.3167-12.571-13.0145zm42.013 3.7658h8.03c-.886 5.7597-5.206 9.2487-11.685 9.2487-7.643 0-12.682-5.2613-12.682-13.0145 0-7.6978 5.316-13.0143 12.516-13.0143 7.642 0 11.962 5.095 11.962 12.5159v2.1598h-16.116c.277 2.9905 1.828 4.5965 4.32 4.5965 1.772 0 3.156-.7753 3.655-2.4921zm-3.821-10.0237c-2.049 0-3.434 1.2737-3.988 3.5997h7.532c-.111-2.0491-1.385-3.5997-3.544-3.5997zm13.428 11.0206h8.473c.387 1.3845 1.606 2.1598 3.156 2.1598 1.44 0 2.548-.5538 2.548-1.7168 0-.9414-.72-1.2737-1.938-1.5506l-4.874-.9969c-4.153-.886-6.867-2.8797-6.867-7.2547 0-5.3165 4.763-8.4178 10.633-8.4178 6.812 0 10.522 3.1567 11.297 8.0855h-8.03c-.277-1.0522-1.052-1.9937-3.046-1.9937-1.273 0-2.326.5538-2.326 1.6614 0 .7753.554 1.163 1.717 1.3845l4.929 1.163c4.541 1.0522 6.978 3.4335 6.978 7.4763 0 5.3168-4.818 8.2518-10.91 8.2518-6.369 0-10.965-2.88-11.74-8.2518zm24.269 0h8.474c.387 1.3845 1.606 2.1598 3.156 2.1598 1.44 0 2.548-.5538 2.548-1.7168 0-.9414-.72-1.2737-1.939-1.5506l-4.873-.9969c-4.154-.886-6.867-2.8797-6.867-7.2547 0-5.3165 4.763-8.4178 10.633-8.4178 6.812 0 10.522 3.1567 11.297 8.0855h-8.03c-.277-1.0522-1.052-1.9937-3.046-1.9937-1.273 0-2.326.5538-2.326 1.6614 0 .7753.554 1.163 1.717 1.3845l4.929 1.163c4.541 1.0522 6.978 3.4335 6.978 7.4763 0 5.3168-4.818 8.2518-10.91 8.2518-6.369 0-10.965-2.88-11.741-8.2518zm47.918 7.6978h-8.363v-1.274c-.831.831-3.323 1.717-5.981 1.717-4.929 0-9.082-2.769-9.082-8.0301 0-4.818 4.153-7.9193 9.581-7.9193 2.049 0 4.485.6646 5.482 1.3845v-1.606c0-1.606-.941-2.9905-3.046-2.9905-1.606 0-2.547.7199-2.935 1.8275h-8.196c.72-4.8181 4.984-8.6393 11.408-8.6393 7.089 0 11.132 3.7659 11.132 10.2453zm-8.363-6.9779v-1.4399c-.554-1.0522-2.049-1.7167-3.655-1.7167-1.717 0-3.434.7199-3.434 2.3813 0 1.7168 1.717 2.4367 3.434 2.4367 1.606 0 3.101-.6645 3.655-1.6614zm20.742 4.9839v1.994h-8.695v-35.997h8.695v13.0697c1.163-1.3291 3.6-2.5475 6.147-2.5475 7.2 0 11.132 5.8149 11.132 13.0143s-3.932 13.0145-11.132 13.0145c-2.547 0-4.984-1.219-6.147-2.548zm0-13.7893v6.5902c.665 1.3845 2.105 2.326 3.821 2.326 2.991 0 4.763-2.3814 4.763-5.5934s-1.772-5.6488-4.763-5.6488c-1.661 0-3.156.9969-3.821 2.326zm28.759-20.2137v35.997h-8.695v-35.997zm19.172 27.3023h8.03c-.886 5.7597-5.206 9.2487-11.685 9.2487-7.643 0-12.682-5.2613-12.682-13.0145 0-7.6978 5.316-13.0143 12.515-13.0143 7.643 0 11.962 5.095 11.962 12.5159v2.1598h-16.115c.277 2.9905 1.827 4.5965 4.32 4.5965 1.772 0 3.156-.7753 3.655-2.4921zm-3.822-10.0237c-2.049 0-3.433 1.2737-3.987 3.5997h7.532c-.111-2.0491-1.385-3.5997-3.545-3.5997zm25.461-15.2849h24.311v7.6424h-15.561v5.3165h14.232v7.4763h-14.232v5.8703h15.561v7.6978h-24.311zm27.942 34.0033v-24.921h8.694v2.1598c1.385-1.5506 3.822-2.7136 6.701-2.7136 5.538 0 8.806 3.5997 8.806 9.1377v16.3371h-8.639v-14.2327c0-2.049-1.053-3.5443-3.268-3.5443-1.717 0-3.157.9969-3.6 2.7136v15.0634zm29.991-8.5839v-9.5807h-3.655v-6.7564h3.655v-6.8671h8.584v6.8671h5.206v6.7564h-5.206v8.307c0 1.9383.941 2.769 2.658 2.769.942 0 1.994-.2216 2.769-.5538v7.3654c-.997.443-2.88.775-4.818.775-5.87 0-9.193-2.769-9.193-9.0819zm26.161-16.3371v24.921h-8.694v-24.921zm.61-6.7564c0 2.8244-2.271 4.652-4.929 4.652s-4.929-1.8276-4.929-4.652c0-2.8797 2.271-4.7073 4.929-4.7073s4.929 1.8276 4.929 4.7073zm5.382 23.0935v-9.5807h-3.655v-6.7564h3.655v-6.8671h8.584v6.8671h5.206v6.7564h-5.206v8.307c0 1.9383.941 2.769 2.658 2.769.941 0 1.994-.2216 2.769-.5538v7.3654c-.997.443-2.88.775-4.818.775-5.87 0-9.193-2.769-9.193-9.0819zm29.22 17.3889h-8.584l3.655-9.414-9.303-24.312h9.026l4.763 14.1773 4.652-14.1773h8.639z" id="error-description"/></svg>
+    </header>
+    <article>
+      <p><strong>The change you wanted was rejected.</strong> Maybe you tried to change something you didn't have access to. If you're the application owner check the logs for more information.</p>
+    </article>
+  </main>
+
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/public/500_html.html b/doc/public/500_html.html new file mode 100644 index 0000000000..eaef4eed34 --- /dev/null +++ b/doc/public/500_html.html @@ -0,0 +1,1764 @@ + + + + + + + +500.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!doctype html>

+ +

<html lang=“en”>

+ +
<head>
+
+  <title>We're sorry, but something went wrong (500 Internal Server Error)</title>
+
+  <meta charset="utf-8">
+  <meta name="viewport" content="initial-scale=1, width=device-width">
+  <meta name="robots" content="noindex, nofollow">
+
+  <style>
+
+    *, *::before, *::after {
+      box-sizing: border-box;
+    }
+
+    * {
+      margin: 0;
+    }
+
+    html {
+      font-size: 16px;
+    }
+
+    body {
+      background: #FFF;
+      color: #261B23;
+      display: grid;
+      font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, Aptos, Roboto, "Segoe UI", "Helvetica Neue", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
+      font-size: clamp(1rem, 2.5vw, 2rem);
+      -webkit-font-smoothing: antialiased;
+      font-style: normal;
+      font-weight: 400;
+      letter-spacing: -0.0025em;
+      line-height: 1.4;
+      min-height: 100dvh;
+      place-items: center;
+      text-rendering: optimizeLegibility;
+      -webkit-text-size-adjust: 100%;
+    }
+
+    #error-description {
+      fill: #d30001;
+    }
+
+    #error-id {
+      fill: #f0eff0;
+    }
+
+    @media (prefers-color-scheme: dark) {
+      body {
+        background: #101010;
+        color: #e0e0e0;
+      }
+
+      #error-description {
+        fill: #FF6161;
+      }
+
+      #error-id {
+        fill: #2c2c2c;
+      }
+    }
+
+    a {
+      color: inherit;
+      font-weight: 700;
+      text-decoration: underline;
+      text-underline-offset: 0.0925em;
+    }
+
+    b, strong {
+      font-weight: 700;
+    }
+
+    i, em {
+      font-style: italic;
+    }
+
+    main {
+      display: grid;
+      gap: 1em;
+      padding: 2em;
+      place-items: center;
+      text-align: center;
+    }
+
+    main header {
+      width: min(100%, 12em);
+    }
+
+    main header svg {
+      height: auto;
+      max-width: 100%;
+      width: 100%;
+    }
+
+    main article {
+      width: min(100%, 30em);
+    }
+
+    main article p {
+      font-size: 75%;
+    }
+
+    main article br {
+      display: none;
+
+      @media(min-width: 48em) {
+        display: inline;
+      }
+    }
+
+  </style>
+
+</head>
+
+<body>
+
+  <!-- This file lives in public/500.html -->
+
+  <main>
+    <header>
+      <svg height="172" viewBox="0 0 480 172" width="480" xmlns="http://www.w3.org/2000/svg"><path d="m101.23 93.8427c-8.1103 0-15.4098 3.7849-19.7354 8.3813h-36.2269v-99.21891h103.8143v37.03791h-68.3984v24.8722c5.1366-2.7035 15.1396-5.9477 24.6014-5.9477 35.146 0 56.233 22.7094 56.233 55.4215 0 34.605-23.791 57.315-60.558 57.315-37.8492 0-61.64-22.169-63.8028-55.963h42.9857c1.0814 10.814 9.1919 19.195 21.6281 19.195 11.355 0 19.465-8.381 19.465-20.547 0-11.625-7.299-20.5463-20.006-20.5463zm138.833 77.8613c-40.822 0-64.884-35.146-64.884-85.7015 0-50.5554 24.062-85.700907 64.884-85.700907 40.823 0 64.884 35.145507 64.884 85.700907 0 50.5555-24.061 85.7015-64.884 85.7015zm0-133.2831c-17.572 0-22.709 21.8984-22.709 47.5816 0 25.6835 5.137 47.5815 22.709 47.5815 17.303 0 22.71-21.898 22.71-47.5815 0-25.6832-5.407-47.5816-22.71-47.5816zm140.456 133.2831c-40.823 0-64.884-35.146-64.884-85.7015 0-50.5554 24.061-85.700907 64.884-85.700907 40.822 0 64.884 35.145507 64.884 85.700907 0 50.5555-24.062 85.7015-64.884 85.7015zm0-133.2831c-17.573 0-22.71 21.8984-22.71 47.5816 0 25.6835 5.137 47.5815 22.71 47.5815 17.302 0 22.709-21.898 22.709-47.5815 0-25.6832-5.407-47.5816-22.709-47.5816z" id="error-id"/><path d="m23.1377 68.9967v34.0033h-8.9162v-34.0033zm4.3157 34.0033v-24.921h8.6947v2.1598c1.3845-1.5506 3.8212-2.7136 6.701-2.7136 5.538 0 8.8054 3.5997 8.8054 9.1377v16.3371h-8.6393v-14.2327c0-2.049-1.0522-3.5443-3.2674-3.5443-1.7168 0-3.1567.9969-3.5997 2.7136v15.0634zm29.9913-8.5839v-9.5807h-3.655v-6.7564h3.655v-6.8671h8.5839v6.8671h5.2058v6.7564h-5.2058v8.307c0 1.9383.9415 2.769 2.6583 2.769.9414 0 1.9937-.2216 2.769-.5538v7.3654c-.9969.443-2.8798.775-4.8181.775-5.8703 0-9.1931-2.769-9.1931-9.0819zm32.3666-.1108h8.0301c-.8861 5.7597-5.2057 9.2487-11.6852 9.2487-7.6424 0-12.682-5.2613-12.682-13.0145 0-7.6978 5.3165-13.0143 12.5159-13.0143 7.6424 0 11.9621 5.095 11.9621 12.5159v2.1598h-16.1156c.2769 2.9905 1.8275 4.5965 4.3196 4.5965 1.7722 0 3.1567-.7753 3.6551-2.4921zm-3.8212-10.0237c-2.0491 0-3.4336 1.2737-3.9874 3.5997h7.5317c-.1107-2.0491-1.3845-3.5997-3.5443-3.5997zm31.4299-6.3134v8.3624c-1.052-.5538-2.215-.7753-3.599-.7753-2.382 0-3.988 1.0522-4.431 2.8244v14.6203h-8.694v-24.921h8.694v2.2152c1.219-1.6614 3.157-2.769 5.649-2.769 1.108 0 1.994.2215 2.381.443zm2.949 25.0318v-24.921h8.694v2.1598c1.385-1.5506 3.821-2.7136 6.701-2.7136 5.538 0 8.806 3.5997 8.806 9.1377v16.3371h-8.64v-14.2327c0-2.049-1.052-3.5443-3.267-3.5443-1.717 0-3.157.9969-3.6 2.7136v15.0634zm50.371 0h-8.363v-1.274c-.83.831-3.323 1.717-5.981 1.717-4.929 0-9.082-2.769-9.082-8.0301 0-4.818 4.153-7.9193 9.581-7.9193 2.049 0 4.485.6646 5.482 1.3845v-1.606c0-1.606-.941-2.9905-3.046-2.9905-1.606 0-2.547.7199-2.935 1.8275h-8.196c.72-4.8181 4.984-8.6393 11.408-8.6393 7.089 0 11.132 3.7659 11.132 10.2453zm-8.363-6.9779v-1.4399c-.554-1.0522-2.049-1.7167-3.655-1.7167-1.717 0-3.433.7199-3.433 2.3813 0 1.7168 1.716 2.4367 3.433 2.4367 1.606 0 3.101-.6645 3.655-1.6614zm20.742-29.0191v35.997h-8.694v-35.997zm13.036 25.9178h9.248c.72 2.326 2.714 3.489 5.483 3.489 2.713 0 4.596-1.163 4.596-3.2674 0-1.6061-1.052-2.326-3.212-2.8244l-6.534-1.3845c-4.985-1.1076-8.751-3.7105-8.751-9.47 0-6.6456 5.538-11.0206 13.07-11.0206 8.307 0 13.014 4.5411 13.956 10.4114h-8.695c-.72-1.8829-2.27-3.3228-5.205-3.3228-2.548 0-4.265 1.1076-4.265 2.9905 0 1.4953 1.052 2.326 2.825 2.7137l6.645 1.5506c5.815 1.3845 9.027 4.5412 9.027 9.8023 0 6.9778-5.87 10.9654-13.291 10.9654-8.141 0-13.679-3.9322-14.897-10.6332zm46.509 1.3845h8.031c-.887 5.7597-5.206 9.2487-11.686 9.2487-7.642 0-12.682-5.2613-12.682-13.0145 0-7.6978 5.317-13.0143 12.516-13.0143 7.643 0 11.962 5.095 11.962 12.5159v2.1598h-16.115c.277 2.9905 1.827 4.5965 4.319 4.5965 1.773 0 3.157-.7753 3.655-2.4921zm-3.821-10.0237c-2.049 0-3.433 1.2737-3.987 3.5997h7.532c-.111-2.0491-1.385-3.5997-3.545-3.5997zm31.431-6.3134v8.3624c-1.053-.5538-2.216-.7753-3.6-.7753-2.381 0-3.988 1.0522-4.431 2.8244v14.6203h-8.694v-24.921h8.694v2.2152c1.219-1.6614 3.157-2.769 5.649-2.769 1.108 0 1.994.2215 2.382.443zm18.288 25.0318h-7.809l-9.47-24.921h8.861l4.763 14.288 4.652-14.288h8.528zm25.614-8.6947h8.03c-.886 5.7597-5.206 9.2487-11.685 9.2487-7.642 0-12.682-5.2613-12.682-13.0145 0-7.6978 5.316-13.0143 12.516-13.0143 7.642 0 11.962 5.095 11.962 12.5159v2.1598h-16.116c.277 2.9905 1.828 4.5965 4.32 4.5965 1.772 0 3.157-.7753 3.655-2.4921zm-3.821-10.0237c-2.049 0-3.434 1.2737-3.988 3.5997h7.532c-.111-2.0491-1.384-3.5997-3.544-3.5997zm31.43-6.3134v8.3624c-1.052-.5538-2.215-.7753-3.6-.7753-2.381 0-3.987 1.0522-4.43 2.8244v14.6203h-8.695v-24.921h8.695v2.2152c1.218-1.6614 3.157-2.769 5.649-2.769 1.107 0 1.993.2215 2.381.443zm13.703-8.9715h24.312v7.6424h-15.562v5.3165h14.232v7.4763h-14.232v5.8703h15.562v7.6978h-24.312zm44.667 8.9715v8.3624c-1.052-.5538-2.215-.7753-3.6-.7753-2.381 0-3.987 1.0522-4.43 2.8244v14.6203h-8.695v-24.921h8.695v2.2152c1.218-1.6614 3.156-2.769 5.648-2.769 1.108 0 1.994.2215 2.382.443zm19.673 0v8.3624c-1.053-.5538-2.216-.7753-3.6-.7753-2.381 0-3.987 1.0522-4.43 2.8244v14.6203h-8.695v-24.921h8.695v2.2152c1.218-1.6614 3.156-2.769 5.648-2.769 1.108 0 1.994.2215 2.382.443zm26.769 12.5713c0 7.6978-5.15 13.0145-12.737 13.0145-7.532 0-12.738-5.3167-12.738-13.0145s5.206-13.0143 12.738-13.0143c7.587 0 12.737 5.3165 12.737 13.0143zm-8.529 0c0-3.4336-1.495-5.8703-4.208-5.8703-2.659 0-4.154 2.4367-4.154 5.8703s1.495 5.8149 4.154 5.8149c2.713 0 4.208-2.3813 4.208-5.8149zm28.082-12.5713v8.3624c-1.052-.5538-2.215-.7753-3.6-.7753-2.381 0-3.987 1.0522-4.43 2.8244v14.6203h-8.695v-24.921h8.695v2.2152c1.218-1.6614 3.157-2.769 5.649-2.769 1.107 0 1.993.2215 2.381.443z" id="error-description"/></svg>
+    </header>
+    <article>
+      <p><strong>We're sorry, but something went wrong.</strong><br> If you're the application owner check the logs for more information.</p>
+    </article>
+  </main>
+
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/public/robots_txt.html b/doc/public/robots_txt.html new file mode 100644 index 0000000000..48952ddd65 --- /dev/null +++ b/doc/public/robots_txt.html @@ -0,0 +1,1630 @@ + + + + + + + +robots - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

# See www.robotstxt.org/robotstxt.html for documentation on how to use the robots.txt file

+ +
+ + + + + + + + diff --git a/doc/tmp/local_secret_txt.html b/doc/tmp/local_secret_txt.html new file mode 100644 index 0000000000..040ce3e874 --- /dev/null +++ b/doc/tmp/local_secret_txt.html @@ -0,0 +1,1914 @@ + + + + + + + +local_secret - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

1f3a5dc921e641cb55d165830beef88fd51e73dc102e3bb26266add594ce3ef6ff3a898200adbafd20a7ff5a8773f1786ec64d428a587d8516f733acee1da18e

+ +
+ + + + + + + + diff --git a/doc/tmp/restart_txt.html b/doc/tmp/restart_txt.html new file mode 100644 index 0000000000..c385a47a6b --- /dev/null +++ b/doc/tmp/restart_txt.html @@ -0,0 +1,1634 @@ + + + + + + + +restart - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/app/controllers/admin_controller_html.html b/doc/tmp/rubycritic/app/controllers/admin_controller_html.html new file mode 100644 index 0000000000..4c44dfc41d --- /dev/null +++ b/doc/tmp/rubycritic/app/controllers/admin_controller_html.html @@ -0,0 +1,1967 @@ + + + + + + + +admin_controller.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-06-29 19:51:36 -0300'>2026-06-29 19:51:36 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>app/controllers /</small> admin_controller.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating c big">
+            C
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">220</span><small> lines of codes</small></div>
+            <div><span class="metric">12</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">11.4</span><small> complexity/method</small></div>
+            <div><span class="metric">17</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">136.93</span><small> complexity</small></div>
+            <div><span class="metric">0</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              12
+              smells
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code"># Gerencia as funcionalidades exclusivas do administrador do sistema.
+ +

# # Agrupa as ações restritas ao perfil Administrador: visualização e exportação # de avaliações, envio de formulários a turmas a partir de templates, tela de # gerenciamento geral e sincronização de dados com o SIGAA (importação e # atualização via arquivos JSON). Utiliza o layout &quot;gerenciamento&quot; e valida # que o administrador autenticado acessa apenas as suas próprias páginas. class AdminController &lt; ApplicationController<ol class=“nocode errors smells”> <li> <div class=“description”> <div class=“heading”> <span> <i class=“fa fa-warning” aria-hidden=“true”></i> <a href=“github.com/troessner/reek/blob/master/docs/Instance-Variable-Assumption.md” target=“_blank”>InstanceVariableAssumption</a> </span> </div> <span>AdminController assumes too much for instance variable ‘@admin’</span> </div> </li> <li> <div class=“description”> <div class=“heading”> <span> <i class=“fa fa-warning” aria-hidden=“true”></i> <a href=“github.com/troessner/reek/blob/master/docs/Instance-Variable-Assumption.md” target=“_blank”>InstanceVariableAssumption</a> </span> </div> <span>AdminController assumes too much for instance variable ‘@formulario’</span> </div> </li> <li> <div class=“description”> <div class=“heading”> <span> <i class=“fa fa-warning” aria-hidden=“true”></i> <a href=“github.com/troessner/reek/blob/master/docs/Too-Many-Instance-Variables.md” target=“_blank”>TooManyInstanceVariables</a> </span> </div> <span>AdminController has at least 6 instance variables</span> </div> </li></ol>

+ +
layout &quot;gerenciamento&quot;
+
+before_action :require_login
+before_action :require_admin
+before_action :set_admin
+
+include AdminAutenticavel
+
+SINCRONIZACAO_HANDLERS = {
+  &quot;importar&quot; =&gt; -&gt;(cp, cm) { SigaaImporter.import_from_files(cp, cm) },
+  &quot;atualizar&quot; =&gt; -&gt;(cp, cm) { SigaaImporter.update_from_files(cp, cm) }
+}.freeze
+
+MENSAGENS_SINCRONIZACAO = {
+  &quot;importar&quot; =&gt; {
+    parcial: &quot;alguns dados já foram importados e não serão importados novamente, mas os dados restantes serão importados com sucesso&quot;,
+    sucesso: &quot;As turmas, matérias e participantes do SIGAA estão presentes no sistema.&quot;,
+    nome_acao: &quot;importação&quot;
+  },
+  &quot;atualizar&quot; =&gt; {
+    parcial: &quot;alguns dados já estão atualizados e não serão atualizados novamente, mas os dados restantes serão atualizados com sucesso&quot;,
+    sucesso: &quot;As turmas, matérias e participantes do SIGAA estão atualizados no sistema com os dados atuais do SIGAA.&quot;,
+    nome_acao: &quot;atualização&quot;
+  }
+}.freeze
+
+# Lista todos os formulários com suas turmas, disciplinas, departamentos e docentes.
+#
+# @return [void]
+def avaliacoes
+  @avaliacoes = Formulario
+    .joins(:turma)
+    .includes(turma: { disciplina: :departamento, docentes: [] })
+end
+
+# Exibe a página de gerenciamento do administrador.
+#
+# @return [void]
+def gerenciamento
+end
+
+# Exibe o formulário de envio de avaliações (GET) ou cria formulários a partir de um
+# template para as turmas selecionadas (POST).
+#
+# @return [void]
+# @note GET: popula +@templates+ e +@turmas+ para exibição do formulário de seleção.
+#   POST: delega a criação dos formulários para +processar_envio_formularios+.
+def enviar_formularios
+  if request.get?
+    @templates = Template.where(usuario_id: @admin.id)
+    @turmas = Turma.joins(:disciplina).includes(:disciplina).order(&quot;disciplinas.nome, turmas.semestre&quot;)
+  elsif request.post?
+    processar_envio_formularios
+  end
+end
+
+# Lista os formulários pertencentes às disciplinas do departamento do administrador.
+#
+# @return [void]
+def resultados
+  @formularios = Formulario.joins(turma: :disciplina).where(disciplinas: { departamento_id: @admin.departamento_id }).includes(turma: :disciplina)
+end
+
+# Exporta as respostas de um formulário como arquivo CSV para download.
+#
+# @return [void]
+# @note Lê o parâmetro +:id+ da rota. Redireciona com alerta se o formulário não for
+#   encontrado ou não possuir respostas. Em caso de sucesso, força o download do CSV.
+def exportar_csv<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Too-Many-Statements.md" target="_blank"><b>TooManyStatements</b></a>        </span>      </div>      <span>AdminController#exportar_csv has approx 9 statements</span>          </div>  </li></ol>
+  @formulario = Formulario.find_by(id: params[:id])
+
+  unless @formulario
+    redirect_to admin_resultados_path(@admin), alert: &quot;Formulário não encontrado&quot;<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>AdminController#exportar_csv calls 'admin_resultados_path(@admin)' 2 times</span>              <span>Locations:</span>                  <a href="admin_controller.html#L81" class="js-smell-location">0</a>                  <a href="admin_controller.html#L88" class="js-smell-location">1</a>                  </div>  </li></ol>
+    return
+  end
+
+  @respostas = RespostaForm.where(formulario_id: @formulario.id).includes(:usuario, resposta_elems: :elemento_form)
+
+  if @formulario.resposta_forms.empty?
+    redirect_to admin_resultados_path(@admin), alert: &quot;Falha na exportação: Este formulário ainda não possui respostas registradas.&quot;<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>AdminController#exportar_csv calls 'admin_resultados_path(@admin)' 2 times</span>              <span>Locations:</span>                  <a href="admin_controller.html#L81" class="js-smell-location">0</a>                  <a href="admin_controller.html#L88" class="js-smell-location">1</a>                  </div>  </li></ol>
+    return
+  end
+
+  respond_to do |format|
+    format.csv { definir_headers_csv }
+  end
+end
+
+# Exibe a página de sincronização com o SIGAA (GET) ou processa a sincronização (POST).
+#
+# @return [void]
+def sincronizar_sigaa
+  if request.get?
+    render :sincronizar_sigaa
+  elsif request.post?
+    processar_sincronizacao
+  end
+end
+
+private
+
+# Valida os parâmetros e cria formulários a partir de um template para as turmas selecionadas.
+#
+# @return [void]
+def processar_envio_formularios<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Too-Many-Statements.md" target="_blank"><b>TooManyStatements</b></a>        </span>      </div>      <span>AdminController#processar_envio_formularios has approx 14 statements</span>          </div>  </li></ol>
+  template_id = params[:template_id]
+  turma_ids = params[:turma_ids]
+  envio_path = admin_enviar_formularios_path(@admin)
+
+  if template_id.blank?
+    redirect_to envio_path, alert: &quot;Selecione um template para criar o formulário&quot;
+    return
+  end
+
+  if turma_ids.blank?
+    redirect_to envio_path, alert: &quot;Selecione pelo menos uma turma&quot;
+    return
+  end
+
+  template = Template.includes(elementos: :campos).find(template_id)
+  Turma.where(id: turma_ids).each { |turma| criar_formulario_para_turma(template, turma) }
+
+  msg = turma_ids.size == 1 ? &quot;Formulário criado com sucesso&quot; : &quot;Formulários criados com sucesso&quot;
+  flash[:notice] = msg
+  redirect_to admin_gerenciamento_path(@admin)
+end
+
+# Cria um formulário para uma turma a partir de um template, copiando seus elementos.
+#
+# @param template [Template] template de origem
+# @param turma [Turma] turma destinatária
+# @return [void]
+def criar_formulario_para_turma(template, turma)
+  formulario = Formulario.create!(
+    turma: turma,
+    titulo: &quot;#{turma.disciplina.nome} - #{turma.semestre}&quot;<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Feature-Envy.md" target="_blank"><b>FeatureEnvy</b></a>        </span>      </div>      <span>AdminController#criar_formulario_para_turma refers to 'turma' more than self (maybe move it to another class?)</span>          </div>  </li></ol>
+  )
+  template.elementos.each { |elemento| copiar_elemento(elemento, formulario) }
+end
+
+# Copia um elemento de template para um formulário, incluindo seus campos se não for texto livre.
+#
+# @param elemento [Elemento] elemento do template de origem
+# @param formulario [Formulario] formulário de destino
+# @return [void]
+def copiar_elemento(elemento, formulario)<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Too-Many-Statements.md" target="_blank"><b>TooManyStatements</b></a>        </span>      </div>      <span>AdminController#copiar_elemento has approx 6 statements</span>          </div>  </li>  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Utility-Function.md" target="_blank"><b>UtilityFunction</b></a>        </span>      </div>      <span>AdminController#copiar_elemento doesn't depend on instance state (maybe move it to another class?)</span>          </div>  </li></ol>
+  campos = elemento.campos
+  tipo = campos.first&amp;.tipo_elemento || &quot;Texto&quot;
+  ef = formulario.elemento_forms.create!(
+    enunciado: elemento.enunciado,
+    ordem: elemento.ordem,
+    tipo: tipo
+  )
+  return if tipo == &quot;Texto&quot;
+
+  campos.each do |campo|
+    ef.campo_forms.create!(enunciado: campo.enunciado, ordem: campo.ordem)
+  end
+end
+
+# Define os cabeçalhos HTTP para o download do CSV do formulário.
+#
+# @return [void]
+def definir_headers_csv
+  turma = @formulario.turma
+  num_turma = turma&amp;.numero_da_turma&amp;.parameterize(separator: &quot;_&quot;) || &quot;sem_turma&quot;
+  nome_materia = turma&amp;.disciplina&amp;.nome&amp;.parameterize(separator: &quot;_&quot;) || &quot;sem_materia&quot;
+  nome_arquivo = &quot;formulario_#{@formulario.id}_turma_#{num_turma}_#{nome_materia}.csv&quot;
+  response.headers[&quot;Content-Disposition&quot;] = &quot;attachment; filename=\&quot;#{nome_arquivo}\&quot;&quot;
+end
+
+# Lê os arquivos enviados via POST e delega ao handler adequado do SigaaImporter.
+#
+# @return [void]
+def processar_sincronizacao<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Too-Many-Statements.md" target="_blank"><b>TooManyStatements</b></a>        </span>      </div>      <span>AdminController#processar_sincronizacao has approx 9 statements</span>          </div>  </li></ol>
+  arquivo_classes = params[:arquivo_classes]
+  arquivo_membros = params[:arquivo_membros]
+
+  unless arquivo_classes.present? &amp;&amp; arquivo_membros.present?
+    redirect_to admin_gerenciamento_path, alert: &quot;Por favor, selecione os dois arquivos JSON&quot;
+    return
+  end
+
+  acao = params[:acao]
+  handler = SINCRONIZACAO_HANDLERS[acao]
+  resultado = handler ? handler.call(arquivo_classes.path, arquivo_membros.path) : &quot;ação inválida&quot;
+  processar_resultado(resultado, acao)
+end
+
+# Redireciona para a página de gerenciamento com mensagem apropriada ao resultado da sincronização.
+#
+# @param resultado [String] mensagem retornada pelo +SigaaImporter+
+# @param acao [String] &quot;importar&quot; ou &quot;atualizar&quot;
+# @return [void]
+def processar_resultado(resultado, acao)<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Too-Many-Statements.md" target="_blank"><b>TooManyStatements</b></a>        </span>      </div>      <span>AdminController#processar_resultado has approx 7 statements</span>          </div>  </li></ol>
+  msgs = MENSAGENS_SINCRONIZACAO.fetch(acao, { parcial: &quot;&quot;, sucesso: &quot;&quot;, nome_acao: acao.to_s })
+  gerenciamento = admin_gerenciamento_path(@admin)
+
+  case resultado<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Control-Parameter.md" target="_blank"><b>ControlParameter</b></a>        </span>      </div>      <span>AdminController#processar_resultado is controlled by argument 'resultado'</span>          </div>  </li></ol>
+  when /alguns dados/i
+    redirect_to gerenciamento, notice: msgs[:parcial]
+  when /sucesso/i
+    redirect_to gerenciamento, notice: msgs[:sucesso]
+  when /já existem/i
+    redirect_to gerenciamento, alert: &quot;os dados do SIGAA já existem na base de dados do sistema e não serão importados novamente&quot;
+  when /já estão atualizados/i
+    redirect_to gerenciamento, alert: &quot;os dados do SIGAA já estão atualizados e não serão atualizados novamente&quot;
+  else
+    redirect_to gerenciamento, alert: &quot;erro informando que a #{msgs[:nome_acao]} falhou&quot;
+  end
+end
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/app/controllers/application_controller_html.html b/doc/tmp/rubycritic/app/controllers/application_controller_html.html new file mode 100644 index 0000000000..81c223719c --- /dev/null +++ b/doc/tmp/rubycritic/app/controllers/application_controller_html.html @@ -0,0 +1,1790 @@ + + + + + + + +application_controller.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-06-29 19:51:36 -0300'>2026-06-29 19:51:36 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>app/controllers /</small> application_controller.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating a big">
+            A
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">41</span><small> lines of codes</small></div>
+            <div><span class="metric">3</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">4.0</span><small> complexity/method</small></div>
+            <div><span class="metric">6</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">11.99</span><small> complexity</small></div>
+            <div><span class="metric">0</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              0
+              smell
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code"># Controller base da aplicação do qual todos os demais controllers herdam.
+ +

# # Define os helpers e filtros de autenticação e autorização compartilhados: # current_user (disponível nas views via helper_method), require_login # (exige sessão ativa) e require_admin (exige perfil de administrador). class ApplicationController &lt; ActionController::Base

+ +
# Only allow modern browsers supporting webp images, web push, badges, import maps, CSS nesting, and CSS :has.
+allow_browser versions: :modern
+
+# Changes to the importmap will invalidate the etag for HTML responses
+stale_when_importmap_changes
+
+helper_method :current_user
+
+# Retorna o usuário atualmente autenticado na sessão.
+#
+# @return [Usuario, nil] instância do usuário logado, ou +nil+ se não houver sessão ativa
+def current_user
+  @current_user ||= Usuario.find_by(id: session[:usuario_id])
+end
+
+# Exige que o usuário esteja autenticado para acessar a ação.
+#
+# @return [void]
+# @note Redireciona para a página raiz com alerta caso o usuário não esteja logado.
+def require_login
+  unless current_user
+    redirect_to root_path, alert: &quot;Você precisa estar logado para acessar esta página.&quot;
+  end
+end
+
+# Exige que o usuário autenticado seja um administrador.
+#
+# @return [void]
+# @note Redireciona para a página inicial com alerta caso o usuário não seja um +Administrador+.
+def require_admin
+  unless current_user.is_a?(Administrador)
+    redirect_to inicio_path, alert: &quot;Acesso negado.&quot;
+  end
+end
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/app/controllers/campo_forms_controller_html.html b/doc/tmp/rubycritic/app/controllers/campo_forms_controller_html.html new file mode 100644 index 0000000000..7eaec15ce0 --- /dev/null +++ b/doc/tmp/rubycritic/app/controllers/campo_forms_controller_html.html @@ -0,0 +1,1849 @@ + + + + + + + +campo_forms_controller.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-06-29 19:51:36 -0300'>2026-06-29 19:51:36 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>app/controllers /</small> campo_forms_controller.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating f big">
+            F
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">101</span><small> lines of codes</small></div>
+            <div><span class="metric">9</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">6.0</span><small> complexity/method</small></div>
+            <div><span class="metric">5</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">53.58</span><small> complexity</small></div>
+            <div><span class="metric">122</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              11
+              smells
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code"># Gerencia o CRUD de campos instanciados em elementos de formulários de avaliação.
+ +

# # CampoForm é a representação de uma opção de resposta dentro de um # ElementoForm concreto, criada a partir de um Campo de template no momento # do envio da avaliação. Este controller expõe as operações individuais de CRUD # sobre essas instâncias. class CampoFormsController &lt; ApplicationController<ol class=“nocode errors smells”> <li> <div class=“description”> <div class=“heading”> <span> <i class=“fa fa-warning” aria-hidden=“true”></i> <a href=“github.com/troessner/reek/blob/master/docs/Instance-Variable-Assumption.md” target=“_blank”>InstanceVariableAssumption</a> </span> </div> <span>CampoFormsController assumes too much for instance variable ‘@campo_form’</span> </div> </li></ol>

+ +
before_action :require_login
+before_action :set_campo_form, only: %i[ show edit update destroy ]
+
+# Lista todos os campos de formulário cadastrados.
+#
+# @return [void]
+def index
+  @campo_forms = CampoForm.all
+end
+
+# Exibe os detalhes de um campo de formulário específico.
+#
+# @return [void]
+def show
+end
+
+# Exibe o formulário de criação de novo campo de formulário.
+#
+# @return [void]
+def new
+  @campo_form = CampoForm.new
+end
+
+# Exibe o formulário de edição de um campo de formulário existente.
+#
+# @return [void]
+def edit
+end
+
+# Cria um novo campo de formulário com os parâmetros permitidos.
+#
+# @return [void]
+# @note Persiste o campo de formulário no banco de dados. Em caso de sucesso,
+#   redireciona para a sua página; em caso de falha, re-renderiza o formulário de criação.
+def create<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="http://docs.seattlerb.org/flay/" target="_blank"><b>DuplicateCode</b></a>        </span>      </div>      <span>Similar code found in 14 nodes</span>              <span>Locations:</span>                  <a href="campo_forms_controller.html#L42" class="js-smell-location">0</a>                  <a href="campos_controller.html#L42" class="js-smell-location">1</a>                  <a href="cursos_controller.html#L41" class="js-smell-location">2</a>                  <a href="departamentos_controller.html#L42" class="js-smell-location">3</a>                  <a href="discentes_controller.html#L42" class="js-smell-location">4</a>                  <a href="disciplinas_controller.html#L42" class="js-smell-location">5</a>                  <a href="docentes_controller.html#L42" class="js-smell-location">6</a>                  <a href="elemento_forms_controller.html#L42" class="js-smell-location">7</a>                  <a href="elementos_controller.html#L41" class="js-smell-location">8</a>                  <a href="formularios_controller.html#L41" class="js-smell-location">9</a>                  <a href="resposta_elems_controller.html#L42" class="js-smell-location">10</a>                  <a href="resposta_forms_controller.html#L42" class="js-smell-location">11</a>                  <a href="turmas_controller.html#L41" class="js-smell-location">12</a>                  <a href="usuarios_controller.html#L144" class="js-smell-location">13</a>                  </div>  </li>  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Too-Many-Statements.md" target="_blank"><b>TooManyStatements</b></a>        </span>      </div>      <span>CampoFormsController#create has approx 10 statements</span>          </div>  </li></ol>
+  @campo_form = CampoForm.new(campo_form_params)
+
+  respond_to do |format|
+    if @campo_form.save
+      format.html { redirect_to @campo_form, notice: &quot;Campo form was successfully created.&quot; }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>CampoFormsController#create calls 'format.html' 2 times</span>              <span>Locations:</span>                  <a href="campo_forms_controller.html#L47" class="js-smell-location">0</a>                  <a href="campo_forms_controller.html#L50" class="js-smell-location">1</a>                  </div>  </li></ol>
+      format.json { render :show, status: :created, location: @campo_form }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>CampoFormsController#create calls 'format.json' 2 times</span>              <span>Locations:</span>                  <a href="campo_forms_controller.html#L48" class="js-smell-location">0</a>                  <a href="campo_forms_controller.html#L51" class="js-smell-location">1</a>                  </div>  </li></ol>
+    else
+      format.html { render :new, status: :unprocessable_content }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>CampoFormsController#create calls 'format.html' 2 times</span>              <span>Locations:</span>                  <a href="campo_forms_controller.html#L47" class="js-smell-location">0</a>                  <a href="campo_forms_controller.html#L50" class="js-smell-location">1</a>                  </div>  </li></ol>
+      format.json { render json: @campo_form.errors, status: :unprocessable_content }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>CampoFormsController#create calls 'format.json' 2 times</span>              <span>Locations:</span>                  <a href="campo_forms_controller.html#L48" class="js-smell-location">0</a>                  <a href="campo_forms_controller.html#L51" class="js-smell-location">1</a>                  </div>  </li></ol>
+    end
+  end
+end
+
+# Atualiza os dados de um campo de formulário existente.
+#
+# @return [void]
+# @note Persiste as alterações no banco de dados. Em caso de sucesso, redireciona para
+#   a página do campo de formulário; em caso de falha, re-renderiza o formulário de edição.
+def update<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="http://docs.seattlerb.org/flay/" target="_blank"><b>DuplicateCode</b></a>        </span>      </div>      <span>Similar code found in 14 nodes</span>              <span>Locations:</span>                  <a href="campo_forms_controller.html#L61" class="js-smell-location">0</a>                  <a href="campos_controller.html#L61" class="js-smell-location">1</a>                  <a href="cursos_controller.html#L60" class="js-smell-location">2</a>                  <a href="departamentos_controller.html#L61" class="js-smell-location">3</a>                  <a href="discentes_controller.html#L61" class="js-smell-location">4</a>                  <a href="disciplinas_controller.html#L61" class="js-smell-location">5</a>                  <a href="docentes_controller.html#L61" class="js-smell-location">6</a>                  <a href="elemento_forms_controller.html#L61" class="js-smell-location">7</a>                  <a href="elementos_controller.html#L60" class="js-smell-location">8</a>                  <a href="formularios_controller.html#L60" class="js-smell-location">9</a>                  <a href="resposta_elems_controller.html#L61" class="js-smell-location">10</a>                  <a href="resposta_forms_controller.html#L61" class="js-smell-location">11</a>                  <a href="turmas_controller.html#L60" class="js-smell-location">12</a>                  <a href="usuarios_controller.html#L163" class="js-smell-location">13</a>                  </div>  </li>  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Too-Many-Statements.md" target="_blank"><b>TooManyStatements</b></a>        </span>      </div>      <span>CampoFormsController#update has approx 9 statements</span>          </div>  </li></ol>
+  respond_to do |format|
+    if @campo_form.update(campo_form_params)
+      format.html { redirect_to @campo_form, notice: &quot;Campo form was successfully updated.&quot;, status: :see_other }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>CampoFormsController#update calls 'format.html' 2 times</span>              <span>Locations:</span>                  <a href="campo_forms_controller.html#L64" class="js-smell-location">0</a>                  <a href="campo_forms_controller.html#L67" class="js-smell-location">1</a>                  </div>  </li></ol>
+      format.json { render :show, status: :ok, location: @campo_form }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>CampoFormsController#update calls 'format.json' 2 times</span>              <span>Locations:</span>                  <a href="campo_forms_controller.html#L65" class="js-smell-location">0</a>                  <a href="campo_forms_controller.html#L68" class="js-smell-location">1</a>                  </div>  </li></ol>
+    else
+      format.html { render :edit, status: :unprocessable_content }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>CampoFormsController#update calls 'format.html' 2 times</span>              <span>Locations:</span>                  <a href="campo_forms_controller.html#L64" class="js-smell-location">0</a>                  <a href="campo_forms_controller.html#L67" class="js-smell-location">1</a>                  </div>  </li></ol>
+      format.json { render json: @campo_form.errors, status: :unprocessable_content }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>CampoFormsController#update calls 'format.json' 2 times</span>              <span>Locations:</span>                  <a href="campo_forms_controller.html#L65" class="js-smell-location">0</a>                  <a href="campo_forms_controller.html#L68" class="js-smell-location">1</a>                  </div>  </li></ol>
+    end
+  end
+end
+
+# Remove permanentemente um campo de formulário do banco de dados.
+#
+# @return [void]
+# @note Redireciona para a lista de campos de formulário após a exclusão.
+def destroy<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="http://docs.seattlerb.org/flay/" target="_blank"><b>DuplicateCode</b></a>        </span>      </div>      <span>Similar code found in 14 nodes</span>              <span>Locations:</span>                  <a href="campo_forms_controller.html#L77" class="js-smell-location">0</a>                  <a href="campos_controller.html#L77" class="js-smell-location">1</a>                  <a href="cursos_controller.html#L76" class="js-smell-location">2</a>                  <a href="departamentos_controller.html#L77" class="js-smell-location">3</a>                  <a href="discentes_controller.html#L77" class="js-smell-location">4</a>                  <a href="disciplinas_controller.html#L77" class="js-smell-location">5</a>                  <a href="docentes_controller.html#L77" class="js-smell-location">6</a>                  <a href="elemento_forms_controller.html#L77" class="js-smell-location">7</a>                  <a href="elementos_controller.html#L76" class="js-smell-location">8</a>                  <a href="formularios_controller.html#L76" class="js-smell-location">9</a>                  <a href="resposta_elems_controller.html#L77" class="js-smell-location">10</a>                  <a href="resposta_forms_controller.html#L77" class="js-smell-location">11</a>                  <a href="turmas_controller.html#L76" class="js-smell-location">12</a>                  <a href="usuarios_controller.html#L179" class="js-smell-location">13</a>                  </div>  </li>  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Too-Many-Statements.md" target="_blank"><b>TooManyStatements</b></a>        </span>      </div>      <span>CampoFormsController#destroy has approx 6 statements</span>          </div>  </li></ol>
+  @campo_form.destroy!
+
+  respond_to do |format|
+    format.html { redirect_to campo_forms_path, notice: &quot;Campo form was successfully destroyed.&quot;, status: :see_other }
+    format.json { head :no_content }
+  end
+end
+
+private
+
+# Busca o campo de formulário pelo +:id+ da rota e o atribui a +@campo_form+.
+#
+# @return [void]
+def set_campo_form
+  @campo_form = CampoForm.find(params.expect(:id))
+end
+
+# Filtra os parâmetros permitidos para criação/atualização de campo de formulário.
+#
+# @return [ActionController::Parameters] parâmetros filtrados do campo de formulário
+def campo_form_params
+  params.expect(campo_form: [ :ordem, :enunciado, :elemento_form_id ])
+end
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/app/controllers/campos_controller_html.html b/doc/tmp/rubycritic/app/controllers/campos_controller_html.html new file mode 100644 index 0000000000..a655cb4ed2 --- /dev/null +++ b/doc/tmp/rubycritic/app/controllers/campos_controller_html.html @@ -0,0 +1,1849 @@ + + + + + + + +campos_controller.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-06-29 19:51:36 -0300'>2026-06-29 19:51:36 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>app/controllers /</small> campos_controller.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating f big">
+            F
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">101</span><small> lines of codes</small></div>
+            <div><span class="metric">9</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">6.0</span><small> complexity/method</small></div>
+            <div><span class="metric">5</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">53.58</span><small> complexity</small></div>
+            <div><span class="metric">122</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              11
+              smells
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code"># Gerencia o CRUD de campos (opções de resposta) de elementos de template.
+ +

# # Campos definem as opções disponíveis para resposta em um elemento, bem como o # tipo da questão (texto livre, múltipla escolha etc.). Normalmente são gerenciados # via nested attributes no TemplatesController; este controller expõe as operações # individuais de CRUD. class CamposController &lt; ApplicationController<ol class=“nocode errors smells”> <li> <div class=“description”> <div class=“heading”> <span> <i class=“fa fa-warning” aria-hidden=“true”></i> <a href=“github.com/troessner/reek/blob/master/docs/Instance-Variable-Assumption.md” target=“_blank”>InstanceVariableAssumption</a> </span> </div> <span>CamposController assumes too much for instance variable ‘@campo’</span> </div> </li></ol>

+ +
before_action :require_login
+before_action :set_campo, only: %i[ show edit update destroy ]
+
+# Lista todos os campos cadastrados.
+#
+# @return [void]
+def index
+  @campos = Campo.all
+end
+
+# Exibe os detalhes de um campo específico.
+#
+# @return [void]
+def show
+end
+
+# Exibe o formulário de criação de novo campo.
+#
+# @return [void]
+def new
+  @campo = Campo.new
+end
+
+# Exibe o formulário de edição de um campo existente.
+#
+# @return [void]
+def edit
+end
+
+# Cria um novo campo com os parâmetros permitidos.
+#
+# @return [void]
+# @note Persiste o campo no banco de dados. Em caso de sucesso, redireciona para a
+#   página do campo; em caso de falha, re-renderiza o formulário de criação.
+def create<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="http://docs.seattlerb.org/flay/" target="_blank"><b>DuplicateCode</b></a>        </span>      </div>      <span>Similar code found in 14 nodes</span>              <span>Locations:</span>                  <a href="campo_forms_controller.html#L42" class="js-smell-location">0</a>                  <a href="campos_controller.html#L42" class="js-smell-location">1</a>                  <a href="cursos_controller.html#L41" class="js-smell-location">2</a>                  <a href="departamentos_controller.html#L42" class="js-smell-location">3</a>                  <a href="discentes_controller.html#L42" class="js-smell-location">4</a>                  <a href="disciplinas_controller.html#L42" class="js-smell-location">5</a>                  <a href="docentes_controller.html#L42" class="js-smell-location">6</a>                  <a href="elemento_forms_controller.html#L42" class="js-smell-location">7</a>                  <a href="elementos_controller.html#L41" class="js-smell-location">8</a>                  <a href="formularios_controller.html#L41" class="js-smell-location">9</a>                  <a href="resposta_elems_controller.html#L42" class="js-smell-location">10</a>                  <a href="resposta_forms_controller.html#L42" class="js-smell-location">11</a>                  <a href="turmas_controller.html#L41" class="js-smell-location">12</a>                  <a href="usuarios_controller.html#L144" class="js-smell-location">13</a>                  </div>  </li>  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Too-Many-Statements.md" target="_blank"><b>TooManyStatements</b></a>        </span>      </div>      <span>CamposController#create has approx 10 statements</span>          </div>  </li></ol>
+  @campo = Campo.new(campo_params)
+
+  respond_to do |format|
+    if @campo.save
+      format.html { redirect_to @campo, notice: &quot;Campo was successfully created.&quot; }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>CamposController#create calls 'format.html' 2 times</span>              <span>Locations:</span>                  <a href="campos_controller.html#L47" class="js-smell-location">0</a>                  <a href="campos_controller.html#L50" class="js-smell-location">1</a>                  </div>  </li></ol>
+      format.json { render :show, status: :created, location: @campo }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>CamposController#create calls 'format.json' 2 times</span>              <span>Locations:</span>                  <a href="campos_controller.html#L48" class="js-smell-location">0</a>                  <a href="campos_controller.html#L51" class="js-smell-location">1</a>                  </div>  </li></ol>
+    else
+      format.html { render :new, status: :unprocessable_content }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>CamposController#create calls 'format.html' 2 times</span>              <span>Locations:</span>                  <a href="campos_controller.html#L47" class="js-smell-location">0</a>                  <a href="campos_controller.html#L50" class="js-smell-location">1</a>                  </div>  </li></ol>
+      format.json { render json: @campo.errors, status: :unprocessable_content }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>CamposController#create calls 'format.json' 2 times</span>              <span>Locations:</span>                  <a href="campos_controller.html#L48" class="js-smell-location">0</a>                  <a href="campos_controller.html#L51" class="js-smell-location">1</a>                  </div>  </li></ol>
+    end
+  end
+end
+
+# Atualiza os dados de um campo existente.
+#
+# @return [void]
+# @note Persiste as alterações no banco de dados. Em caso de sucesso, redireciona para
+#   a página do campo; em caso de falha, re-renderiza o formulário de edição.
+def update<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="http://docs.seattlerb.org/flay/" target="_blank"><b>DuplicateCode</b></a>        </span>      </div>      <span>Similar code found in 14 nodes</span>              <span>Locations:</span>                  <a href="campo_forms_controller.html#L61" class="js-smell-location">0</a>                  <a href="campos_controller.html#L61" class="js-smell-location">1</a>                  <a href="cursos_controller.html#L60" class="js-smell-location">2</a>                  <a href="departamentos_controller.html#L61" class="js-smell-location">3</a>                  <a href="discentes_controller.html#L61" class="js-smell-location">4</a>                  <a href="disciplinas_controller.html#L61" class="js-smell-location">5</a>                  <a href="docentes_controller.html#L61" class="js-smell-location">6</a>                  <a href="elemento_forms_controller.html#L61" class="js-smell-location">7</a>                  <a href="elementos_controller.html#L60" class="js-smell-location">8</a>                  <a href="formularios_controller.html#L60" class="js-smell-location">9</a>                  <a href="resposta_elems_controller.html#L61" class="js-smell-location">10</a>                  <a href="resposta_forms_controller.html#L61" class="js-smell-location">11</a>                  <a href="turmas_controller.html#L60" class="js-smell-location">12</a>                  <a href="usuarios_controller.html#L163" class="js-smell-location">13</a>                  </div>  </li>  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Too-Many-Statements.md" target="_blank"><b>TooManyStatements</b></a>        </span>      </div>      <span>CamposController#update has approx 9 statements</span>          </div>  </li></ol>
+  respond_to do |format|
+    if @campo.update(campo_params)
+      format.html { redirect_to @campo, notice: &quot;Campo was successfully updated.&quot;, status: :see_other }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>CamposController#update calls 'format.html' 2 times</span>              <span>Locations:</span>                  <a href="campos_controller.html#L64" class="js-smell-location">0</a>                  <a href="campos_controller.html#L67" class="js-smell-location">1</a>                  </div>  </li></ol>
+      format.json { render :show, status: :ok, location: @campo }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>CamposController#update calls 'format.json' 2 times</span>              <span>Locations:</span>                  <a href="campos_controller.html#L65" class="js-smell-location">0</a>                  <a href="campos_controller.html#L68" class="js-smell-location">1</a>                  </div>  </li></ol>
+    else
+      format.html { render :edit, status: :unprocessable_content }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>CamposController#update calls 'format.html' 2 times</span>              <span>Locations:</span>                  <a href="campos_controller.html#L64" class="js-smell-location">0</a>                  <a href="campos_controller.html#L67" class="js-smell-location">1</a>                  </div>  </li></ol>
+      format.json { render json: @campo.errors, status: :unprocessable_content }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>CamposController#update calls 'format.json' 2 times</span>              <span>Locations:</span>                  <a href="campos_controller.html#L65" class="js-smell-location">0</a>                  <a href="campos_controller.html#L68" class="js-smell-location">1</a>                  </div>  </li></ol>
+    end
+  end
+end
+
+# Remove permanentemente um campo do banco de dados.
+#
+# @return [void]
+# @note Redireciona para a lista de campos após a exclusão.
+def destroy<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="http://docs.seattlerb.org/flay/" target="_blank"><b>DuplicateCode</b></a>        </span>      </div>      <span>Similar code found in 14 nodes</span>              <span>Locations:</span>                  <a href="campo_forms_controller.html#L77" class="js-smell-location">0</a>                  <a href="campos_controller.html#L77" class="js-smell-location">1</a>                  <a href="cursos_controller.html#L76" class="js-smell-location">2</a>                  <a href="departamentos_controller.html#L77" class="js-smell-location">3</a>                  <a href="discentes_controller.html#L77" class="js-smell-location">4</a>                  <a href="disciplinas_controller.html#L77" class="js-smell-location">5</a>                  <a href="docentes_controller.html#L77" class="js-smell-location">6</a>                  <a href="elemento_forms_controller.html#L77" class="js-smell-location">7</a>                  <a href="elementos_controller.html#L76" class="js-smell-location">8</a>                  <a href="formularios_controller.html#L76" class="js-smell-location">9</a>                  <a href="resposta_elems_controller.html#L77" class="js-smell-location">10</a>                  <a href="resposta_forms_controller.html#L77" class="js-smell-location">11</a>                  <a href="turmas_controller.html#L76" class="js-smell-location">12</a>                  <a href="usuarios_controller.html#L179" class="js-smell-location">13</a>                  </div>  </li>  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Too-Many-Statements.md" target="_blank"><b>TooManyStatements</b></a>        </span>      </div>      <span>CamposController#destroy has approx 6 statements</span>          </div>  </li></ol>
+  @campo.destroy!
+
+  respond_to do |format|
+    format.html { redirect_to campos_path, notice: &quot;Campo was successfully destroyed.&quot;, status: :see_other }
+    format.json { head :no_content }
+  end
+end
+
+private
+
+# Busca o campo pelo +:id+ da rota e o atribui a +@campo+.
+#
+# @return [void]
+def set_campo
+  @campo = Campo.find(params.expect(:id))
+end
+
+# Filtra os parâmetros permitidos para criação/atualização de campo.
+#
+# @return [ActionController::Parameters] parâmetros filtrados do campo
+def campo_params
+  params.expect(campo: [ :ordem, :enunciado, :tipo_elemento, :elemento_id ])
+end
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/app/controllers/concerns/admin_autenticavel_html.html b/doc/tmp/rubycritic/app/controllers/concerns/admin_autenticavel_html.html new file mode 100644 index 0000000000..d665144ef8 --- /dev/null +++ b/doc/tmp/rubycritic/app/controllers/concerns/admin_autenticavel_html.html @@ -0,0 +1,1770 @@ + + + + + + + +admin_autenticavel.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../../overview.html"><img src="../../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Never committed
+
+    </span>
+  </div>
+  <div>
+    <h3><small>app/controllers/concerns /</small> admin_autenticavel.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating a big">
+            A
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">20</span><small> lines of codes</small></div>
+            <div><span class="metric">1</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">10.9</span><small> complexity/method</small></div>
+            <div><span class="metric">0</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">10.89</span><small> complexity</small></div>
+            <div><span class="metric">0</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              0
+              smell
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code"># Verifica e disponibiliza o administrador autenticado referenciado pela rota.
+ +

# # Redireciona para a página inicial com alerta se o administrador da rota for # diferente do usuário autenticado na sessão. module AdminAutenticavel

+ +
extend ActiveSupport::Concern
+
+private
+
+# Busca e valida o administrador referenciado pela rota.
+#
+# @return [void]
+def set_admin
+  @admin = Administrador.find(params[:admin_id])
+
+  if @admin.id != session[:usuario_id]
+    redirect_to inicio_path, alert: &quot;Acesso negado! Você só pode acessar as suas próprias páginas.&quot;
+  end
+end
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../../assets/javascripts/application.js"></script>
+  <script src="../../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/app/controllers/cursos_controller_html.html b/doc/tmp/rubycritic/app/controllers/cursos_controller_html.html new file mode 100644 index 0000000000..b09a724684 --- /dev/null +++ b/doc/tmp/rubycritic/app/controllers/cursos_controller_html.html @@ -0,0 +1,1849 @@ + + + + + + + +cursos_controller.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-06-29 19:51:36 -0300'>2026-06-29 19:51:36 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>app/controllers /</small> cursos_controller.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating f big">
+            F
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">100</span><small> lines of codes</small></div>
+            <div><span class="metric">9</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">6.0</span><small> complexity/method</small></div>
+            <div><span class="metric">5</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">53.58</span><small> complexity</small></div>
+            <div><span class="metric">122</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              11
+              smells
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code"># Gerencia o CRUD de cursos de graduação e pós-graduação.
+ +

# # Cursos pertencem a um Departamento e agrupam +Discente+s. Normalmente são # criados automaticamente durante a sincronização com o SIGAA; este controller # expõe as operações individuais de CRUD para manutenção manual dos registros. class CursosController &lt; ApplicationController<ol class=“nocode errors smells”> <li> <div class=“description”> <div class=“heading”> <span> <i class=“fa fa-warning” aria-hidden=“true”></i> <a href=“github.com/troessner/reek/blob/master/docs/Instance-Variable-Assumption.md” target=“_blank”>InstanceVariableAssumption</a> </span> </div> <span>CursosController assumes too much for instance variable ‘@curso’</span> </div> </li></ol>

+ +
before_action :require_login
+before_action :set_curso, only: %i[ show edit update destroy ]
+
+# Lista todos os cursos cadastrados.
+#
+# @return [void]
+def index
+  @cursos = Curso.all
+end
+
+# Exibe os detalhes de um curso específico.
+#
+# @return [void]
+def show
+end
+
+# Exibe o formulário de criação de novo curso.
+#
+# @return [void]
+def new
+  @curso = Curso.new
+end
+
+# Exibe o formulário de edição de um curso existente.
+#
+# @return [void]
+def edit
+end
+
+# Cria um novo curso com os parâmetros permitidos.
+#
+# @return [void]
+# @note Persiste o curso no banco de dados. Em caso de sucesso, redireciona para a
+#   sua página; em caso de falha, re-renderiza o formulário de criação.
+def create<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="http://docs.seattlerb.org/flay/" target="_blank"><b>DuplicateCode</b></a>        </span>      </div>      <span>Similar code found in 14 nodes</span>              <span>Locations:</span>                  <a href="campo_forms_controller.html#L42" class="js-smell-location">0</a>                  <a href="campos_controller.html#L42" class="js-smell-location">1</a>                  <a href="cursos_controller.html#L41" class="js-smell-location">2</a>                  <a href="departamentos_controller.html#L42" class="js-smell-location">3</a>                  <a href="discentes_controller.html#L42" class="js-smell-location">4</a>                  <a href="disciplinas_controller.html#L42" class="js-smell-location">5</a>                  <a href="docentes_controller.html#L42" class="js-smell-location">6</a>                  <a href="elemento_forms_controller.html#L42" class="js-smell-location">7</a>                  <a href="elementos_controller.html#L41" class="js-smell-location">8</a>                  <a href="formularios_controller.html#L41" class="js-smell-location">9</a>                  <a href="resposta_elems_controller.html#L42" class="js-smell-location">10</a>                  <a href="resposta_forms_controller.html#L42" class="js-smell-location">11</a>                  <a href="turmas_controller.html#L41" class="js-smell-location">12</a>                  <a href="usuarios_controller.html#L144" class="js-smell-location">13</a>                  </div>  </li>  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Too-Many-Statements.md" target="_blank"><b>TooManyStatements</b></a>        </span>      </div>      <span>CursosController#create has approx 10 statements</span>          </div>  </li></ol>
+  @curso = Curso.new(curso_params)
+
+  respond_to do |format|
+    if @curso.save
+      format.html { redirect_to @curso, notice: &quot;Curso was successfully created.&quot; }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>CursosController#create calls 'format.html' 2 times</span>              <span>Locations:</span>                  <a href="cursos_controller.html#L46" class="js-smell-location">0</a>                  <a href="cursos_controller.html#L49" class="js-smell-location">1</a>                  </div>  </li></ol>
+      format.json { render :show, status: :created, location: @curso }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>CursosController#create calls 'format.json' 2 times</span>              <span>Locations:</span>                  <a href="cursos_controller.html#L47" class="js-smell-location">0</a>                  <a href="cursos_controller.html#L50" class="js-smell-location">1</a>                  </div>  </li></ol>
+    else
+      format.html { render :new, status: :unprocessable_content }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>CursosController#create calls 'format.html' 2 times</span>              <span>Locations:</span>                  <a href="cursos_controller.html#L46" class="js-smell-location">0</a>                  <a href="cursos_controller.html#L49" class="js-smell-location">1</a>                  </div>  </li></ol>
+      format.json { render json: @curso.errors, status: :unprocessable_content }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>CursosController#create calls 'format.json' 2 times</span>              <span>Locations:</span>                  <a href="cursos_controller.html#L47" class="js-smell-location">0</a>                  <a href="cursos_controller.html#L50" class="js-smell-location">1</a>                  </div>  </li></ol>
+    end
+  end
+end
+
+# Atualiza os dados de um curso existente.
+#
+# @return [void]
+# @note Persiste as alterações no banco de dados. Em caso de sucesso, redireciona para
+#   a página do curso; em caso de falha, re-renderiza o formulário de edição.
+def update<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="http://docs.seattlerb.org/flay/" target="_blank"><b>DuplicateCode</b></a>        </span>      </div>      <span>Similar code found in 14 nodes</span>              <span>Locations:</span>                  <a href="campo_forms_controller.html#L61" class="js-smell-location">0</a>                  <a href="campos_controller.html#L61" class="js-smell-location">1</a>                  <a href="cursos_controller.html#L60" class="js-smell-location">2</a>                  <a href="departamentos_controller.html#L61" class="js-smell-location">3</a>                  <a href="discentes_controller.html#L61" class="js-smell-location">4</a>                  <a href="disciplinas_controller.html#L61" class="js-smell-location">5</a>                  <a href="docentes_controller.html#L61" class="js-smell-location">6</a>                  <a href="elemento_forms_controller.html#L61" class="js-smell-location">7</a>                  <a href="elementos_controller.html#L60" class="js-smell-location">8</a>                  <a href="formularios_controller.html#L60" class="js-smell-location">9</a>                  <a href="resposta_elems_controller.html#L61" class="js-smell-location">10</a>                  <a href="resposta_forms_controller.html#L61" class="js-smell-location">11</a>                  <a href="turmas_controller.html#L60" class="js-smell-location">12</a>                  <a href="usuarios_controller.html#L163" class="js-smell-location">13</a>                  </div>  </li>  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Too-Many-Statements.md" target="_blank"><b>TooManyStatements</b></a>        </span>      </div>      <span>CursosController#update has approx 9 statements</span>          </div>  </li></ol>
+  respond_to do |format|
+    if @curso.update(curso_params)
+      format.html { redirect_to @curso, notice: &quot;Curso was successfully updated.&quot;, status: :see_other }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>CursosController#update calls 'format.html' 2 times</span>              <span>Locations:</span>                  <a href="cursos_controller.html#L63" class="js-smell-location">0</a>                  <a href="cursos_controller.html#L66" class="js-smell-location">1</a>                  </div>  </li></ol>
+      format.json { render :show, status: :ok, location: @curso }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>CursosController#update calls 'format.json' 2 times</span>              <span>Locations:</span>                  <a href="cursos_controller.html#L64" class="js-smell-location">0</a>                  <a href="cursos_controller.html#L67" class="js-smell-location">1</a>                  </div>  </li></ol>
+    else
+      format.html { render :edit, status: :unprocessable_content }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>CursosController#update calls 'format.html' 2 times</span>              <span>Locations:</span>                  <a href="cursos_controller.html#L63" class="js-smell-location">0</a>                  <a href="cursos_controller.html#L66" class="js-smell-location">1</a>                  </div>  </li></ol>
+      format.json { render json: @curso.errors, status: :unprocessable_content }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>CursosController#update calls 'format.json' 2 times</span>              <span>Locations:</span>                  <a href="cursos_controller.html#L64" class="js-smell-location">0</a>                  <a href="cursos_controller.html#L67" class="js-smell-location">1</a>                  </div>  </li></ol>
+    end
+  end
+end
+
+# Remove permanentemente um curso do banco de dados.
+#
+# @return [void]
+# @note Redireciona para a lista de cursos após a exclusão.
+def destroy<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="http://docs.seattlerb.org/flay/" target="_blank"><b>DuplicateCode</b></a>        </span>      </div>      <span>Similar code found in 14 nodes</span>              <span>Locations:</span>                  <a href="campo_forms_controller.html#L77" class="js-smell-location">0</a>                  <a href="campos_controller.html#L77" class="js-smell-location">1</a>                  <a href="cursos_controller.html#L76" class="js-smell-location">2</a>                  <a href="departamentos_controller.html#L77" class="js-smell-location">3</a>                  <a href="discentes_controller.html#L77" class="js-smell-location">4</a>                  <a href="disciplinas_controller.html#L77" class="js-smell-location">5</a>                  <a href="docentes_controller.html#L77" class="js-smell-location">6</a>                  <a href="elemento_forms_controller.html#L77" class="js-smell-location">7</a>                  <a href="elementos_controller.html#L76" class="js-smell-location">8</a>                  <a href="formularios_controller.html#L76" class="js-smell-location">9</a>                  <a href="resposta_elems_controller.html#L77" class="js-smell-location">10</a>                  <a href="resposta_forms_controller.html#L77" class="js-smell-location">11</a>                  <a href="turmas_controller.html#L76" class="js-smell-location">12</a>                  <a href="usuarios_controller.html#L179" class="js-smell-location">13</a>                  </div>  </li>  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Too-Many-Statements.md" target="_blank"><b>TooManyStatements</b></a>        </span>      </div>      <span>CursosController#destroy has approx 6 statements</span>          </div>  </li></ol>
+  @curso.destroy!
+
+  respond_to do |format|
+    format.html { redirect_to cursos_path, notice: &quot;Curso was successfully destroyed.&quot;, status: :see_other }
+    format.json { head :no_content }
+  end
+end
+
+private
+
+# Busca o curso pelo +:id+ da rota e o atribui a +@curso+.
+#
+# @return [void]
+def set_curso
+  @curso = Curso.find(params.expect(:id))
+end
+
+# Filtra os parâmetros permitidos para criação/atualização de curso.
+#
+# @return [ActionController::Parameters] parâmetros filtrados do curso
+def curso_params
+  params.expect(curso: [ :codigo, :nome, :departamento_id ])
+end
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/app/controllers/definicao_senhas_controller_html.html b/doc/tmp/rubycritic/app/controllers/definicao_senhas_controller_html.html new file mode 100644 index 0000000000..592d51de70 --- /dev/null +++ b/doc/tmp/rubycritic/app/controllers/definicao_senhas_controller_html.html @@ -0,0 +1,1838 @@ + + + + + + + +definicao_senhas_controller.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-06-29 19:51:36 -0300'>2026-06-29 19:51:36 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>app/controllers /</small> definicao_senhas_controller.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating b big">
+            B
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">90</span><small> lines of codes</small></div>
+            <div><span class="metric">7</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">7.6</span><small> complexity/method</small></div>
+            <div><span class="metric">4</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">53.38</span><small> complexity</small></div>
+            <div><span class="metric">19</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              4
+              smells
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code"># Gerencia o fluxo de definição de senha inicial para novos usuários.
+ +

# # Novos usuários recebem um email com um link contendo um token único. Este # controller valida o token, exibe o formulário de definição de senha e persiste # a nova senha quando as validações são satisfeitas. Após a definição bem-sucedida, # o token é invalidado para evitar reutilização. class DefinicaoSenhasController &lt; ApplicationController<ol class=“nocode errors smells”> <li> <div class=“description”> <div class=“heading”> <span> <i class=“fa fa-warning” aria-hidden=“true”></i> <a href=“github.com/troessner/reek/blob/master/docs/Instance-Variable-Assumption.md” target=“_blank”>InstanceVariableAssumption</a> </span> </div> <span>DefinicaoSenhasController assumes too much for instance variable ‘@usuario’</span> </div> </li></ol>

+ +
# Exibe o formulário de definição de senha via token enviado por email.
+#
+# @return [void]
+# @note Lê o parâmetro +:token+ da rota. Redireciona para a página raiz com alerta
+#   se o token for inválido ou não corresponder a nenhum usuário.
+def edit<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="http://docs.seattlerb.org/flay/" target="_blank"><b>DuplicateCode</b></a>        </span>      </div>      <span>Similar code found in 2 nodes</span>              <span>Locations:</span>                  <a href="definicao_senhas_controller.html#L13" class="js-smell-location">0</a>                  <a href="redefinicao_senhas_controller.html#L43" class="js-smell-location">1</a>                  </div>  </li></ol>
+  @usuario = Usuario.find_by(definicao_senha_token: params[:token])
+
+  return if @usuario.present?
+
+  redirect_to root_path, alert: &quot;Link de definição de senha inválido.&quot;
+end
+
+# Persiste a nova senha para o usuário identificado pelo token.
+#
+# @return [void]
+# @note Lê os parâmetros +:token+, +:senha+ e +:senha_confirmation+.
+#   Redireciona com alerta se o token for inválido, as senhas não conferirem ou a
+#   senha tiver menos de 6 caracteres. Em caso de sucesso, limpa o token e a data
+#   de envio, salva a nova senha no banco de dados e redireciona para a página raiz.
+def update<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Too-Many-Statements.md" target="_blank"><b>TooManyStatements</b></a>        </span>      </div>      <span>DefinicaoSenhasController#update has approx 7 statements</span>          </div>  </li></ol>
+  @usuario = Usuario.find_by(definicao_senha_token: params[:token])
+
+  return redirecionar_token_invalido unless @usuario.present?
+  return render_erro_senha(&quot;confirmação não confere&quot;) unless senhas_iguais?
+  return render_erro_senha(&quot;senha inválida&quot;) unless senha_valida?<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>DefinicaoSenhasController#update calls 'render_erro_senha("senha inválida")' 2 times</span>              <span>Locations:</span>                  <a href="definicao_senhas_controller.html#L33" class="js-smell-location">0</a>                  <a href="definicao_senhas_controller.html#L40" class="js-smell-location">1</a>                  </div>  </li></ol>
+
+  atribuir_nova_senha
+
+  if @usuario.save
+    redirect_to root_path, notice: &quot;Senha definida com sucesso.&quot;
+  else
+    render_erro_senha(&quot;senha inválida&quot;)<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>DefinicaoSenhasController#update calls 'render_erro_senha("senha inválida")' 2 times</span>              <span>Locations:</span>                  <a href="definicao_senhas_controller.html#L33" class="js-smell-location">0</a>                  <a href="definicao_senhas_controller.html#L40" class="js-smell-location">1</a>                  </div>  </li></ol>
+  end
+end
+
+private
+
+# Redireciona para a página raiz com mensagem de token inválido.
+#
+# @return [void]
+# @note Efeito colateral: redireciona para +root_path+ com alerta.
+def redirecionar_token_invalido
+  redirect_to root_path, alert: &quot;Link de definição de senha inválido.&quot;
+end
+
+# Re-renderiza o formulário de edição com mensagem de erro de senha.
+#
+# @param mensagem [String] detalhe do erro (ex.: &quot;confirmação não confere&quot;)
+# @return [void]
+# @note Efeito colateral: define +flash.now[:alert]+ e renderiza +:edit+
+#   com status +422 Unprocessable Content+.
+def render_erro_senha(mensagem)
+  flash.now[:alert] = &quot;Falha na definição de senha: #{mensagem}&quot;
+  render :edit, status: :unprocessable_content
+end
+
+# Verifica se os parâmetros +:senha+ e +:senha_confirmation+ são idênticos.
+#
+# @return [Boolean] +true+ se as senhas forem iguais, +false+ caso contrário
+def senhas_iguais?
+  params[:senha].to_s == params[:senha_confirmation].to_s
+end
+
+# Verifica se o parâmetro +:senha+ possui ao menos 6 caracteres.
+#
+# @return [Boolean] +true+ se o comprimento for suficiente, +false+ caso contrário
+def senha_valida?
+  params[:senha].to_s.length &gt;= 6
+end
+
+# Atribui a nova senha e invalida o token de definição no objeto +@usuario+.
+#
+# @return [void]
+# @note Não persiste no banco de dados — o salvamento ocorre no método +update+
+#   que chama este helper.
+def atribuir_nova_senha
+  @usuario.senha = params[:senha].to_s
+  @usuario.senha_confirmation = params[:senha_confirmation].to_s
+  @usuario.definicao_senha_token = nil
+  @usuario.definicao_senha_sent_at = nil
+end
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/app/controllers/departamentos_controller_html.html b/doc/tmp/rubycritic/app/controllers/departamentos_controller_html.html new file mode 100644 index 0000000000..4965232578 --- /dev/null +++ b/doc/tmp/rubycritic/app/controllers/departamentos_controller_html.html @@ -0,0 +1,1849 @@ + + + + + + + +departamentos_controller.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-06-29 19:51:36 -0300'>2026-06-29 19:51:36 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>app/controllers /</small> departamentos_controller.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating f big">
+            F
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">101</span><small> lines of codes</small></div>
+            <div><span class="metric">9</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">6.0</span><small> complexity/method</small></div>
+            <div><span class="metric">5</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">53.58</span><small> complexity</small></div>
+            <div><span class="metric">122</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              11
+              smells
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code"># Gerencia o CRUD de departamentos acadêmicos da instituição.
+ +

# # Departamentos agrupam +Curso+s, +Disciplina+s e +Administrador+es. Não podem # ser excluídos enquanto possuírem cursos ou disciplinas vinculados. Normalmente # são criados durante a sincronização com o SIGAA; este controller expõe as # operações individuais de CRUD para manutenção manual dos registros. class DepartamentosController &lt; ApplicationController<ol class=“nocode errors smells”> <li> <div class=“description”> <div class=“heading”> <span> <i class=“fa fa-warning” aria-hidden=“true”></i> <a href=“github.com/troessner/reek/blob/master/docs/Instance-Variable-Assumption.md” target=“_blank”>InstanceVariableAssumption</a> </span> </div> <span>DepartamentosController assumes too much for instance variable ‘@departamento’</span> </div> </li></ol>

+ +
before_action :require_login
+before_action :set_departamento, only: %i[ show edit update destroy ]
+
+# Lista todos os departamentos cadastrados.
+#
+# @return [void]
+def index
+  @departamentos = Departamento.all
+end
+
+# Exibe os detalhes de um departamento específico.
+#
+# @return [void]
+def show
+end
+
+# Exibe o formulário de criação de novo departamento.
+#
+# @return [void]
+def new
+  @departamento = Departamento.new
+end
+
+# Exibe o formulário de edição de um departamento existente.
+#
+# @return [void]
+def edit
+end
+
+# Cria um novo departamento com os parâmetros permitidos.
+#
+# @return [void]
+# @note Persiste o departamento no banco de dados. Em caso de sucesso, redireciona para
+#   a sua página; em caso de falha, re-renderiza o formulário de criação.
+def create<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="http://docs.seattlerb.org/flay/" target="_blank"><b>DuplicateCode</b></a>        </span>      </div>      <span>Similar code found in 14 nodes</span>              <span>Locations:</span>                  <a href="campo_forms_controller.html#L42" class="js-smell-location">0</a>                  <a href="campos_controller.html#L42" class="js-smell-location">1</a>                  <a href="cursos_controller.html#L41" class="js-smell-location">2</a>                  <a href="departamentos_controller.html#L42" class="js-smell-location">3</a>                  <a href="discentes_controller.html#L42" class="js-smell-location">4</a>                  <a href="disciplinas_controller.html#L42" class="js-smell-location">5</a>                  <a href="docentes_controller.html#L42" class="js-smell-location">6</a>                  <a href="elemento_forms_controller.html#L42" class="js-smell-location">7</a>                  <a href="elementos_controller.html#L41" class="js-smell-location">8</a>                  <a href="formularios_controller.html#L41" class="js-smell-location">9</a>                  <a href="resposta_elems_controller.html#L42" class="js-smell-location">10</a>                  <a href="resposta_forms_controller.html#L42" class="js-smell-location">11</a>                  <a href="turmas_controller.html#L41" class="js-smell-location">12</a>                  <a href="usuarios_controller.html#L144" class="js-smell-location">13</a>                  </div>  </li>  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Too-Many-Statements.md" target="_blank"><b>TooManyStatements</b></a>        </span>      </div>      <span>DepartamentosController#create has approx 10 statements</span>          </div>  </li></ol>
+  @departamento = Departamento.new(departamento_params)
+
+  respond_to do |format|
+    if @departamento.save
+      format.html { redirect_to @departamento, notice: &quot;Departamento was successfully created.&quot; }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>DepartamentosController#create calls 'format.html' 2 times</span>              <span>Locations:</span>                  <a href="departamentos_controller.html#L47" class="js-smell-location">0</a>                  <a href="departamentos_controller.html#L50" class="js-smell-location">1</a>                  </div>  </li></ol>
+      format.json { render :show, status: :created, location: @departamento }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>DepartamentosController#create calls 'format.json' 2 times</span>              <span>Locations:</span>                  <a href="departamentos_controller.html#L48" class="js-smell-location">0</a>                  <a href="departamentos_controller.html#L51" class="js-smell-location">1</a>                  </div>  </li></ol>
+    else
+      format.html { render :new, status: :unprocessable_content }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>DepartamentosController#create calls 'format.html' 2 times</span>              <span>Locations:</span>                  <a href="departamentos_controller.html#L47" class="js-smell-location">0</a>                  <a href="departamentos_controller.html#L50" class="js-smell-location">1</a>                  </div>  </li></ol>
+      format.json { render json: @departamento.errors, status: :unprocessable_content }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>DepartamentosController#create calls 'format.json' 2 times</span>              <span>Locations:</span>                  <a href="departamentos_controller.html#L48" class="js-smell-location">0</a>                  <a href="departamentos_controller.html#L51" class="js-smell-location">1</a>                  </div>  </li></ol>
+    end
+  end
+end
+
+# Atualiza os dados de um departamento existente.
+#
+# @return [void]
+# @note Persiste as alterações no banco de dados. Em caso de sucesso, redireciona para
+#   a página do departamento; em caso de falha, re-renderiza o formulário de edição.
+def update<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="http://docs.seattlerb.org/flay/" target="_blank"><b>DuplicateCode</b></a>        </span>      </div>      <span>Similar code found in 14 nodes</span>              <span>Locations:</span>                  <a href="campo_forms_controller.html#L61" class="js-smell-location">0</a>                  <a href="campos_controller.html#L61" class="js-smell-location">1</a>                  <a href="cursos_controller.html#L60" class="js-smell-location">2</a>                  <a href="departamentos_controller.html#L61" class="js-smell-location">3</a>                  <a href="discentes_controller.html#L61" class="js-smell-location">4</a>                  <a href="disciplinas_controller.html#L61" class="js-smell-location">5</a>                  <a href="docentes_controller.html#L61" class="js-smell-location">6</a>                  <a href="elemento_forms_controller.html#L61" class="js-smell-location">7</a>                  <a href="elementos_controller.html#L60" class="js-smell-location">8</a>                  <a href="formularios_controller.html#L60" class="js-smell-location">9</a>                  <a href="resposta_elems_controller.html#L61" class="js-smell-location">10</a>                  <a href="resposta_forms_controller.html#L61" class="js-smell-location">11</a>                  <a href="turmas_controller.html#L60" class="js-smell-location">12</a>                  <a href="usuarios_controller.html#L163" class="js-smell-location">13</a>                  </div>  </li>  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Too-Many-Statements.md" target="_blank"><b>TooManyStatements</b></a>        </span>      </div>      <span>DepartamentosController#update has approx 9 statements</span>          </div>  </li></ol>
+  respond_to do |format|
+    if @departamento.update(departamento_params)
+      format.html { redirect_to @departamento, notice: &quot;Departamento was successfully updated.&quot;, status: :see_other }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>DepartamentosController#update calls 'format.html' 2 times</span>              <span>Locations:</span>                  <a href="departamentos_controller.html#L64" class="js-smell-location">0</a>                  <a href="departamentos_controller.html#L67" class="js-smell-location">1</a>                  </div>  </li></ol>
+      format.json { render :show, status: :ok, location: @departamento }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>DepartamentosController#update calls 'format.json' 2 times</span>              <span>Locations:</span>                  <a href="departamentos_controller.html#L65" class="js-smell-location">0</a>                  <a href="departamentos_controller.html#L68" class="js-smell-location">1</a>                  </div>  </li></ol>
+    else
+      format.html { render :edit, status: :unprocessable_content }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>DepartamentosController#update calls 'format.html' 2 times</span>              <span>Locations:</span>                  <a href="departamentos_controller.html#L64" class="js-smell-location">0</a>                  <a href="departamentos_controller.html#L67" class="js-smell-location">1</a>                  </div>  </li></ol>
+      format.json { render json: @departamento.errors, status: :unprocessable_content }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>DepartamentosController#update calls 'format.json' 2 times</span>              <span>Locations:</span>                  <a href="departamentos_controller.html#L65" class="js-smell-location">0</a>                  <a href="departamentos_controller.html#L68" class="js-smell-location">1</a>                  </div>  </li></ol>
+    end
+  end
+end
+
+# Remove permanentemente um departamento do banco de dados.
+#
+# @return [void]
+# @note Redireciona para a lista de departamentos após a exclusão.
+def destroy<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="http://docs.seattlerb.org/flay/" target="_blank"><b>DuplicateCode</b></a>        </span>      </div>      <span>Similar code found in 14 nodes</span>              <span>Locations:</span>                  <a href="campo_forms_controller.html#L77" class="js-smell-location">0</a>                  <a href="campos_controller.html#L77" class="js-smell-location">1</a>                  <a href="cursos_controller.html#L76" class="js-smell-location">2</a>                  <a href="departamentos_controller.html#L77" class="js-smell-location">3</a>                  <a href="discentes_controller.html#L77" class="js-smell-location">4</a>                  <a href="disciplinas_controller.html#L77" class="js-smell-location">5</a>                  <a href="docentes_controller.html#L77" class="js-smell-location">6</a>                  <a href="elemento_forms_controller.html#L77" class="js-smell-location">7</a>                  <a href="elementos_controller.html#L76" class="js-smell-location">8</a>                  <a href="formularios_controller.html#L76" class="js-smell-location">9</a>                  <a href="resposta_elems_controller.html#L77" class="js-smell-location">10</a>                  <a href="resposta_forms_controller.html#L77" class="js-smell-location">11</a>                  <a href="turmas_controller.html#L76" class="js-smell-location">12</a>                  <a href="usuarios_controller.html#L179" class="js-smell-location">13</a>                  </div>  </li>  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Too-Many-Statements.md" target="_blank"><b>TooManyStatements</b></a>        </span>      </div>      <span>DepartamentosController#destroy has approx 6 statements</span>          </div>  </li></ol>
+  @departamento.destroy!
+
+  respond_to do |format|
+    format.html { redirect_to departamentos_path, notice: &quot;Departamento was successfully destroyed.&quot;, status: :see_other }
+    format.json { head :no_content }
+  end
+end
+
+private
+
+# Busca o departamento pelo +:id+ da rota e o atribui a +@departamento+.
+#
+# @return [void]
+def set_departamento
+  @departamento = Departamento.find(params.expect(:id))
+end
+
+# Filtra os parâmetros permitidos para criação/atualização de departamento.
+#
+# @return [ActionController::Parameters] parâmetros filtrados do departamento
+def departamento_params
+  params.expect(departamento: [ :codigo, :nome ])
+end
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/app/controllers/discentes_controller_html.html b/doc/tmp/rubycritic/app/controllers/discentes_controller_html.html new file mode 100644 index 0000000000..120bcab74d --- /dev/null +++ b/doc/tmp/rubycritic/app/controllers/discentes_controller_html.html @@ -0,0 +1,1849 @@ + + + + + + + +discentes_controller.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-06-29 19:51:36 -0300'>2026-06-29 19:51:36 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>app/controllers /</small> discentes_controller.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating f big">
+            F
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">101</span><small> lines of codes</small></div>
+            <div><span class="metric">9</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">6.0</span><small> complexity/method</small></div>
+            <div><span class="metric">5</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">53.58</span><small> complexity</small></div>
+            <div><span class="metric">122</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              11
+              smells
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code"># Gerencia o CRUD de discentes (alunos) cadastrados no sistema.
+ +

# # Discentes são usuários com perfil de aluno, vinculados a um Curso e a uma # ou mais +Turma+s. Normalmente são importados via +AdminController#sincronizar_sigaa+; # este controller expõe as operações individuais de CRUD para manutenção manual # dos registros. class DiscentesController &lt; ApplicationController<ol class=“nocode errors smells”> <li> <div class=“description”> <div class=“heading”> <span> <i class=“fa fa-warning” aria-hidden=“true”></i> <a href=“github.com/troessner/reek/blob/master/docs/Instance-Variable-Assumption.md” target=“_blank”>InstanceVariableAssumption</a> </span> </div> <span>DiscentesController assumes too much for instance variable ‘@discente’</span> </div> </li></ol>

+ +
before_action :require_login
+before_action :set_discente, only: %i[ show edit update destroy ]
+
+# Lista todos os discentes cadastrados.
+#
+# @return [void]
+def index
+  @discentes = Discente.all
+end
+
+# Exibe os detalhes de um discente específico.
+#
+# @return [void]
+def show
+end
+
+# Exibe o formulário de criação de novo discente.
+#
+# @return [void]
+def new
+  @discente = Discente.new
+end
+
+# Exibe o formulário de edição de um discente existente.
+#
+# @return [void]
+def edit
+end
+
+# Cria um novo discente com os parâmetros permitidos.
+#
+# @return [void]
+# @note Persiste o discente no banco de dados. Em caso de sucesso, redireciona para a
+#   sua página; em caso de falha, re-renderiza o formulário de criação.
+def create<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="http://docs.seattlerb.org/flay/" target="_blank"><b>DuplicateCode</b></a>        </span>      </div>      <span>Similar code found in 14 nodes</span>              <span>Locations:</span>                  <a href="campo_forms_controller.html#L42" class="js-smell-location">0</a>                  <a href="campos_controller.html#L42" class="js-smell-location">1</a>                  <a href="cursos_controller.html#L41" class="js-smell-location">2</a>                  <a href="departamentos_controller.html#L42" class="js-smell-location">3</a>                  <a href="discentes_controller.html#L42" class="js-smell-location">4</a>                  <a href="disciplinas_controller.html#L42" class="js-smell-location">5</a>                  <a href="docentes_controller.html#L42" class="js-smell-location">6</a>                  <a href="elemento_forms_controller.html#L42" class="js-smell-location">7</a>                  <a href="elementos_controller.html#L41" class="js-smell-location">8</a>                  <a href="formularios_controller.html#L41" class="js-smell-location">9</a>                  <a href="resposta_elems_controller.html#L42" class="js-smell-location">10</a>                  <a href="resposta_forms_controller.html#L42" class="js-smell-location">11</a>                  <a href="turmas_controller.html#L41" class="js-smell-location">12</a>                  <a href="usuarios_controller.html#L144" class="js-smell-location">13</a>                  </div>  </li>  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Too-Many-Statements.md" target="_blank"><b>TooManyStatements</b></a>        </span>      </div>      <span>DiscentesController#create has approx 10 statements</span>          </div>  </li></ol>
+  @discente = Discente.new(discente_params)
+
+  respond_to do |format|
+    if @discente.save
+      format.html { redirect_to @discente, notice: &quot;Discente was successfully created.&quot; }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>DiscentesController#create calls 'format.html' 2 times</span>              <span>Locations:</span>                  <a href="discentes_controller.html#L47" class="js-smell-location">0</a>                  <a href="discentes_controller.html#L50" class="js-smell-location">1</a>                  </div>  </li></ol>
+      format.json { render :show, status: :created, location: @discente }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>DiscentesController#create calls 'format.json' 2 times</span>              <span>Locations:</span>                  <a href="discentes_controller.html#L48" class="js-smell-location">0</a>                  <a href="discentes_controller.html#L51" class="js-smell-location">1</a>                  </div>  </li></ol>
+    else
+      format.html { render :new, status: :unprocessable_content }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>DiscentesController#create calls 'format.html' 2 times</span>              <span>Locations:</span>                  <a href="discentes_controller.html#L47" class="js-smell-location">0</a>                  <a href="discentes_controller.html#L50" class="js-smell-location">1</a>                  </div>  </li></ol>
+      format.json { render json: @discente.errors, status: :unprocessable_content }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>DiscentesController#create calls 'format.json' 2 times</span>              <span>Locations:</span>                  <a href="discentes_controller.html#L48" class="js-smell-location">0</a>                  <a href="discentes_controller.html#L51" class="js-smell-location">1</a>                  </div>  </li></ol>
+    end
+  end
+end
+
+# Atualiza os dados de um discente existente.
+#
+# @return [void]
+# @note Persiste as alterações no banco de dados. Em caso de sucesso, redireciona para
+#   a página do discente; em caso de falha, re-renderiza o formulário de edição.
+def update<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="http://docs.seattlerb.org/flay/" target="_blank"><b>DuplicateCode</b></a>        </span>      </div>      <span>Similar code found in 14 nodes</span>              <span>Locations:</span>                  <a href="campo_forms_controller.html#L61" class="js-smell-location">0</a>                  <a href="campos_controller.html#L61" class="js-smell-location">1</a>                  <a href="cursos_controller.html#L60" class="js-smell-location">2</a>                  <a href="departamentos_controller.html#L61" class="js-smell-location">3</a>                  <a href="discentes_controller.html#L61" class="js-smell-location">4</a>                  <a href="disciplinas_controller.html#L61" class="js-smell-location">5</a>                  <a href="docentes_controller.html#L61" class="js-smell-location">6</a>                  <a href="elemento_forms_controller.html#L61" class="js-smell-location">7</a>                  <a href="elementos_controller.html#L60" class="js-smell-location">8</a>                  <a href="formularios_controller.html#L60" class="js-smell-location">9</a>                  <a href="resposta_elems_controller.html#L61" class="js-smell-location">10</a>                  <a href="resposta_forms_controller.html#L61" class="js-smell-location">11</a>                  <a href="turmas_controller.html#L60" class="js-smell-location">12</a>                  <a href="usuarios_controller.html#L163" class="js-smell-location">13</a>                  </div>  </li>  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Too-Many-Statements.md" target="_blank"><b>TooManyStatements</b></a>        </span>      </div>      <span>DiscentesController#update has approx 9 statements</span>          </div>  </li></ol>
+  respond_to do |format|
+    if @discente.update(discente_params)
+      format.html { redirect_to @discente, notice: &quot;Discente was successfully updated.&quot;, status: :see_other }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>DiscentesController#update calls 'format.html' 2 times</span>              <span>Locations:</span>                  <a href="discentes_controller.html#L64" class="js-smell-location">0</a>                  <a href="discentes_controller.html#L67" class="js-smell-location">1</a>                  </div>  </li></ol>
+      format.json { render :show, status: :ok, location: @discente }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>DiscentesController#update calls 'format.json' 2 times</span>              <span>Locations:</span>                  <a href="discentes_controller.html#L65" class="js-smell-location">0</a>                  <a href="discentes_controller.html#L68" class="js-smell-location">1</a>                  </div>  </li></ol>
+    else
+      format.html { render :edit, status: :unprocessable_content }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>DiscentesController#update calls 'format.html' 2 times</span>              <span>Locations:</span>                  <a href="discentes_controller.html#L64" class="js-smell-location">0</a>                  <a href="discentes_controller.html#L67" class="js-smell-location">1</a>                  </div>  </li></ol>
+      format.json { render json: @discente.errors, status: :unprocessable_content }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>DiscentesController#update calls 'format.json' 2 times</span>              <span>Locations:</span>                  <a href="discentes_controller.html#L65" class="js-smell-location">0</a>                  <a href="discentes_controller.html#L68" class="js-smell-location">1</a>                  </div>  </li></ol>
+    end
+  end
+end
+
+# Remove permanentemente um discente do banco de dados.
+#
+# @return [void]
+# @note Redireciona para a lista de discentes após a exclusão.
+def destroy<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="http://docs.seattlerb.org/flay/" target="_blank"><b>DuplicateCode</b></a>        </span>      </div>      <span>Similar code found in 14 nodes</span>              <span>Locations:</span>                  <a href="campo_forms_controller.html#L77" class="js-smell-location">0</a>                  <a href="campos_controller.html#L77" class="js-smell-location">1</a>                  <a href="cursos_controller.html#L76" class="js-smell-location">2</a>                  <a href="departamentos_controller.html#L77" class="js-smell-location">3</a>                  <a href="discentes_controller.html#L77" class="js-smell-location">4</a>                  <a href="disciplinas_controller.html#L77" class="js-smell-location">5</a>                  <a href="docentes_controller.html#L77" class="js-smell-location">6</a>                  <a href="elemento_forms_controller.html#L77" class="js-smell-location">7</a>                  <a href="elementos_controller.html#L76" class="js-smell-location">8</a>                  <a href="formularios_controller.html#L76" class="js-smell-location">9</a>                  <a href="resposta_elems_controller.html#L77" class="js-smell-location">10</a>                  <a href="resposta_forms_controller.html#L77" class="js-smell-location">11</a>                  <a href="turmas_controller.html#L76" class="js-smell-location">12</a>                  <a href="usuarios_controller.html#L179" class="js-smell-location">13</a>                  </div>  </li>  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Too-Many-Statements.md" target="_blank"><b>TooManyStatements</b></a>        </span>      </div>      <span>DiscentesController#destroy has approx 6 statements</span>          </div>  </li></ol>
+  @discente.destroy!
+
+  respond_to do |format|
+    format.html { redirect_to discentes_path, notice: &quot;Discente was successfully destroyed.&quot;, status: :see_other }
+    format.json { head :no_content }
+  end
+end
+
+private
+
+# Busca o discente pelo +:id+ da rota e o atribui a +@discente+.
+#
+# @return [void]
+def set_discente
+  @discente = Discente.find(params.expect(:id))
+end
+
+# Filtra os parâmetros permitidos para criação/atualização de discente.
+#
+# @return [ActionController::Parameters] parâmetros filtrados do discente
+def discente_params
+  params.expect(discente: [ :matricula, :email, :nome, :formacao, :curso_id ])
+end
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/app/controllers/disciplinas_controller_html.html b/doc/tmp/rubycritic/app/controllers/disciplinas_controller_html.html new file mode 100644 index 0000000000..e6db34ac64 --- /dev/null +++ b/doc/tmp/rubycritic/app/controllers/disciplinas_controller_html.html @@ -0,0 +1,1849 @@ + + + + + + + +disciplinas_controller.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-06-29 19:51:36 -0300'>2026-06-29 19:51:36 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>app/controllers /</small> disciplinas_controller.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating f big">
+            F
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">101</span><small> lines of codes</small></div>
+            <div><span class="metric">9</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">6.0</span><small> complexity/method</small></div>
+            <div><span class="metric">5</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">53.58</span><small> complexity</small></div>
+            <div><span class="metric">122</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              11
+              smells
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code"># Gerencia o CRUD de disciplinas ofertadas pelos departamentos.
+ +

# # Disciplinas pertencem a um Departamento e possuem múltiplas +Turma+s (uma # por semestre/oferta). Normalmente são importadas via sincronização com o SIGAA; # este controller expõe as operações individuais de CRUD para manutenção manual # dos registros. class DisciplinasController &lt; ApplicationController<ol class=“nocode errors smells”> <li> <div class=“description”> <div class=“heading”> <span> <i class=“fa fa-warning” aria-hidden=“true”></i> <a href=“github.com/troessner/reek/blob/master/docs/Instance-Variable-Assumption.md” target=“_blank”>InstanceVariableAssumption</a> </span> </div> <span>DisciplinasController assumes too much for instance variable ‘@disciplina’</span> </div> </li></ol>

+ +
before_action :require_login
+before_action :set_disciplina, only: %i[ show edit update destroy ]
+
+# Lista todas as disciplinas cadastradas.
+#
+# @return [void]
+def index
+  @disciplinas = Disciplina.all
+end
+
+# Exibe os detalhes de uma disciplina específica.
+#
+# @return [void]
+def show
+end
+
+# Exibe o formulário de criação de nova disciplina.
+#
+# @return [void]
+def new
+  @disciplina = Disciplina.new
+end
+
+# Exibe o formulário de edição de uma disciplina existente.
+#
+# @return [void]
+def edit
+end
+
+# Cria uma nova disciplina com os parâmetros permitidos.
+#
+# @return [void]
+# @note Persiste a disciplina no banco de dados. Em caso de sucesso, redireciona para
+#   a sua página; em caso de falha, re-renderiza o formulário de criação.
+def create<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="http://docs.seattlerb.org/flay/" target="_blank"><b>DuplicateCode</b></a>        </span>      </div>      <span>Similar code found in 14 nodes</span>              <span>Locations:</span>                  <a href="campo_forms_controller.html#L42" class="js-smell-location">0</a>                  <a href="campos_controller.html#L42" class="js-smell-location">1</a>                  <a href="cursos_controller.html#L41" class="js-smell-location">2</a>                  <a href="departamentos_controller.html#L42" class="js-smell-location">3</a>                  <a href="discentes_controller.html#L42" class="js-smell-location">4</a>                  <a href="disciplinas_controller.html#L42" class="js-smell-location">5</a>                  <a href="docentes_controller.html#L42" class="js-smell-location">6</a>                  <a href="elemento_forms_controller.html#L42" class="js-smell-location">7</a>                  <a href="elementos_controller.html#L41" class="js-smell-location">8</a>                  <a href="formularios_controller.html#L41" class="js-smell-location">9</a>                  <a href="resposta_elems_controller.html#L42" class="js-smell-location">10</a>                  <a href="resposta_forms_controller.html#L42" class="js-smell-location">11</a>                  <a href="turmas_controller.html#L41" class="js-smell-location">12</a>                  <a href="usuarios_controller.html#L144" class="js-smell-location">13</a>                  </div>  </li>  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Too-Many-Statements.md" target="_blank"><b>TooManyStatements</b></a>        </span>      </div>      <span>DisciplinasController#create has approx 10 statements</span>          </div>  </li></ol>
+  @disciplina = Disciplina.new(disciplina_params)
+
+  respond_to do |format|
+    if @disciplina.save
+      format.html { redirect_to @disciplina, notice: &quot;Disciplina was successfully created.&quot; }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>DisciplinasController#create calls 'format.html' 2 times</span>              <span>Locations:</span>                  <a href="disciplinas_controller.html#L47" class="js-smell-location">0</a>                  <a href="disciplinas_controller.html#L50" class="js-smell-location">1</a>                  </div>  </li></ol>
+      format.json { render :show, status: :created, location: @disciplina }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>DisciplinasController#create calls 'format.json' 2 times</span>              <span>Locations:</span>                  <a href="disciplinas_controller.html#L48" class="js-smell-location">0</a>                  <a href="disciplinas_controller.html#L51" class="js-smell-location">1</a>                  </div>  </li></ol>
+    else
+      format.html { render :new, status: :unprocessable_content }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>DisciplinasController#create calls 'format.html' 2 times</span>              <span>Locations:</span>                  <a href="disciplinas_controller.html#L47" class="js-smell-location">0</a>                  <a href="disciplinas_controller.html#L50" class="js-smell-location">1</a>                  </div>  </li></ol>
+      format.json { render json: @disciplina.errors, status: :unprocessable_content }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>DisciplinasController#create calls 'format.json' 2 times</span>              <span>Locations:</span>                  <a href="disciplinas_controller.html#L48" class="js-smell-location">0</a>                  <a href="disciplinas_controller.html#L51" class="js-smell-location">1</a>                  </div>  </li></ol>
+    end
+  end
+end
+
+# Atualiza os dados de uma disciplina existente.
+#
+# @return [void]
+# @note Persiste as alterações no banco de dados. Em caso de sucesso, redireciona para
+#   a página da disciplina; em caso de falha, re-renderiza o formulário de edição.
+def update<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="http://docs.seattlerb.org/flay/" target="_blank"><b>DuplicateCode</b></a>        </span>      </div>      <span>Similar code found in 14 nodes</span>              <span>Locations:</span>                  <a href="campo_forms_controller.html#L61" class="js-smell-location">0</a>                  <a href="campos_controller.html#L61" class="js-smell-location">1</a>                  <a href="cursos_controller.html#L60" class="js-smell-location">2</a>                  <a href="departamentos_controller.html#L61" class="js-smell-location">3</a>                  <a href="discentes_controller.html#L61" class="js-smell-location">4</a>                  <a href="disciplinas_controller.html#L61" class="js-smell-location">5</a>                  <a href="docentes_controller.html#L61" class="js-smell-location">6</a>                  <a href="elemento_forms_controller.html#L61" class="js-smell-location">7</a>                  <a href="elementos_controller.html#L60" class="js-smell-location">8</a>                  <a href="formularios_controller.html#L60" class="js-smell-location">9</a>                  <a href="resposta_elems_controller.html#L61" class="js-smell-location">10</a>                  <a href="resposta_forms_controller.html#L61" class="js-smell-location">11</a>                  <a href="turmas_controller.html#L60" class="js-smell-location">12</a>                  <a href="usuarios_controller.html#L163" class="js-smell-location">13</a>                  </div>  </li>  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Too-Many-Statements.md" target="_blank"><b>TooManyStatements</b></a>        </span>      </div>      <span>DisciplinasController#update has approx 9 statements</span>          </div>  </li></ol>
+  respond_to do |format|
+    if @disciplina.update(disciplina_params)
+      format.html { redirect_to @disciplina, notice: &quot;Disciplina was successfully updated.&quot;, status: :see_other }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>DisciplinasController#update calls 'format.html' 2 times</span>              <span>Locations:</span>                  <a href="disciplinas_controller.html#L64" class="js-smell-location">0</a>                  <a href="disciplinas_controller.html#L67" class="js-smell-location">1</a>                  </div>  </li></ol>
+      format.json { render :show, status: :ok, location: @disciplina }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>DisciplinasController#update calls 'format.json' 2 times</span>              <span>Locations:</span>                  <a href="disciplinas_controller.html#L65" class="js-smell-location">0</a>                  <a href="disciplinas_controller.html#L68" class="js-smell-location">1</a>                  </div>  </li></ol>
+    else
+      format.html { render :edit, status: :unprocessable_content }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>DisciplinasController#update calls 'format.html' 2 times</span>              <span>Locations:</span>                  <a href="disciplinas_controller.html#L64" class="js-smell-location">0</a>                  <a href="disciplinas_controller.html#L67" class="js-smell-location">1</a>                  </div>  </li></ol>
+      format.json { render json: @disciplina.errors, status: :unprocessable_content }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>DisciplinasController#update calls 'format.json' 2 times</span>              <span>Locations:</span>                  <a href="disciplinas_controller.html#L65" class="js-smell-location">0</a>                  <a href="disciplinas_controller.html#L68" class="js-smell-location">1</a>                  </div>  </li></ol>
+    end
+  end
+end
+
+# Remove permanentemente uma disciplina do banco de dados.
+#
+# @return [void]
+# @note Redireciona para a lista de disciplinas após a exclusão.
+def destroy<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="http://docs.seattlerb.org/flay/" target="_blank"><b>DuplicateCode</b></a>        </span>      </div>      <span>Similar code found in 14 nodes</span>              <span>Locations:</span>                  <a href="campo_forms_controller.html#L77" class="js-smell-location">0</a>                  <a href="campos_controller.html#L77" class="js-smell-location">1</a>                  <a href="cursos_controller.html#L76" class="js-smell-location">2</a>                  <a href="departamentos_controller.html#L77" class="js-smell-location">3</a>                  <a href="discentes_controller.html#L77" class="js-smell-location">4</a>                  <a href="disciplinas_controller.html#L77" class="js-smell-location">5</a>                  <a href="docentes_controller.html#L77" class="js-smell-location">6</a>                  <a href="elemento_forms_controller.html#L77" class="js-smell-location">7</a>                  <a href="elementos_controller.html#L76" class="js-smell-location">8</a>                  <a href="formularios_controller.html#L76" class="js-smell-location">9</a>                  <a href="resposta_elems_controller.html#L77" class="js-smell-location">10</a>                  <a href="resposta_forms_controller.html#L77" class="js-smell-location">11</a>                  <a href="turmas_controller.html#L76" class="js-smell-location">12</a>                  <a href="usuarios_controller.html#L179" class="js-smell-location">13</a>                  </div>  </li>  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Too-Many-Statements.md" target="_blank"><b>TooManyStatements</b></a>        </span>      </div>      <span>DisciplinasController#destroy has approx 6 statements</span>          </div>  </li></ol>
+  @disciplina.destroy!
+
+  respond_to do |format|
+    format.html { redirect_to disciplinas_path, notice: &quot;Disciplina was successfully destroyed.&quot;, status: :see_other }
+    format.json { head :no_content }
+  end
+end
+
+private
+
+# Busca a disciplina pelo +:id+ da rota e a atribui a +@disciplina+.
+#
+# @return [void]
+def set_disciplina
+  @disciplina = Disciplina.find(params.expect(:id))
+end
+
+# Filtra os parâmetros permitidos para criação/atualização de disciplina.
+#
+# @return [ActionController::Parameters] parâmetros filtrados da disciplina
+def disciplina_params
+  params.expect(disciplina: [ :codigo, :nome, :departamento_id ])
+end
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/app/controllers/docentes_controller_html.html b/doc/tmp/rubycritic/app/controllers/docentes_controller_html.html new file mode 100644 index 0000000000..8a55d823f6 --- /dev/null +++ b/doc/tmp/rubycritic/app/controllers/docentes_controller_html.html @@ -0,0 +1,1849 @@ + + + + + + + +docentes_controller.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-06-29 19:51:36 -0300'>2026-06-29 19:51:36 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>app/controllers /</small> docentes_controller.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating f big">
+            F
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">101</span><small> lines of codes</small></div>
+            <div><span class="metric">9</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">6.0</span><small> complexity/method</small></div>
+            <div><span class="metric">5</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">53.58</span><small> complexity</small></div>
+            <div><span class="metric">122</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              11
+              smells
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code"># Gerencia o CRUD de docentes (professores) cadastrados no sistema.
+ +

# # Docentes são usuários com perfil de professor, vinculados a uma ou mais +Turma+s # e a um Departamento. Normalmente são importados via +AdminController#sincronizar_sigaa+; # este controller expõe as operações individuais de CRUD para manutenção manual # dos registros. class DocentesController &lt; ApplicationController<ol class=“nocode errors smells”> <li> <div class=“description”> <div class=“heading”> <span> <i class=“fa fa-warning” aria-hidden=“true”></i> <a href=“github.com/troessner/reek/blob/master/docs/Instance-Variable-Assumption.md” target=“_blank”>InstanceVariableAssumption</a> </span> </div> <span>DocentesController assumes too much for instance variable ‘@docente’</span> </div> </li></ol>

+ +
before_action :require_login
+before_action :set_docente, only: %i[ show edit update destroy ]
+
+# Lista todos os docentes cadastrados.
+#
+# @return [void]
+def index
+  @docentes = Docente.all
+end
+
+# Exibe os detalhes de um docente específico.
+#
+# @return [void]
+def show
+end
+
+# Exibe o formulário de criação de novo docente.
+#
+# @return [void]
+def new
+  @docente = Docente.new
+end
+
+# Exibe o formulário de edição de um docente existente.
+#
+# @return [void]
+def edit
+end
+
+# Cria um novo docente com os parâmetros permitidos.
+#
+# @return [void]
+# @note Persiste o docente no banco de dados. Em caso de sucesso, redireciona para a
+#   sua página; em caso de falha, re-renderiza o formulário de criação.
+def create<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="http://docs.seattlerb.org/flay/" target="_blank"><b>DuplicateCode</b></a>        </span>      </div>      <span>Similar code found in 14 nodes</span>              <span>Locations:</span>                  <a href="campo_forms_controller.html#L42" class="js-smell-location">0</a>                  <a href="campos_controller.html#L42" class="js-smell-location">1</a>                  <a href="cursos_controller.html#L41" class="js-smell-location">2</a>                  <a href="departamentos_controller.html#L42" class="js-smell-location">3</a>                  <a href="discentes_controller.html#L42" class="js-smell-location">4</a>                  <a href="disciplinas_controller.html#L42" class="js-smell-location">5</a>                  <a href="docentes_controller.html#L42" class="js-smell-location">6</a>                  <a href="elemento_forms_controller.html#L42" class="js-smell-location">7</a>                  <a href="elementos_controller.html#L41" class="js-smell-location">8</a>                  <a href="formularios_controller.html#L41" class="js-smell-location">9</a>                  <a href="resposta_elems_controller.html#L42" class="js-smell-location">10</a>                  <a href="resposta_forms_controller.html#L42" class="js-smell-location">11</a>                  <a href="turmas_controller.html#L41" class="js-smell-location">12</a>                  <a href="usuarios_controller.html#L144" class="js-smell-location">13</a>                  </div>  </li>  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Too-Many-Statements.md" target="_blank"><b>TooManyStatements</b></a>        </span>      </div>      <span>DocentesController#create has approx 10 statements</span>          </div>  </li></ol>
+  @docente = Docente.new(docente_params)
+
+  respond_to do |format|
+    if @docente.save
+      format.html { redirect_to @docente, notice: &quot;Docente was successfully created.&quot; }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>DocentesController#create calls 'format.html' 2 times</span>              <span>Locations:</span>                  <a href="docentes_controller.html#L47" class="js-smell-location">0</a>                  <a href="docentes_controller.html#L50" class="js-smell-location">1</a>                  </div>  </li></ol>
+      format.json { render :show, status: :created, location: @docente }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>DocentesController#create calls 'format.json' 2 times</span>              <span>Locations:</span>                  <a href="docentes_controller.html#L48" class="js-smell-location">0</a>                  <a href="docentes_controller.html#L51" class="js-smell-location">1</a>                  </div>  </li></ol>
+    else
+      format.html { render :new, status: :unprocessable_content }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>DocentesController#create calls 'format.html' 2 times</span>              <span>Locations:</span>                  <a href="docentes_controller.html#L47" class="js-smell-location">0</a>                  <a href="docentes_controller.html#L50" class="js-smell-location">1</a>                  </div>  </li></ol>
+      format.json { render json: @docente.errors, status: :unprocessable_content }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>DocentesController#create calls 'format.json' 2 times</span>              <span>Locations:</span>                  <a href="docentes_controller.html#L48" class="js-smell-location">0</a>                  <a href="docentes_controller.html#L51" class="js-smell-location">1</a>                  </div>  </li></ol>
+    end
+  end
+end
+
+# Atualiza os dados de um docente existente.
+#
+# @return [void]
+# @note Persiste as alterações no banco de dados. Em caso de sucesso, redireciona para
+#   a página do docente; em caso de falha, re-renderiza o formulário de edição.
+def update<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="http://docs.seattlerb.org/flay/" target="_blank"><b>DuplicateCode</b></a>        </span>      </div>      <span>Similar code found in 14 nodes</span>              <span>Locations:</span>                  <a href="campo_forms_controller.html#L61" class="js-smell-location">0</a>                  <a href="campos_controller.html#L61" class="js-smell-location">1</a>                  <a href="cursos_controller.html#L60" class="js-smell-location">2</a>                  <a href="departamentos_controller.html#L61" class="js-smell-location">3</a>                  <a href="discentes_controller.html#L61" class="js-smell-location">4</a>                  <a href="disciplinas_controller.html#L61" class="js-smell-location">5</a>                  <a href="docentes_controller.html#L61" class="js-smell-location">6</a>                  <a href="elemento_forms_controller.html#L61" class="js-smell-location">7</a>                  <a href="elementos_controller.html#L60" class="js-smell-location">8</a>                  <a href="formularios_controller.html#L60" class="js-smell-location">9</a>                  <a href="resposta_elems_controller.html#L61" class="js-smell-location">10</a>                  <a href="resposta_forms_controller.html#L61" class="js-smell-location">11</a>                  <a href="turmas_controller.html#L60" class="js-smell-location">12</a>                  <a href="usuarios_controller.html#L163" class="js-smell-location">13</a>                  </div>  </li>  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Too-Many-Statements.md" target="_blank"><b>TooManyStatements</b></a>        </span>      </div>      <span>DocentesController#update has approx 9 statements</span>          </div>  </li></ol>
+  respond_to do |format|
+    if @docente.update(docente_params)
+      format.html { redirect_to @docente, notice: &quot;Docente was successfully updated.&quot;, status: :see_other }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>DocentesController#update calls 'format.html' 2 times</span>              <span>Locations:</span>                  <a href="docentes_controller.html#L64" class="js-smell-location">0</a>                  <a href="docentes_controller.html#L67" class="js-smell-location">1</a>                  </div>  </li></ol>
+      format.json { render :show, status: :ok, location: @docente }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>DocentesController#update calls 'format.json' 2 times</span>              <span>Locations:</span>                  <a href="docentes_controller.html#L65" class="js-smell-location">0</a>                  <a href="docentes_controller.html#L68" class="js-smell-location">1</a>                  </div>  </li></ol>
+    else
+      format.html { render :edit, status: :unprocessable_content }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>DocentesController#update calls 'format.html' 2 times</span>              <span>Locations:</span>                  <a href="docentes_controller.html#L64" class="js-smell-location">0</a>                  <a href="docentes_controller.html#L67" class="js-smell-location">1</a>                  </div>  </li></ol>
+      format.json { render json: @docente.errors, status: :unprocessable_content }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>DocentesController#update calls 'format.json' 2 times</span>              <span>Locations:</span>                  <a href="docentes_controller.html#L65" class="js-smell-location">0</a>                  <a href="docentes_controller.html#L68" class="js-smell-location">1</a>                  </div>  </li></ol>
+    end
+  end
+end
+
+# Remove permanentemente um docente do banco de dados.
+#
+# @return [void]
+# @note Redireciona para a lista de docentes após a exclusão.
+def destroy<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="http://docs.seattlerb.org/flay/" target="_blank"><b>DuplicateCode</b></a>        </span>      </div>      <span>Similar code found in 14 nodes</span>              <span>Locations:</span>                  <a href="campo_forms_controller.html#L77" class="js-smell-location">0</a>                  <a href="campos_controller.html#L77" class="js-smell-location">1</a>                  <a href="cursos_controller.html#L76" class="js-smell-location">2</a>                  <a href="departamentos_controller.html#L77" class="js-smell-location">3</a>                  <a href="discentes_controller.html#L77" class="js-smell-location">4</a>                  <a href="disciplinas_controller.html#L77" class="js-smell-location">5</a>                  <a href="docentes_controller.html#L77" class="js-smell-location">6</a>                  <a href="elemento_forms_controller.html#L77" class="js-smell-location">7</a>                  <a href="elementos_controller.html#L76" class="js-smell-location">8</a>                  <a href="formularios_controller.html#L76" class="js-smell-location">9</a>                  <a href="resposta_elems_controller.html#L77" class="js-smell-location">10</a>                  <a href="resposta_forms_controller.html#L77" class="js-smell-location">11</a>                  <a href="turmas_controller.html#L76" class="js-smell-location">12</a>                  <a href="usuarios_controller.html#L179" class="js-smell-location">13</a>                  </div>  </li>  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Too-Many-Statements.md" target="_blank"><b>TooManyStatements</b></a>        </span>      </div>      <span>DocentesController#destroy has approx 6 statements</span>          </div>  </li></ol>
+  @docente.destroy!
+
+  respond_to do |format|
+    format.html { redirect_to docentes_path, notice: &quot;Docente was successfully destroyed.&quot;, status: :see_other }
+    format.json { head :no_content }
+  end
+end
+
+private
+
+# Busca o docente pelo +:id+ da rota e o atribui a +@docente+.
+#
+# @return [void]
+def set_docente
+  @docente = Docente.find(params.expect(:id))
+end
+
+# Filtra os parâmetros permitidos para criação/atualização de docente.
+#
+# @return [ActionController::Parameters] parâmetros filtrados do docente
+def docente_params
+  params.expect(docente: [ :matricula, :email, :nome, :formacao ])
+end
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/app/controllers/elemento_forms_controller_html.html b/doc/tmp/rubycritic/app/controllers/elemento_forms_controller_html.html new file mode 100644 index 0000000000..46248001ef --- /dev/null +++ b/doc/tmp/rubycritic/app/controllers/elemento_forms_controller_html.html @@ -0,0 +1,1849 @@ + + + + + + + +elemento_forms_controller.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-06-29 19:51:36 -0300'>2026-06-29 19:51:36 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>app/controllers /</small> elemento_forms_controller.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating f big">
+            F
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">101</span><small> lines of codes</small></div>
+            <div><span class="metric">9</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">6.0</span><small> complexity/method</small></div>
+            <div><span class="metric">5</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">53.58</span><small> complexity</small></div>
+            <div><span class="metric">122</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              11
+              smells
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code"># Gerencia o CRUD de elementos instanciados em formulários de avaliação.
+ +

# # ElementoForm é a representação de uma questão dentro de um Formulario # concreto, criada a partir de um Elemento de template no momento do envio da # avaliação. Este controller expõe as operações individuais de CRUD sobre essas # instâncias. class ElementoFormsController &lt; ApplicationController<ol class=“nocode errors smells”> <li> <div class=“description”> <div class=“heading”> <span> <i class=“fa fa-warning” aria-hidden=“true”></i> <a href=“github.com/troessner/reek/blob/master/docs/Instance-Variable-Assumption.md” target=“_blank”>InstanceVariableAssumption</a> </span> </div> <span>ElementoFormsController assumes too much for instance variable ‘@elemento_form’</span> </div> </li></ol>

+ +
before_action :require_login
+before_action :set_elemento_form, only: %i[ show edit update destroy ]
+
+# Lista todos os elementos de formulário cadastrados.
+#
+# @return [void]
+def index
+  @elemento_forms = ElementoForm.all
+end
+
+# Exibe os detalhes de um elemento de formulário específico.
+#
+# @return [void]
+def show
+end
+
+# Exibe o formulário de criação de novo elemento de formulário.
+#
+# @return [void]
+def new
+  @elemento_form = ElementoForm.new
+end
+
+# Exibe o formulário de edição de um elemento de formulário existente.
+#
+# @return [void]
+def edit
+end
+
+# Cria um novo elemento de formulário com os parâmetros permitidos.
+#
+# @return [void]
+# @note Persiste o elemento de formulário no banco de dados. Em caso de sucesso,
+#   redireciona para a sua página; em caso de falha, re-renderiza o formulário de criação.
+def create<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="http://docs.seattlerb.org/flay/" target="_blank"><b>DuplicateCode</b></a>        </span>      </div>      <span>Similar code found in 14 nodes</span>              <span>Locations:</span>                  <a href="campo_forms_controller.html#L42" class="js-smell-location">0</a>                  <a href="campos_controller.html#L42" class="js-smell-location">1</a>                  <a href="cursos_controller.html#L41" class="js-smell-location">2</a>                  <a href="departamentos_controller.html#L42" class="js-smell-location">3</a>                  <a href="discentes_controller.html#L42" class="js-smell-location">4</a>                  <a href="disciplinas_controller.html#L42" class="js-smell-location">5</a>                  <a href="docentes_controller.html#L42" class="js-smell-location">6</a>                  <a href="elemento_forms_controller.html#L42" class="js-smell-location">7</a>                  <a href="elementos_controller.html#L41" class="js-smell-location">8</a>                  <a href="formularios_controller.html#L41" class="js-smell-location">9</a>                  <a href="resposta_elems_controller.html#L42" class="js-smell-location">10</a>                  <a href="resposta_forms_controller.html#L42" class="js-smell-location">11</a>                  <a href="turmas_controller.html#L41" class="js-smell-location">12</a>                  <a href="usuarios_controller.html#L144" class="js-smell-location">13</a>                  </div>  </li>  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Too-Many-Statements.md" target="_blank"><b>TooManyStatements</b></a>        </span>      </div>      <span>ElementoFormsController#create has approx 10 statements</span>          </div>  </li></ol>
+  @elemento_form = ElementoForm.new(elemento_form_params)
+
+  respond_to do |format|
+    if @elemento_form.save
+      format.html { redirect_to @elemento_form, notice: &quot;Elemento form was successfully created.&quot; }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>ElementoFormsController#create calls 'format.html' 2 times</span>              <span>Locations:</span>                  <a href="elemento_forms_controller.html#L47" class="js-smell-location">0</a>                  <a href="elemento_forms_controller.html#L50" class="js-smell-location">1</a>                  </div>  </li></ol>
+      format.json { render :show, status: :created, location: @elemento_form }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>ElementoFormsController#create calls 'format.json' 2 times</span>              <span>Locations:</span>                  <a href="elemento_forms_controller.html#L48" class="js-smell-location">0</a>                  <a href="elemento_forms_controller.html#L51" class="js-smell-location">1</a>                  </div>  </li></ol>
+    else
+      format.html { render :new, status: :unprocessable_content }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>ElementoFormsController#create calls 'format.html' 2 times</span>              <span>Locations:</span>                  <a href="elemento_forms_controller.html#L47" class="js-smell-location">0</a>                  <a href="elemento_forms_controller.html#L50" class="js-smell-location">1</a>                  </div>  </li></ol>
+      format.json { render json: @elemento_form.errors, status: :unprocessable_content }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>ElementoFormsController#create calls 'format.json' 2 times</span>              <span>Locations:</span>                  <a href="elemento_forms_controller.html#L48" class="js-smell-location">0</a>                  <a href="elemento_forms_controller.html#L51" class="js-smell-location">1</a>                  </div>  </li></ol>
+    end
+  end
+end
+
+# Atualiza os dados de um elemento de formulário existente.
+#
+# @return [void]
+# @note Persiste as alterações no banco de dados. Em caso de sucesso, redireciona para
+#   a página do elemento de formulário; em caso de falha, re-renderiza o formulário de edição.
+def update<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="http://docs.seattlerb.org/flay/" target="_blank"><b>DuplicateCode</b></a>        </span>      </div>      <span>Similar code found in 14 nodes</span>              <span>Locations:</span>                  <a href="campo_forms_controller.html#L61" class="js-smell-location">0</a>                  <a href="campos_controller.html#L61" class="js-smell-location">1</a>                  <a href="cursos_controller.html#L60" class="js-smell-location">2</a>                  <a href="departamentos_controller.html#L61" class="js-smell-location">3</a>                  <a href="discentes_controller.html#L61" class="js-smell-location">4</a>                  <a href="disciplinas_controller.html#L61" class="js-smell-location">5</a>                  <a href="docentes_controller.html#L61" class="js-smell-location">6</a>                  <a href="elemento_forms_controller.html#L61" class="js-smell-location">7</a>                  <a href="elementos_controller.html#L60" class="js-smell-location">8</a>                  <a href="formularios_controller.html#L60" class="js-smell-location">9</a>                  <a href="resposta_elems_controller.html#L61" class="js-smell-location">10</a>                  <a href="resposta_forms_controller.html#L61" class="js-smell-location">11</a>                  <a href="turmas_controller.html#L60" class="js-smell-location">12</a>                  <a href="usuarios_controller.html#L163" class="js-smell-location">13</a>                  </div>  </li>  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Too-Many-Statements.md" target="_blank"><b>TooManyStatements</b></a>        </span>      </div>      <span>ElementoFormsController#update has approx 9 statements</span>          </div>  </li></ol>
+  respond_to do |format|
+    if @elemento_form.update(elemento_form_params)
+      format.html { redirect_to @elemento_form, notice: &quot;Elemento form was successfully updated.&quot;, status: :see_other }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>ElementoFormsController#update calls 'format.html' 2 times</span>              <span>Locations:</span>                  <a href="elemento_forms_controller.html#L64" class="js-smell-location">0</a>                  <a href="elemento_forms_controller.html#L67" class="js-smell-location">1</a>                  </div>  </li></ol>
+      format.json { render :show, status: :ok, location: @elemento_form }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>ElementoFormsController#update calls 'format.json' 2 times</span>              <span>Locations:</span>                  <a href="elemento_forms_controller.html#L65" class="js-smell-location">0</a>                  <a href="elemento_forms_controller.html#L68" class="js-smell-location">1</a>                  </div>  </li></ol>
+    else
+      format.html { render :edit, status: :unprocessable_content }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>ElementoFormsController#update calls 'format.html' 2 times</span>              <span>Locations:</span>                  <a href="elemento_forms_controller.html#L64" class="js-smell-location">0</a>                  <a href="elemento_forms_controller.html#L67" class="js-smell-location">1</a>                  </div>  </li></ol>
+      format.json { render json: @elemento_form.errors, status: :unprocessable_content }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>ElementoFormsController#update calls 'format.json' 2 times</span>              <span>Locations:</span>                  <a href="elemento_forms_controller.html#L65" class="js-smell-location">0</a>                  <a href="elemento_forms_controller.html#L68" class="js-smell-location">1</a>                  </div>  </li></ol>
+    end
+  end
+end
+
+# Remove permanentemente um elemento de formulário do banco de dados.
+#
+# @return [void]
+# @note Redireciona para a lista de elementos de formulário após a exclusão.
+def destroy<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="http://docs.seattlerb.org/flay/" target="_blank"><b>DuplicateCode</b></a>        </span>      </div>      <span>Similar code found in 14 nodes</span>              <span>Locations:</span>                  <a href="campo_forms_controller.html#L77" class="js-smell-location">0</a>                  <a href="campos_controller.html#L77" class="js-smell-location">1</a>                  <a href="cursos_controller.html#L76" class="js-smell-location">2</a>                  <a href="departamentos_controller.html#L77" class="js-smell-location">3</a>                  <a href="discentes_controller.html#L77" class="js-smell-location">4</a>                  <a href="disciplinas_controller.html#L77" class="js-smell-location">5</a>                  <a href="docentes_controller.html#L77" class="js-smell-location">6</a>                  <a href="elemento_forms_controller.html#L77" class="js-smell-location">7</a>                  <a href="elementos_controller.html#L76" class="js-smell-location">8</a>                  <a href="formularios_controller.html#L76" class="js-smell-location">9</a>                  <a href="resposta_elems_controller.html#L77" class="js-smell-location">10</a>                  <a href="resposta_forms_controller.html#L77" class="js-smell-location">11</a>                  <a href="turmas_controller.html#L76" class="js-smell-location">12</a>                  <a href="usuarios_controller.html#L179" class="js-smell-location">13</a>                  </div>  </li>  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Too-Many-Statements.md" target="_blank"><b>TooManyStatements</b></a>        </span>      </div>      <span>ElementoFormsController#destroy has approx 6 statements</span>          </div>  </li></ol>
+  @elemento_form.destroy!
+
+  respond_to do |format|
+    format.html { redirect_to elemento_forms_path, notice: &quot;Elemento form was successfully destroyed.&quot;, status: :see_other }
+    format.json { head :no_content }
+  end
+end
+
+private
+
+# Busca o elemento de formulário pelo +:id+ da rota e o atribui a +@elemento_form+.
+#
+# @return [void]
+def set_elemento_form
+  @elemento_form = ElementoForm.find(params.expect(:id))
+end
+
+# Filtra os parâmetros permitidos para criação/atualização de elemento de formulário.
+#
+# @return [ActionController::Parameters] parâmetros filtrados do elemento de formulário
+def elemento_form_params
+  params.expect(elemento_form: [ :ordem, :enunciado, :formulario_id ])
+end
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/app/controllers/elementos_controller_html.html b/doc/tmp/rubycritic/app/controllers/elementos_controller_html.html new file mode 100644 index 0000000000..b80fdd9daf --- /dev/null +++ b/doc/tmp/rubycritic/app/controllers/elementos_controller_html.html @@ -0,0 +1,1849 @@ + + + + + + + +elementos_controller.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-06-29 19:51:36 -0300'>2026-06-29 19:51:36 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>app/controllers /</small> elementos_controller.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating f big">
+            F
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">100</span><small> lines of codes</small></div>
+            <div><span class="metric">9</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">6.0</span><small> complexity/method</small></div>
+            <div><span class="metric">5</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">53.58</span><small> complexity</small></div>
+            <div><span class="metric">122</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              11
+              smells
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code"># Gerencia o CRUD de elementos (questões) de templates de avaliação.
+ +

# # Elementos são as questões que compõem um template. Normalmente são criados e # editados de forma encadeada via nested attributes no TemplatesController; este # controller expõe as operações individuais de CRUD para cada elemento. class ElementosController &lt; ApplicationController<ol class=“nocode errors smells”> <li> <div class=“description”> <div class=“heading”> <span> <i class=“fa fa-warning” aria-hidden=“true”></i> <a href=“github.com/troessner/reek/blob/master/docs/Instance-Variable-Assumption.md” target=“_blank”>InstanceVariableAssumption</a> </span> </div> <span>ElementosController assumes too much for instance variable ‘@elemento’</span> </div> </li></ol>

+ +
before_action :require_login
+before_action :set_elemento, only: %i[ show edit update destroy ]
+
+# Lista todos os elementos cadastrados.
+#
+# @return [void]
+def index
+  @elementos = Elemento.all
+end
+
+# Exibe os detalhes de um elemento específico.
+#
+# @return [void]
+def show
+end
+
+# Exibe o formulário de criação de novo elemento.
+#
+# @return [void]
+def new
+  @elemento = Elemento.new
+end
+
+# Exibe o formulário de edição de um elemento existente.
+#
+# @return [void]
+def edit
+end
+
+# Cria um novo elemento com os parâmetros permitidos.
+#
+# @return [void]
+# @note Persiste o elemento no banco de dados. Em caso de sucesso, redireciona para a
+#   página do elemento; em caso de falha, re-renderiza o formulário de criação.
+def create<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="http://docs.seattlerb.org/flay/" target="_blank"><b>DuplicateCode</b></a>        </span>      </div>      <span>Similar code found in 14 nodes</span>              <span>Locations:</span>                  <a href="campo_forms_controller.html#L42" class="js-smell-location">0</a>                  <a href="campos_controller.html#L42" class="js-smell-location">1</a>                  <a href="cursos_controller.html#L41" class="js-smell-location">2</a>                  <a href="departamentos_controller.html#L42" class="js-smell-location">3</a>                  <a href="discentes_controller.html#L42" class="js-smell-location">4</a>                  <a href="disciplinas_controller.html#L42" class="js-smell-location">5</a>                  <a href="docentes_controller.html#L42" class="js-smell-location">6</a>                  <a href="elemento_forms_controller.html#L42" class="js-smell-location">7</a>                  <a href="elementos_controller.html#L41" class="js-smell-location">8</a>                  <a href="formularios_controller.html#L41" class="js-smell-location">9</a>                  <a href="resposta_elems_controller.html#L42" class="js-smell-location">10</a>                  <a href="resposta_forms_controller.html#L42" class="js-smell-location">11</a>                  <a href="turmas_controller.html#L41" class="js-smell-location">12</a>                  <a href="usuarios_controller.html#L144" class="js-smell-location">13</a>                  </div>  </li>  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Too-Many-Statements.md" target="_blank"><b>TooManyStatements</b></a>        </span>      </div>      <span>ElementosController#create has approx 10 statements</span>          </div>  </li></ol>
+  @elemento = Elemento.new(elemento_params)
+
+  respond_to do |format|
+    if @elemento.save
+      format.html { redirect_to @elemento, notice: &quot;Elemento was successfully created.&quot; }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>ElementosController#create calls 'format.html' 2 times</span>              <span>Locations:</span>                  <a href="elementos_controller.html#L46" class="js-smell-location">0</a>                  <a href="elementos_controller.html#L49" class="js-smell-location">1</a>                  </div>  </li></ol>
+      format.json { render :show, status: :created, location: @elemento }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>ElementosController#create calls 'format.json' 2 times</span>              <span>Locations:</span>                  <a href="elementos_controller.html#L47" class="js-smell-location">0</a>                  <a href="elementos_controller.html#L50" class="js-smell-location">1</a>                  </div>  </li></ol>
+    else
+      format.html { render :new, status: :unprocessable_content }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>ElementosController#create calls 'format.html' 2 times</span>              <span>Locations:</span>                  <a href="elementos_controller.html#L46" class="js-smell-location">0</a>                  <a href="elementos_controller.html#L49" class="js-smell-location">1</a>                  </div>  </li></ol>
+      format.json { render json: @elemento.errors, status: :unprocessable_content }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>ElementosController#create calls 'format.json' 2 times</span>              <span>Locations:</span>                  <a href="elementos_controller.html#L47" class="js-smell-location">0</a>                  <a href="elementos_controller.html#L50" class="js-smell-location">1</a>                  </div>  </li></ol>
+    end
+  end
+end
+
+# Atualiza os dados de um elemento existente.
+#
+# @return [void]
+# @note Persiste as alterações no banco de dados. Em caso de sucesso, redireciona para
+#   a página do elemento; em caso de falha, re-renderiza o formulário de edição.
+def update<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="http://docs.seattlerb.org/flay/" target="_blank"><b>DuplicateCode</b></a>        </span>      </div>      <span>Similar code found in 14 nodes</span>              <span>Locations:</span>                  <a href="campo_forms_controller.html#L61" class="js-smell-location">0</a>                  <a href="campos_controller.html#L61" class="js-smell-location">1</a>                  <a href="cursos_controller.html#L60" class="js-smell-location">2</a>                  <a href="departamentos_controller.html#L61" class="js-smell-location">3</a>                  <a href="discentes_controller.html#L61" class="js-smell-location">4</a>                  <a href="disciplinas_controller.html#L61" class="js-smell-location">5</a>                  <a href="docentes_controller.html#L61" class="js-smell-location">6</a>                  <a href="elemento_forms_controller.html#L61" class="js-smell-location">7</a>                  <a href="elementos_controller.html#L60" class="js-smell-location">8</a>                  <a href="formularios_controller.html#L60" class="js-smell-location">9</a>                  <a href="resposta_elems_controller.html#L61" class="js-smell-location">10</a>                  <a href="resposta_forms_controller.html#L61" class="js-smell-location">11</a>                  <a href="turmas_controller.html#L60" class="js-smell-location">12</a>                  <a href="usuarios_controller.html#L163" class="js-smell-location">13</a>                  </div>  </li>  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Too-Many-Statements.md" target="_blank"><b>TooManyStatements</b></a>        </span>      </div>      <span>ElementosController#update has approx 9 statements</span>          </div>  </li></ol>
+  respond_to do |format|
+    if @elemento.update(elemento_params)
+      format.html { redirect_to @elemento, notice: &quot;Elemento was successfully updated.&quot;, status: :see_other }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>ElementosController#update calls 'format.html' 2 times</span>              <span>Locations:</span>                  <a href="elementos_controller.html#L63" class="js-smell-location">0</a>                  <a href="elementos_controller.html#L66" class="js-smell-location">1</a>                  </div>  </li></ol>
+      format.json { render :show, status: :ok, location: @elemento }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>ElementosController#update calls 'format.json' 2 times</span>              <span>Locations:</span>                  <a href="elementos_controller.html#L64" class="js-smell-location">0</a>                  <a href="elementos_controller.html#L67" class="js-smell-location">1</a>                  </div>  </li></ol>
+    else
+      format.html { render :edit, status: :unprocessable_content }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>ElementosController#update calls 'format.html' 2 times</span>              <span>Locations:</span>                  <a href="elementos_controller.html#L63" class="js-smell-location">0</a>                  <a href="elementos_controller.html#L66" class="js-smell-location">1</a>                  </div>  </li></ol>
+      format.json { render json: @elemento.errors, status: :unprocessable_content }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>ElementosController#update calls 'format.json' 2 times</span>              <span>Locations:</span>                  <a href="elementos_controller.html#L64" class="js-smell-location">0</a>                  <a href="elementos_controller.html#L67" class="js-smell-location">1</a>                  </div>  </li></ol>
+    end
+  end
+end
+
+# Remove permanentemente um elemento do banco de dados.
+#
+# @return [void]
+# @note Redireciona para a lista de elementos após a exclusão.
+def destroy<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="http://docs.seattlerb.org/flay/" target="_blank"><b>DuplicateCode</b></a>        </span>      </div>      <span>Similar code found in 14 nodes</span>              <span>Locations:</span>                  <a href="campo_forms_controller.html#L77" class="js-smell-location">0</a>                  <a href="campos_controller.html#L77" class="js-smell-location">1</a>                  <a href="cursos_controller.html#L76" class="js-smell-location">2</a>                  <a href="departamentos_controller.html#L77" class="js-smell-location">3</a>                  <a href="discentes_controller.html#L77" class="js-smell-location">4</a>                  <a href="disciplinas_controller.html#L77" class="js-smell-location">5</a>                  <a href="docentes_controller.html#L77" class="js-smell-location">6</a>                  <a href="elemento_forms_controller.html#L77" class="js-smell-location">7</a>                  <a href="elementos_controller.html#L76" class="js-smell-location">8</a>                  <a href="formularios_controller.html#L76" class="js-smell-location">9</a>                  <a href="resposta_elems_controller.html#L77" class="js-smell-location">10</a>                  <a href="resposta_forms_controller.html#L77" class="js-smell-location">11</a>                  <a href="turmas_controller.html#L76" class="js-smell-location">12</a>                  <a href="usuarios_controller.html#L179" class="js-smell-location">13</a>                  </div>  </li>  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Too-Many-Statements.md" target="_blank"><b>TooManyStatements</b></a>        </span>      </div>      <span>ElementosController#destroy has approx 6 statements</span>          </div>  </li></ol>
+  @elemento.destroy!
+
+  respond_to do |format|
+    format.html { redirect_to elementos_path, notice: &quot;Elemento was successfully destroyed.&quot;, status: :see_other }
+    format.json { head :no_content }
+  end
+end
+
+private
+
+# Busca o elemento pelo +:id+ da rota e o atribui a +@elemento+.
+#
+# @return [void]
+def set_elemento
+  @elemento = Elemento.find(params.expect(:id))
+end
+
+# Filtra os parâmetros permitidos para criação/atualização de elemento.
+#
+# @return [ActionController::Parameters] parâmetros filtrados do elemento
+def elemento_params
+  params.expect(elemento: [ :ordem, :enunciado, :template_id ])
+end
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/app/controllers/formularios_controller_html.html b/doc/tmp/rubycritic/app/controllers/formularios_controller_html.html new file mode 100644 index 0000000000..493b7aa755 --- /dev/null +++ b/doc/tmp/rubycritic/app/controllers/formularios_controller_html.html @@ -0,0 +1,1849 @@ + + + + + + + +formularios_controller.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-06-29 19:51:36 -0300'>2026-06-29 19:51:36 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>app/controllers /</small> formularios_controller.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating f big">
+            F
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">100</span><small> lines of codes</small></div>
+            <div><span class="metric">9</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">6.0</span><small> complexity/method</small></div>
+            <div><span class="metric">5</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">53.58</span><small> complexity</small></div>
+            <div><span class="metric">122</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              11
+              smells
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code"># Gerencia o CRUD de formulários de avaliação.
+ +

# # Formulários são instâncias de avaliação enviadas a turmas específicas, geradas # a partir de templates pelo AdminController. Este controller oferece as operações # básicas de listagem, visualização, criação, edição e exclusão de formulários. class FormulariosController &lt; ApplicationController<ol class=“nocode errors smells”> <li> <div class=“description”> <div class=“heading”> <span> <i class=“fa fa-warning” aria-hidden=“true”></i> <a href=“github.com/troessner/reek/blob/master/docs/Instance-Variable-Assumption.md” target=“_blank”>InstanceVariableAssumption</a> </span> </div> <span>FormulariosController assumes too much for instance variable ‘@formulario’</span> </div> </li></ol>

+ +
before_action :require_login
+before_action :set_formulario, only: %i[ show edit update destroy ]
+
+# Lista todos os formulários cadastrados.
+#
+# @return [void]
+def index
+  @formularios = Formulario.all
+end
+
+# Exibe os detalhes de um formulário específico.
+#
+# @return [void]
+def show
+end
+
+# Exibe o formulário de criação de novo formulário.
+#
+# @return [void]
+def new
+  @formulario = Formulario.new
+end
+
+# Exibe o formulário de edição de um formulário existente.
+#
+# @return [void]
+def edit
+end
+
+# Cria um novo formulário com os parâmetros permitidos.
+#
+# @return [void]
+# @note Persiste o formulário no banco de dados. Em caso de sucesso, redireciona para
+#   a página do formulário; em caso de falha, re-renderiza o formulário de criação.
+def create<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="http://docs.seattlerb.org/flay/" target="_blank"><b>DuplicateCode</b></a>        </span>      </div>      <span>Similar code found in 14 nodes</span>              <span>Locations:</span>                  <a href="campo_forms_controller.html#L42" class="js-smell-location">0</a>                  <a href="campos_controller.html#L42" class="js-smell-location">1</a>                  <a href="cursos_controller.html#L41" class="js-smell-location">2</a>                  <a href="departamentos_controller.html#L42" class="js-smell-location">3</a>                  <a href="discentes_controller.html#L42" class="js-smell-location">4</a>                  <a href="disciplinas_controller.html#L42" class="js-smell-location">5</a>                  <a href="docentes_controller.html#L42" class="js-smell-location">6</a>                  <a href="elemento_forms_controller.html#L42" class="js-smell-location">7</a>                  <a href="elementos_controller.html#L41" class="js-smell-location">8</a>                  <a href="formularios_controller.html#L41" class="js-smell-location">9</a>                  <a href="resposta_elems_controller.html#L42" class="js-smell-location">10</a>                  <a href="resposta_forms_controller.html#L42" class="js-smell-location">11</a>                  <a href="turmas_controller.html#L41" class="js-smell-location">12</a>                  <a href="usuarios_controller.html#L144" class="js-smell-location">13</a>                  </div>  </li>  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Too-Many-Statements.md" target="_blank"><b>TooManyStatements</b></a>        </span>      </div>      <span>FormulariosController#create has approx 10 statements</span>          </div>  </li></ol>
+  @formulario = Formulario.new(formulario_params)
+
+  respond_to do |format|
+    if @formulario.save
+      format.html { redirect_to @formulario, notice: &quot;Formulario was successfully created.&quot; }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>FormulariosController#create calls 'format.html' 2 times</span>              <span>Locations:</span>                  <a href="formularios_controller.html#L46" class="js-smell-location">0</a>                  <a href="formularios_controller.html#L49" class="js-smell-location">1</a>                  </div>  </li></ol>
+      format.json { render :show, status: :created, location: @formulario }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>FormulariosController#create calls 'format.json' 2 times</span>              <span>Locations:</span>                  <a href="formularios_controller.html#L47" class="js-smell-location">0</a>                  <a href="formularios_controller.html#L50" class="js-smell-location">1</a>                  </div>  </li></ol>
+    else
+      format.html { render :new, status: :unprocessable_content }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>FormulariosController#create calls 'format.html' 2 times</span>              <span>Locations:</span>                  <a href="formularios_controller.html#L46" class="js-smell-location">0</a>                  <a href="formularios_controller.html#L49" class="js-smell-location">1</a>                  </div>  </li></ol>
+      format.json { render json: @formulario.errors, status: :unprocessable_content }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>FormulariosController#create calls 'format.json' 2 times</span>              <span>Locations:</span>                  <a href="formularios_controller.html#L47" class="js-smell-location">0</a>                  <a href="formularios_controller.html#L50" class="js-smell-location">1</a>                  </div>  </li></ol>
+    end
+  end
+end
+
+# Atualiza os dados de um formulário existente.
+#
+# @return [void]
+# @note Persiste as alterações no banco de dados. Em caso de sucesso, redireciona para
+#   a página do formulário; em caso de falha, re-renderiza o formulário de edição.
+def update<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="http://docs.seattlerb.org/flay/" target="_blank"><b>DuplicateCode</b></a>        </span>      </div>      <span>Similar code found in 14 nodes</span>              <span>Locations:</span>                  <a href="campo_forms_controller.html#L61" class="js-smell-location">0</a>                  <a href="campos_controller.html#L61" class="js-smell-location">1</a>                  <a href="cursos_controller.html#L60" class="js-smell-location">2</a>                  <a href="departamentos_controller.html#L61" class="js-smell-location">3</a>                  <a href="discentes_controller.html#L61" class="js-smell-location">4</a>                  <a href="disciplinas_controller.html#L61" class="js-smell-location">5</a>                  <a href="docentes_controller.html#L61" class="js-smell-location">6</a>                  <a href="elemento_forms_controller.html#L61" class="js-smell-location">7</a>                  <a href="elementos_controller.html#L60" class="js-smell-location">8</a>                  <a href="formularios_controller.html#L60" class="js-smell-location">9</a>                  <a href="resposta_elems_controller.html#L61" class="js-smell-location">10</a>                  <a href="resposta_forms_controller.html#L61" class="js-smell-location">11</a>                  <a href="turmas_controller.html#L60" class="js-smell-location">12</a>                  <a href="usuarios_controller.html#L163" class="js-smell-location">13</a>                  </div>  </li>  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Too-Many-Statements.md" target="_blank"><b>TooManyStatements</b></a>        </span>      </div>      <span>FormulariosController#update has approx 9 statements</span>          </div>  </li></ol>
+  respond_to do |format|
+    if @formulario.update(formulario_params)
+      format.html { redirect_to @formulario, notice: &quot;Formulario was successfully updated.&quot;, status: :see_other }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>FormulariosController#update calls 'format.html' 2 times</span>              <span>Locations:</span>                  <a href="formularios_controller.html#L63" class="js-smell-location">0</a>                  <a href="formularios_controller.html#L66" class="js-smell-location">1</a>                  </div>  </li></ol>
+      format.json { render :show, status: :ok, location: @formulario }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>FormulariosController#update calls 'format.json' 2 times</span>              <span>Locations:</span>                  <a href="formularios_controller.html#L64" class="js-smell-location">0</a>                  <a href="formularios_controller.html#L67" class="js-smell-location">1</a>                  </div>  </li></ol>
+    else
+      format.html { render :edit, status: :unprocessable_content }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>FormulariosController#update calls 'format.html' 2 times</span>              <span>Locations:</span>                  <a href="formularios_controller.html#L63" class="js-smell-location">0</a>                  <a href="formularios_controller.html#L66" class="js-smell-location">1</a>                  </div>  </li></ol>
+      format.json { render json: @formulario.errors, status: :unprocessable_content }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>FormulariosController#update calls 'format.json' 2 times</span>              <span>Locations:</span>                  <a href="formularios_controller.html#L64" class="js-smell-location">0</a>                  <a href="formularios_controller.html#L67" class="js-smell-location">1</a>                  </div>  </li></ol>
+    end
+  end
+end
+
+# Remove permanentemente um formulário do banco de dados.
+#
+# @return [void]
+# @note Redireciona para a lista de formulários após a exclusão.
+def destroy<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="http://docs.seattlerb.org/flay/" target="_blank"><b>DuplicateCode</b></a>        </span>      </div>      <span>Similar code found in 14 nodes</span>              <span>Locations:</span>                  <a href="campo_forms_controller.html#L77" class="js-smell-location">0</a>                  <a href="campos_controller.html#L77" class="js-smell-location">1</a>                  <a href="cursos_controller.html#L76" class="js-smell-location">2</a>                  <a href="departamentos_controller.html#L77" class="js-smell-location">3</a>                  <a href="discentes_controller.html#L77" class="js-smell-location">4</a>                  <a href="disciplinas_controller.html#L77" class="js-smell-location">5</a>                  <a href="docentes_controller.html#L77" class="js-smell-location">6</a>                  <a href="elemento_forms_controller.html#L77" class="js-smell-location">7</a>                  <a href="elementos_controller.html#L76" class="js-smell-location">8</a>                  <a href="formularios_controller.html#L76" class="js-smell-location">9</a>                  <a href="resposta_elems_controller.html#L77" class="js-smell-location">10</a>                  <a href="resposta_forms_controller.html#L77" class="js-smell-location">11</a>                  <a href="turmas_controller.html#L76" class="js-smell-location">12</a>                  <a href="usuarios_controller.html#L179" class="js-smell-location">13</a>                  </div>  </li>  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Too-Many-Statements.md" target="_blank"><b>TooManyStatements</b></a>        </span>      </div>      <span>FormulariosController#destroy has approx 6 statements</span>          </div>  </li></ol>
+  @formulario.destroy!
+
+  respond_to do |format|
+    format.html { redirect_to formularios_path, notice: &quot;Formulario was successfully destroyed.&quot;, status: :see_other }
+    format.json { head :no_content }
+  end
+end
+
+private
+
+# Busca o formulário pelo +:id+ da rota e o atribui a +@formulario+.
+#
+# @return [void]
+def set_formulario
+  @formulario = Formulario.find(params.expect(:id))
+end
+
+# Filtra os parâmetros permitidos para criação/atualização de formulário.
+#
+# @return [ActionController::Parameters] parâmetros filtrados do formulário
+def formulario_params
+  params.expect(formulario: [ :turma_id ])
+end
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/app/controllers/home_controller_html.html b/doc/tmp/rubycritic/app/controllers/home_controller_html.html new file mode 100644 index 0000000000..3ddfcfdc94 --- /dev/null +++ b/doc/tmp/rubycritic/app/controllers/home_controller_html.html @@ -0,0 +1,1764 @@ + + + + + + + +home_controller.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-06-29 19:51:36 -0300'>2026-06-29 19:51:36 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>app/controllers /</small> home_controller.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating a big">
+            A
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">14</span><small> lines of codes</small></div>
+            <div><span class="metric">1</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">0.0</span><small> complexity/method</small></div>
+            <div><span class="metric">6</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">0.0</span><small> complexity</small></div>
+            <div><span class="metric">0</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              0
+              smell
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code"># Exibe a página inicial da aplicação após o login.
+ +

# # Requer que o usuário esteja autenticado. Serve como ponto de entrada genérico # após o redirecionamento pós-login, quando o perfil do usuário ainda não foi # determinado pelo SessionsController. class HomeController &lt; ApplicationController

+ +
before_action :require_login
+
+# Exibe a página inicial da aplicação.
+#
+# @return [void]
+def index
+end
+
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/app/controllers/redefinicao_senhas_controller_html.html b/doc/tmp/rubycritic/app/controllers/redefinicao_senhas_controller_html.html new file mode 100644 index 0000000000..047499ea54 --- /dev/null +++ b/doc/tmp/rubycritic/app/controllers/redefinicao_senhas_controller_html.html @@ -0,0 +1,1842 @@ + + + + + + + +redefinicao_senhas_controller.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-06-29 19:51:36 -0300'>2026-06-29 19:51:36 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>app/controllers /</small> redefinicao_senhas_controller.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating b big">
+            B
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">93</span><small> lines of codes</small></div>
+            <div><span class="metric">4</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">14.6</span><small> complexity/method</small></div>
+            <div><span class="metric">3</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">58.39</span><small> complexity</small></div>
+            <div><span class="metric">19</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              8
+              smells
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code"># Gerencia o fluxo de redefinição de senha para usuários que já possuem conta ativa.
+ +

# # O usuário informa seu email (new/create), recebe um link por email com token # único e utiliza esse token para acessar o formulário de nova senha (edit/update). # Após a redefinição bem-sucedida, o token é invalidado para evitar reutilização. class RedefinicaoSenhasController &lt; ApplicationController<ol class=“nocode errors smells”> <li> <div class=“description”> <div class=“heading”> <span> <i class=“fa fa-warning” aria-hidden=“true”></i> <a href=“github.com/troessner/reek/blob/master/docs/Instance-Variable-Assumption.md” target=“_blank”>InstanceVariableAssumption</a> </span> </div> <span>RedefinicaoSenhasController assumes too much for instance variable ‘@usuario’</span> </div> </li></ol>

+ +
# Exibe o formulário de solicitação de redefinição de senha.
+#
+# @return [void]
+def new
+end
+
+# Envia o email de redefinição de senha para o endereço informado.
+#
+# @return [void]
+# @note Lê o parâmetro +:email+ do formulário. Redireciona com alerta se o email
+#   estiver em branco ou não corresponder a nenhum usuário. Em caso de sucesso, dispara
+#   o envio do email de redefinição e redireciona para a página raiz.
+def create<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Too-Many-Statements.md" target="_blank"><b>TooManyStatements</b></a>        </span>      </div>      <span>RedefinicaoSenhasController#create has approx 8 statements</span>          </div>  </li></ol>
+  email = params[:email].to_s.strip
+
+  if email.blank?
+    redirect_to redefinir_senha_path, alert: &quot;Falha na redefinição de senha: informe seu email&quot;
+    return
+  end
+
+  usuario = Usuario.find_by(email: email)
+
+  if usuario.blank?
+    redirect_to redefinir_senha_path, alert: &quot;Falha na redefinição de senha: usuário não encontrado&quot;
+    return
+  end
+
+  usuario.enviar_email_redefinicao_senha!
+  redirect_to root_path, notice: &quot;Solicitação de redefinição de senha enviada.&quot;
+end
+
+# Exibe o formulário de redefinição de senha via token enviado por email.
+#
+# @return [void]
+# @note Lê o parâmetro +:token+ da rota. Redireciona para a página raiz com alerta
+#   se o token for inválido ou não corresponder a nenhum usuário.
+def edit<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="http://docs.seattlerb.org/flay/" target="_blank"><b>DuplicateCode</b></a>        </span>      </div>      <span>Similar code found in 2 nodes</span>              <span>Locations:</span>                  <a href="definicao_senhas_controller.html#L13" class="js-smell-location">0</a>                  <a href="redefinicao_senhas_controller.html#L43" class="js-smell-location">1</a>                  </div>  </li></ol>
+  @usuario = Usuario.find_by(redefinicao_senha_token: params[:token])
+
+  return if @usuario.present?
+
+  redirect_to root_path, alert: &quot;Link de redefinição de senha inválido.&quot;
+end
+
+# Persiste a nova senha para o usuário identificado pelo token de redefinição.
+#
+# @return [void]
+# @note Lê os parâmetros +:token+, +:senha+ e +:senha_confirmation+.
+#   Redireciona com alerta se o token for inválido, as senhas não conferirem ou a
+#   senha tiver menos de 6 caracteres. Em caso de sucesso, limpa o token e a data
+#   de envio, salva a nova senha no banco de dados e redireciona para a página raiz.
+def update<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="http://docs.seattlerb.org/flog/" target="_blank"><b>HighComplexity</b></a>        </span>      </div>      <span>RedefinicaoSenhasController#update has a flog score of 35</span>          </div>  </li>  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Too-Many-Statements.md" target="_blank"><b>TooManyStatements</b></a>        </span>      </div>      <span>RedefinicaoSenhasController#update has approx 18 statements</span>          </div>  </li></ol>
+  @usuario = Usuario.find_by(redefinicao_senha_token: params[:token])
+
+  if @usuario.blank?
+    redirect_to root_path, alert: &quot;Link de redefinição de senha inválido.&quot;
+    return
+  end
+
+  nova_senha = params[:senha].to_s
+  confirmacao = params[:senha_confirmation].to_s
+
+  if nova_senha != confirmacao
+    flash.now[:alert] = &quot;Falha na redefinição de senha: confirmação não confere&quot;<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>RedefinicaoSenhasController#update calls 'flash.now' 3 times</span>              <span>Locations:</span>                  <a href="redefinicao_senhas_controller.html#L70" class="js-smell-location">0</a>                  <a href="redefinicao_senhas_controller.html#L76" class="js-smell-location">1</a>                  <a href="redefinicao_senhas_controller.html#L89" class="js-smell-location">2</a>                  </div>  </li></ol>
+    render :edit, status: :unprocessable_content<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>RedefinicaoSenhasController#update calls 'render :edit, status: :unprocessable_content' 3 times</span>              <span>Locations:</span>                  <a href="redefinicao_senhas_controller.html#L71" class="js-smell-location">0</a>                  <a href="redefinicao_senhas_controller.html#L77" class="js-smell-location">1</a>                  <a href="redefinicao_senhas_controller.html#L90" class="js-smell-location">2</a>                  </div>  </li></ol>
+    return
+  end
+
+  if nova_senha.length &lt; 6
+    flash.now[:alert] = &quot;Falha na redefinição de senha: senha inválida&quot;<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>RedefinicaoSenhasController#update calls 'flash.now' 3 times</span>              <span>Locations:</span>                  <a href="redefinicao_senhas_controller.html#L70" class="js-smell-location">0</a>                  <a href="redefinicao_senhas_controller.html#L76" class="js-smell-location">1</a>                  <a href="redefinicao_senhas_controller.html#L89" class="js-smell-location">2</a>                  </div>  </li>  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>RedefinicaoSenhasController#update calls 'flash.now[:alert] = "Falha na redefinição de senha: senha inválida"' 2 times</span>              <span>Locations:</span>                  <a href="redefinicao_senhas_controller.html#L76" class="js-smell-location">0</a>                  <a href="redefinicao_senhas_controller.html#L89" class="js-smell-location">1</a>                  </div>  </li></ol>
+    render :edit, status: :unprocessable_content<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>RedefinicaoSenhasController#update calls 'render :edit, status: :unprocessable_content' 3 times</span>              <span>Locations:</span>                  <a href="redefinicao_senhas_controller.html#L71" class="js-smell-location">0</a>                  <a href="redefinicao_senhas_controller.html#L77" class="js-smell-location">1</a>                  <a href="redefinicao_senhas_controller.html#L90" class="js-smell-location">2</a>                  </div>  </li></ol>
+    return
+  end
+
+  @usuario.senha = nova_senha
+  @usuario.senha_confirmation = confirmacao
+  @usuario.redefinicao_senha_token = nil
+  @usuario.redefinicao_senha_sent_at = nil
+
+  if @usuario.save
+    redirect_to root_path, notice: &quot;Senha redefinida com sucesso.&quot;
+  else
+    flash.now[:alert] = &quot;Falha na redefinição de senha: senha inválida&quot;<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>RedefinicaoSenhasController#update calls 'flash.now' 3 times</span>              <span>Locations:</span>                  <a href="redefinicao_senhas_controller.html#L70" class="js-smell-location">0</a>                  <a href="redefinicao_senhas_controller.html#L76" class="js-smell-location">1</a>                  <a href="redefinicao_senhas_controller.html#L89" class="js-smell-location">2</a>                  </div>  </li>  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>RedefinicaoSenhasController#update calls 'flash.now[:alert] = "Falha na redefinição de senha: senha inválida"' 2 times</span>              <span>Locations:</span>                  <a href="redefinicao_senhas_controller.html#L76" class="js-smell-location">0</a>                  <a href="redefinicao_senhas_controller.html#L89" class="js-smell-location">1</a>                  </div>  </li></ol>
+    render :edit, status: :unprocessable_content<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>RedefinicaoSenhasController#update calls 'render :edit, status: :unprocessable_content' 3 times</span>              <span>Locations:</span>                  <a href="redefinicao_senhas_controller.html#L71" class="js-smell-location">0</a>                  <a href="redefinicao_senhas_controller.html#L77" class="js-smell-location">1</a>                  <a href="redefinicao_senhas_controller.html#L90" class="js-smell-location">2</a>                  </div>  </li></ol>
+  end
+end
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/app/controllers/resposta_elems_controller_html.html b/doc/tmp/rubycritic/app/controllers/resposta_elems_controller_html.html new file mode 100644 index 0000000000..a097dc2f55 --- /dev/null +++ b/doc/tmp/rubycritic/app/controllers/resposta_elems_controller_html.html @@ -0,0 +1,1849 @@ + + + + + + + +resposta_elems_controller.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-06-29 19:51:36 -0300'>2026-06-29 19:51:36 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>app/controllers /</small> resposta_elems_controller.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating f big">
+            F
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">101</span><small> lines of codes</small></div>
+            <div><span class="metric">9</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">6.0</span><small> complexity/method</small></div>
+            <div><span class="metric">5</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">53.58</span><small> complexity</small></div>
+            <div><span class="metric">122</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              11
+              smells
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code"># Gerencia o CRUD de respostas individuais a questões de formulários de avaliação.
+ +

# # Uma RespostaElem representa a resposta de um usuário a um ElementoForm # específico, vinculada a uma RespostaForm. O fluxo principal de criação ocorre # via +UsuariosController#submeter_resposta+; este controller expõe as operações # individuais de CRUD para administração direta dos registros. class RespostaElemsController &lt; ApplicationController<ol class=“nocode errors smells”> <li> <div class=“description”> <div class=“heading”> <span> <i class=“fa fa-warning” aria-hidden=“true”></i> <a href=“github.com/troessner/reek/blob/master/docs/Instance-Variable-Assumption.md” target=“_blank”>InstanceVariableAssumption</a> </span> </div> <span>RespostaElemsController assumes too much for instance variable ‘@resposta_elem’</span> </div> </li></ol>

+ +
before_action :require_login
+before_action :set_resposta_elem, only: %i[ show edit update destroy ]
+
+# Lista todas as respostas de elemento cadastradas.
+#
+# @return [void]
+def index
+  @resposta_elems = RespostaElem.all
+end
+
+# Exibe os detalhes de uma resposta de elemento específica.
+#
+# @return [void]
+def show
+end
+
+# Exibe o formulário de criação de nova resposta de elemento.
+#
+# @return [void]
+def new
+  @resposta_elem = RespostaElem.new
+end
+
+# Exibe o formulário de edição de uma resposta de elemento existente.
+#
+# @return [void]
+def edit
+end
+
+# Cria uma nova resposta de elemento com os parâmetros permitidos.
+#
+# @return [void]
+# @note Persiste a resposta no banco de dados. Em caso de sucesso, redireciona para a
+#   sua página; em caso de falha, re-renderiza o formulário de criação.
+def create<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="http://docs.seattlerb.org/flay/" target="_blank"><b>DuplicateCode</b></a>        </span>      </div>      <span>Similar code found in 14 nodes</span>              <span>Locations:</span>                  <a href="campo_forms_controller.html#L42" class="js-smell-location">0</a>                  <a href="campos_controller.html#L42" class="js-smell-location">1</a>                  <a href="cursos_controller.html#L41" class="js-smell-location">2</a>                  <a href="departamentos_controller.html#L42" class="js-smell-location">3</a>                  <a href="discentes_controller.html#L42" class="js-smell-location">4</a>                  <a href="disciplinas_controller.html#L42" class="js-smell-location">5</a>                  <a href="docentes_controller.html#L42" class="js-smell-location">6</a>                  <a href="elemento_forms_controller.html#L42" class="js-smell-location">7</a>                  <a href="elementos_controller.html#L41" class="js-smell-location">8</a>                  <a href="formularios_controller.html#L41" class="js-smell-location">9</a>                  <a href="resposta_elems_controller.html#L42" class="js-smell-location">10</a>                  <a href="resposta_forms_controller.html#L42" class="js-smell-location">11</a>                  <a href="turmas_controller.html#L41" class="js-smell-location">12</a>                  <a href="usuarios_controller.html#L144" class="js-smell-location">13</a>                  </div>  </li>  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Too-Many-Statements.md" target="_blank"><b>TooManyStatements</b></a>        </span>      </div>      <span>RespostaElemsController#create has approx 10 statements</span>          </div>  </li></ol>
+  @resposta_elem = RespostaElem.new(resposta_elem_params)
+
+  respond_to do |format|
+    if @resposta_elem.save
+      format.html { redirect_to @resposta_elem, notice: &quot;Resposta elem was successfully created.&quot; }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>RespostaElemsController#create calls 'format.html' 2 times</span>              <span>Locations:</span>                  <a href="resposta_elems_controller.html#L47" class="js-smell-location">0</a>                  <a href="resposta_elems_controller.html#L50" class="js-smell-location">1</a>                  </div>  </li></ol>
+      format.json { render :show, status: :created, location: @resposta_elem }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>RespostaElemsController#create calls 'format.json' 2 times</span>              <span>Locations:</span>                  <a href="resposta_elems_controller.html#L48" class="js-smell-location">0</a>                  <a href="resposta_elems_controller.html#L51" class="js-smell-location">1</a>                  </div>  </li></ol>
+    else
+      format.html { render :new, status: :unprocessable_content }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>RespostaElemsController#create calls 'format.html' 2 times</span>              <span>Locations:</span>                  <a href="resposta_elems_controller.html#L47" class="js-smell-location">0</a>                  <a href="resposta_elems_controller.html#L50" class="js-smell-location">1</a>                  </div>  </li></ol>
+      format.json { render json: @resposta_elem.errors, status: :unprocessable_content }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>RespostaElemsController#create calls 'format.json' 2 times</span>              <span>Locations:</span>                  <a href="resposta_elems_controller.html#L48" class="js-smell-location">0</a>                  <a href="resposta_elems_controller.html#L51" class="js-smell-location">1</a>                  </div>  </li></ol>
+    end
+  end
+end
+
+# Atualiza os dados de uma resposta de elemento existente.
+#
+# @return [void]
+# @note Persiste as alterações no banco de dados. Em caso de sucesso, redireciona para
+#   a página da resposta; em caso de falha, re-renderiza o formulário de edição.
+def update<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="http://docs.seattlerb.org/flay/" target="_blank"><b>DuplicateCode</b></a>        </span>      </div>      <span>Similar code found in 14 nodes</span>              <span>Locations:</span>                  <a href="campo_forms_controller.html#L61" class="js-smell-location">0</a>                  <a href="campos_controller.html#L61" class="js-smell-location">1</a>                  <a href="cursos_controller.html#L60" class="js-smell-location">2</a>                  <a href="departamentos_controller.html#L61" class="js-smell-location">3</a>                  <a href="discentes_controller.html#L61" class="js-smell-location">4</a>                  <a href="disciplinas_controller.html#L61" class="js-smell-location">5</a>                  <a href="docentes_controller.html#L61" class="js-smell-location">6</a>                  <a href="elemento_forms_controller.html#L61" class="js-smell-location">7</a>                  <a href="elementos_controller.html#L60" class="js-smell-location">8</a>                  <a href="formularios_controller.html#L60" class="js-smell-location">9</a>                  <a href="resposta_elems_controller.html#L61" class="js-smell-location">10</a>                  <a href="resposta_forms_controller.html#L61" class="js-smell-location">11</a>                  <a href="turmas_controller.html#L60" class="js-smell-location">12</a>                  <a href="usuarios_controller.html#L163" class="js-smell-location">13</a>                  </div>  </li>  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Too-Many-Statements.md" target="_blank"><b>TooManyStatements</b></a>        </span>      </div>      <span>RespostaElemsController#update has approx 9 statements</span>          </div>  </li></ol>
+  respond_to do |format|
+    if @resposta_elem.update(resposta_elem_params)
+      format.html { redirect_to @resposta_elem, notice: &quot;Resposta elem was successfully updated.&quot;, status: :see_other }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>RespostaElemsController#update calls 'format.html' 2 times</span>              <span>Locations:</span>                  <a href="resposta_elems_controller.html#L64" class="js-smell-location">0</a>                  <a href="resposta_elems_controller.html#L67" class="js-smell-location">1</a>                  </div>  </li></ol>
+      format.json { render :show, status: :ok, location: @resposta_elem }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>RespostaElemsController#update calls 'format.json' 2 times</span>              <span>Locations:</span>                  <a href="resposta_elems_controller.html#L65" class="js-smell-location">0</a>                  <a href="resposta_elems_controller.html#L68" class="js-smell-location">1</a>                  </div>  </li></ol>
+    else
+      format.html { render :edit, status: :unprocessable_content }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>RespostaElemsController#update calls 'format.html' 2 times</span>              <span>Locations:</span>                  <a href="resposta_elems_controller.html#L64" class="js-smell-location">0</a>                  <a href="resposta_elems_controller.html#L67" class="js-smell-location">1</a>                  </div>  </li></ol>
+      format.json { render json: @resposta_elem.errors, status: :unprocessable_content }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>RespostaElemsController#update calls 'format.json' 2 times</span>              <span>Locations:</span>                  <a href="resposta_elems_controller.html#L65" class="js-smell-location">0</a>                  <a href="resposta_elems_controller.html#L68" class="js-smell-location">1</a>                  </div>  </li></ol>
+    end
+  end
+end
+
+# Remove permanentemente uma resposta de elemento do banco de dados.
+#
+# @return [void]
+# @note Redireciona para a lista de respostas de elemento após a exclusão.
+def destroy<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="http://docs.seattlerb.org/flay/" target="_blank"><b>DuplicateCode</b></a>        </span>      </div>      <span>Similar code found in 14 nodes</span>              <span>Locations:</span>                  <a href="campo_forms_controller.html#L77" class="js-smell-location">0</a>                  <a href="campos_controller.html#L77" class="js-smell-location">1</a>                  <a href="cursos_controller.html#L76" class="js-smell-location">2</a>                  <a href="departamentos_controller.html#L77" class="js-smell-location">3</a>                  <a href="discentes_controller.html#L77" class="js-smell-location">4</a>                  <a href="disciplinas_controller.html#L77" class="js-smell-location">5</a>                  <a href="docentes_controller.html#L77" class="js-smell-location">6</a>                  <a href="elemento_forms_controller.html#L77" class="js-smell-location">7</a>                  <a href="elementos_controller.html#L76" class="js-smell-location">8</a>                  <a href="formularios_controller.html#L76" class="js-smell-location">9</a>                  <a href="resposta_elems_controller.html#L77" class="js-smell-location">10</a>                  <a href="resposta_forms_controller.html#L77" class="js-smell-location">11</a>                  <a href="turmas_controller.html#L76" class="js-smell-location">12</a>                  <a href="usuarios_controller.html#L179" class="js-smell-location">13</a>                  </div>  </li>  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Too-Many-Statements.md" target="_blank"><b>TooManyStatements</b></a>        </span>      </div>      <span>RespostaElemsController#destroy has approx 6 statements</span>          </div>  </li></ol>
+  @resposta_elem.destroy!
+
+  respond_to do |format|
+    format.html { redirect_to resposta_elems_path, notice: &quot;Resposta elem was successfully destroyed.&quot;, status: :see_other }
+    format.json { head :no_content }
+  end
+end
+
+private
+
+# Busca a resposta de elemento pelo +:id+ da rota e a atribui a +@resposta_elem+.
+#
+# @return [void]
+def set_resposta_elem
+  @resposta_elem = RespostaElem.find(params.expect(:id))
+end
+
+# Filtra os parâmetros permitidos para criação/atualização de resposta de elemento.
+#
+# @return [ActionController::Parameters] parâmetros filtrados da resposta de elemento
+def resposta_elem_params
+  params.expect(resposta_elem: [ :texto_resposta, :resposta_form_id, :elemento_form_id, :campo_form_id ])
+end
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/app/controllers/resposta_forms_controller_html.html b/doc/tmp/rubycritic/app/controllers/resposta_forms_controller_html.html new file mode 100644 index 0000000000..0820089c72 --- /dev/null +++ b/doc/tmp/rubycritic/app/controllers/resposta_forms_controller_html.html @@ -0,0 +1,1849 @@ + + + + + + + +resposta_forms_controller.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-06-29 19:51:36 -0300'>2026-06-29 19:51:36 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>app/controllers /</small> resposta_forms_controller.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating f big">
+            F
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">101</span><small> lines of codes</small></div>
+            <div><span class="metric">9</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">6.0</span><small> complexity/method</small></div>
+            <div><span class="metric">5</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">53.58</span><small> complexity</small></div>
+            <div><span class="metric">122</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              11
+              smells
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code"># Gerencia o CRUD de respostas completas submetidas por usuários a formulários.
+ +

# # Uma RespostaForm representa a submissão de um usuário a um Formulario # inteiro. O fluxo principal de submissão é tratado pelo UsuariosController; # este controller expõe as operações individuais de CRUD para administração direta # dos registros de resposta. class RespostaFormsController &lt; ApplicationController<ol class=“nocode errors smells”> <li> <div class=“description”> <div class=“heading”> <span> <i class=“fa fa-warning” aria-hidden=“true”></i> <a href=“github.com/troessner/reek/blob/master/docs/Instance-Variable-Assumption.md” target=“_blank”>InstanceVariableAssumption</a> </span> </div> <span>RespostaFormsController assumes too much for instance variable ‘@resposta_form’</span> </div> </li></ol>

+ +
before_action :require_login
+before_action :set_resposta_form, only: %i[ show edit update destroy ]
+
+# Lista todas as respostas de formulário cadastradas.
+#
+# @return [void]
+def index
+  @resposta_forms = RespostaForm.all
+end
+
+# Exibe os detalhes de uma resposta de formulário específica.
+#
+# @return [void]
+def show
+end
+
+# Exibe o formulário de criação de nova resposta de formulário.
+#
+# @return [void]
+def new
+  @resposta_form = RespostaForm.new
+end
+
+# Exibe o formulário de edição de uma resposta de formulário existente.
+#
+# @return [void]
+def edit
+end
+
+# Cria uma nova resposta de formulário com os parâmetros permitidos.
+#
+# @return [void]
+# @note Persiste a resposta no banco de dados. Em caso de sucesso, redireciona para a
+#   sua página; em caso de falha, re-renderiza o formulário de criação.
+def create<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="http://docs.seattlerb.org/flay/" target="_blank"><b>DuplicateCode</b></a>        </span>      </div>      <span>Similar code found in 14 nodes</span>              <span>Locations:</span>                  <a href="campo_forms_controller.html#L42" class="js-smell-location">0</a>                  <a href="campos_controller.html#L42" class="js-smell-location">1</a>                  <a href="cursos_controller.html#L41" class="js-smell-location">2</a>                  <a href="departamentos_controller.html#L42" class="js-smell-location">3</a>                  <a href="discentes_controller.html#L42" class="js-smell-location">4</a>                  <a href="disciplinas_controller.html#L42" class="js-smell-location">5</a>                  <a href="docentes_controller.html#L42" class="js-smell-location">6</a>                  <a href="elemento_forms_controller.html#L42" class="js-smell-location">7</a>                  <a href="elementos_controller.html#L41" class="js-smell-location">8</a>                  <a href="formularios_controller.html#L41" class="js-smell-location">9</a>                  <a href="resposta_elems_controller.html#L42" class="js-smell-location">10</a>                  <a href="resposta_forms_controller.html#L42" class="js-smell-location">11</a>                  <a href="turmas_controller.html#L41" class="js-smell-location">12</a>                  <a href="usuarios_controller.html#L144" class="js-smell-location">13</a>                  </div>  </li>  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Too-Many-Statements.md" target="_blank"><b>TooManyStatements</b></a>        </span>      </div>      <span>RespostaFormsController#create has approx 10 statements</span>          </div>  </li></ol>
+  @resposta_form = RespostaForm.new(resposta_form_params)
+
+  respond_to do |format|
+    if @resposta_form.save
+      format.html { redirect_to @resposta_form, notice: &quot;Resposta form was successfully created.&quot; }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>RespostaFormsController#create calls 'format.html' 2 times</span>              <span>Locations:</span>                  <a href="resposta_forms_controller.html#L47" class="js-smell-location">0</a>                  <a href="resposta_forms_controller.html#L50" class="js-smell-location">1</a>                  </div>  </li></ol>
+      format.json { render :show, status: :created, location: @resposta_form }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>RespostaFormsController#create calls 'format.json' 2 times</span>              <span>Locations:</span>                  <a href="resposta_forms_controller.html#L48" class="js-smell-location">0</a>                  <a href="resposta_forms_controller.html#L51" class="js-smell-location">1</a>                  </div>  </li></ol>
+    else
+      format.html { render :new, status: :unprocessable_content }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>RespostaFormsController#create calls 'format.html' 2 times</span>              <span>Locations:</span>                  <a href="resposta_forms_controller.html#L47" class="js-smell-location">0</a>                  <a href="resposta_forms_controller.html#L50" class="js-smell-location">1</a>                  </div>  </li></ol>
+      format.json { render json: @resposta_form.errors, status: :unprocessable_content }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>RespostaFormsController#create calls 'format.json' 2 times</span>              <span>Locations:</span>                  <a href="resposta_forms_controller.html#L48" class="js-smell-location">0</a>                  <a href="resposta_forms_controller.html#L51" class="js-smell-location">1</a>                  </div>  </li></ol>
+    end
+  end
+end
+
+# Atualiza os dados de uma resposta de formulário existente.
+#
+# @return [void]
+# @note Persiste as alterações no banco de dados. Em caso de sucesso, redireciona para
+#   a página da resposta; em caso de falha, re-renderiza o formulário de edição.
+def update<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="http://docs.seattlerb.org/flay/" target="_blank"><b>DuplicateCode</b></a>        </span>      </div>      <span>Similar code found in 14 nodes</span>              <span>Locations:</span>                  <a href="campo_forms_controller.html#L61" class="js-smell-location">0</a>                  <a href="campos_controller.html#L61" class="js-smell-location">1</a>                  <a href="cursos_controller.html#L60" class="js-smell-location">2</a>                  <a href="departamentos_controller.html#L61" class="js-smell-location">3</a>                  <a href="discentes_controller.html#L61" class="js-smell-location">4</a>                  <a href="disciplinas_controller.html#L61" class="js-smell-location">5</a>                  <a href="docentes_controller.html#L61" class="js-smell-location">6</a>                  <a href="elemento_forms_controller.html#L61" class="js-smell-location">7</a>                  <a href="elementos_controller.html#L60" class="js-smell-location">8</a>                  <a href="formularios_controller.html#L60" class="js-smell-location">9</a>                  <a href="resposta_elems_controller.html#L61" class="js-smell-location">10</a>                  <a href="resposta_forms_controller.html#L61" class="js-smell-location">11</a>                  <a href="turmas_controller.html#L60" class="js-smell-location">12</a>                  <a href="usuarios_controller.html#L163" class="js-smell-location">13</a>                  </div>  </li>  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Too-Many-Statements.md" target="_blank"><b>TooManyStatements</b></a>        </span>      </div>      <span>RespostaFormsController#update has approx 9 statements</span>          </div>  </li></ol>
+  respond_to do |format|
+    if @resposta_form.update(resposta_form_params)
+      format.html { redirect_to @resposta_form, notice: &quot;Resposta form was successfully updated.&quot;, status: :see_other }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>RespostaFormsController#update calls 'format.html' 2 times</span>              <span>Locations:</span>                  <a href="resposta_forms_controller.html#L64" class="js-smell-location">0</a>                  <a href="resposta_forms_controller.html#L67" class="js-smell-location">1</a>                  </div>  </li></ol>
+      format.json { render :show, status: :ok, location: @resposta_form }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>RespostaFormsController#update calls 'format.json' 2 times</span>              <span>Locations:</span>                  <a href="resposta_forms_controller.html#L65" class="js-smell-location">0</a>                  <a href="resposta_forms_controller.html#L68" class="js-smell-location">1</a>                  </div>  </li></ol>
+    else
+      format.html { render :edit, status: :unprocessable_content }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>RespostaFormsController#update calls 'format.html' 2 times</span>              <span>Locations:</span>                  <a href="resposta_forms_controller.html#L64" class="js-smell-location">0</a>                  <a href="resposta_forms_controller.html#L67" class="js-smell-location">1</a>                  </div>  </li></ol>
+      format.json { render json: @resposta_form.errors, status: :unprocessable_content }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>RespostaFormsController#update calls 'format.json' 2 times</span>              <span>Locations:</span>                  <a href="resposta_forms_controller.html#L65" class="js-smell-location">0</a>                  <a href="resposta_forms_controller.html#L68" class="js-smell-location">1</a>                  </div>  </li></ol>
+    end
+  end
+end
+
+# Remove permanentemente uma resposta de formulário do banco de dados.
+#
+# @return [void]
+# @note Redireciona para a lista de respostas após a exclusão.
+def destroy<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="http://docs.seattlerb.org/flay/" target="_blank"><b>DuplicateCode</b></a>        </span>      </div>      <span>Similar code found in 14 nodes</span>              <span>Locations:</span>                  <a href="campo_forms_controller.html#L77" class="js-smell-location">0</a>                  <a href="campos_controller.html#L77" class="js-smell-location">1</a>                  <a href="cursos_controller.html#L76" class="js-smell-location">2</a>                  <a href="departamentos_controller.html#L77" class="js-smell-location">3</a>                  <a href="discentes_controller.html#L77" class="js-smell-location">4</a>                  <a href="disciplinas_controller.html#L77" class="js-smell-location">5</a>                  <a href="docentes_controller.html#L77" class="js-smell-location">6</a>                  <a href="elemento_forms_controller.html#L77" class="js-smell-location">7</a>                  <a href="elementos_controller.html#L76" class="js-smell-location">8</a>                  <a href="formularios_controller.html#L76" class="js-smell-location">9</a>                  <a href="resposta_elems_controller.html#L77" class="js-smell-location">10</a>                  <a href="resposta_forms_controller.html#L77" class="js-smell-location">11</a>                  <a href="turmas_controller.html#L76" class="js-smell-location">12</a>                  <a href="usuarios_controller.html#L179" class="js-smell-location">13</a>                  </div>  </li>  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Too-Many-Statements.md" target="_blank"><b>TooManyStatements</b></a>        </span>      </div>      <span>RespostaFormsController#destroy has approx 6 statements</span>          </div>  </li></ol>
+  @resposta_form.destroy!
+
+  respond_to do |format|
+    format.html { redirect_to resposta_forms_path, notice: &quot;Resposta form was successfully destroyed.&quot;, status: :see_other }
+    format.json { head :no_content }
+  end
+end
+
+private
+
+# Busca a resposta de formulário pelo +:id+ da rota e a atribui a +@resposta_form+.
+#
+# @return [void]
+def set_resposta_form
+  @resposta_form = RespostaForm.find(params.expect(:id))
+end
+
+# Filtra os parâmetros permitidos para criação/atualização de resposta de formulário.
+#
+# @return [ActionController::Parameters] parâmetros filtrados da resposta de formulário
+def resposta_form_params
+  params.expect(resposta_form: [ :data_submissao, :formulario_id, :usuario_id ])
+end
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/app/controllers/sessions_controller_html.html b/doc/tmp/rubycritic/app/controllers/sessions_controller_html.html new file mode 100644 index 0000000000..7c588c5895 --- /dev/null +++ b/doc/tmp/rubycritic/app/controllers/sessions_controller_html.html @@ -0,0 +1,1833 @@ + + + + + + + +sessions_controller.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-06-29 19:51:36 -0300'>2026-06-29 19:51:36 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>app/controllers /</small> sessions_controller.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating a big">
+            A
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">84</span><small> lines of codes</small></div>
+            <div><span class="metric">4</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">12.1</span><small> complexity/method</small></div>
+            <div><span class="metric">11</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">48.4</span><small> complexity</small></div>
+            <div><span class="metric">0</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              3
+              smells
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code"># Gerencia o ciclo de vida da sessão de autenticação do usuário.
+ +

# # Responsável pelo login (criação de sessão com verificação de credenciais via # email ou matrícula) e pelo logout (destruição da sessão). Redireciona o usuário # para a página correta de acordo com o seu perfil (Administrador ou demais). class SessionsController &lt; ApplicationController

+ +
# Exibe o formulário de login.
+#
+# @return [void]
+# @note Redireciona para a página do usuário caso já exista uma sessão ativa.
+def new
+  if current_user
+    redirect_para_pagina_do_usuario(current_user)
+  end
+end
+
+# Autentica o usuário com as credenciais informadas e inicia a sessão.
+#
+# @return [void]
+# @note Lê os parâmetros +:login+ (email ou matrícula) e +:senha+ do formulário.
+#   Redireciona para a página raiz com alerta em caso de falha (login em branco, senha
+#   em branco, usuário não encontrado, cadastro não efetivado ou senha incorreta).
+#   Em caso de sucesso, armazena o id do usuário na sessão e redireciona para a sua
+#   página de avaliações.
+def create<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="http://docs.seattlerb.org/flog/" target="_blank"><b>HighComplexity</b></a>        </span>      </div>      <span>SessionsController#create has a flog score of 33</span>          </div>  </li>  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Too-Many-Statements.md" target="_blank"><b>TooManyStatements</b></a>        </span>      </div>      <span>SessionsController#create has approx 15 statements</span>          </div>  </li></ol>
+  login = params[:login].to_s.strip
+  senha = params[:senha].to_s
+
+  if login.blank?
+    redirect_to root_path, alert: &quot;Falha no login: informe seu email ou matrícula&quot;
+    return
+  end
+
+  if senha.blank?
+    redirect_to root_path, alert: &quot;Falha no login: informe a sua senha&quot;
+    return
+  end
+
+  usuario = Usuario.find_by(email: login) || Usuario.find_by(matricula: login)
+
+  if usuario.blank?
+    redirect_to root_path, alert: &quot;Falha no login: usuário não encontrado&quot;
+    return
+  end
+
+  unless usuario.senha_definida?
+    redirect_to root_path, alert: &quot;Falha no login: usuário existente deve efetivar o seu cadastro por email&quot;
+    return
+  end
+
+  unless usuario.autenticar_senha(senha)
+    redirect_to root_path, alert: &quot;Falha no login: senha incorreta&quot;
+    return
+  end
+
+  session[:usuario_id] = usuario.id
+  redirect_para_pagina_do_usuario(usuario)
+end
+
+# Encerra a sessão do usuário atual.
+#
+# @return [void]
+# @note Limpa todos os dados da sessão e redireciona para a página raiz.
+def destroy
+  reset_session
+  redirect_to root_path
+end
+
+private
+
+# Redireciona para a página de avaliações correspondente ao tipo do usuário.
+#
+# @param usuario [Usuario] o usuário cuja página será exibida
+# @return [void]
+# @note Administradores são redirecionados para +admin_avaliacoes_path+;
+#   demais usuários para +usuarios_avaliacoes_path+.
+def redirect_para_pagina_do_usuario(usuario)
+  if usuario.is_a?(Administrador)
+    redirect_to admin_avaliacoes_path(usuario.id), notice: &quot;Login realizado com sucesso.&quot;<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>SessionsController#redirect_para_pagina_do_usuario calls 'usuario.id' 2 times</span>              <span>Locations:</span>                  <a href="sessions_controller.html#L79" class="js-smell-location">0</a>                  <a href="sessions_controller.html#L81" class="js-smell-location">1</a>                  </div>  </li></ol>
+  else
+    redirect_to usuarios_avaliacoes_path(usuario.id), notice: &quot;Login realizado com sucesso.&quot;<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>SessionsController#redirect_para_pagina_do_usuario calls 'usuario.id' 2 times</span>              <span>Locations:</span>                  <a href="sessions_controller.html#L79" class="js-smell-location">0</a>                  <a href="sessions_controller.html#L81" class="js-smell-location">1</a>                  </div>  </li></ol>
+  end
+end
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/app/controllers/templates_controller_html.html b/doc/tmp/rubycritic/app/controllers/templates_controller_html.html new file mode 100644 index 0000000000..1d04ce1862 --- /dev/null +++ b/doc/tmp/rubycritic/app/controllers/templates_controller_html.html @@ -0,0 +1,1876 @@ + + + + + + + +templates_controller.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-06-29 19:51:36 -0300'>2026-06-29 19:51:36 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>app/controllers /</small> templates_controller.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating c big">
+            C
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">128</span><small> lines of codes</small></div>
+            <div><span class="metric">9</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">9.1</span><small> complexity/method</small></div>
+            <div><span class="metric">8</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">81.47</span><small> complexity</small></div>
+            <div><span class="metric">84</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              14
+              smells
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code"># Gerencia o CRUD de templates de formulário de avaliação.
+ +

# # Templates são modelos reutilizáveis criados por administradores que definem a # estrutura de uma avaliação (questões e opções de resposta). Cada administrador # só pode gerenciar seus próprios templates. Utiliza o layout &quot;gerenciamento&quot; e # suporta criação e edição de elementos e campos via nested attributes. class TemplatesController &lt; ApplicationController<ol class=“nocode errors smells”> <li> <div class=“description”> <div class=“heading”> <span> <i class=“fa fa-warning” aria-hidden=“true”></i> <a href=“github.com/troessner/reek/blob/master/docs/Instance-Variable-Assumption.md” target=“_blank”>InstanceVariableAssumption</a> </span> </div> <span>TemplatesController assumes too much for instance variable ‘@admin’</span> </div> </li> <li> <div class=“description”> <div class=“heading”> <span> <i class=“fa fa-warning” aria-hidden=“true”></i> <a href=“github.com/troessner/reek/blob/master/docs/Instance-Variable-Assumption.md” target=“_blank”>InstanceVariableAssumption</a> </span> </div> <span>TemplatesController assumes too much for instance variable ‘@template’</span> </div> </li></ol>

+ +
layout &quot;gerenciamento&quot;
+before_action :require_login
+
+include AdminAutenticavel
+
+before_action :set_admin
+before_action :set_template, only: %i[ show edit update destroy ]
+
+# Lista todos os templates do administrador com seus elementos e campos.
+#
+# @return [void]
+def index
+  @templates = @admin.templates.includes(elementos: :campos)
+end
+
+# Redireciona para a lista de templates do administrador.
+#
+# @return [void]
+# @note Redireciona para +admin_templates_path+.
+def show
+  redirect_to admin_templates_path(@admin)
+end
+
+# Exibe o formulário de criação de novo template com um elemento e um campo iniciais.
+#
+# @return [void]
+def new
+  @templates = @admin.templates<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>TemplatesController#new calls '@admin.templates' 2 times</span>              <span>Locations:</span>                  <a href="templates_controller.html#L35" class="js-smell-location">0</a>                  <a href="templates_controller.html#L36" class="js-smell-location">1</a>                  </div>  </li></ol>
+  @template = @admin.templates.build<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>TemplatesController#new calls '@admin.templates' 2 times</span>              <span>Locations:</span>                  <a href="templates_controller.html#L35" class="js-smell-location">0</a>                  <a href="templates_controller.html#L36" class="js-smell-location">1</a>                  </div>  </li></ol>
+  elemento = @template.elementos.build
+  elemento.campos.build
+end
+
+# Exibe o formulário de edição de um template existente.
+#
+# @return [void]
+# @note Se o template não possuir elementos, cria um elemento vazio com um campo
+#   para facilitar o preenchimento do formulário.
+def edit
+  @templates = @admin.templates
+  if @template.elementos.empty?<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>TemplatesController#edit calls '@template.elementos' 2 times</span>              <span>Locations:</span>                  <a href="templates_controller.html#L48" class="js-smell-location">0</a>                  <a href="templates_controller.html#L49" class="js-smell-location">1</a>                  </div>  </li></ol>
+    elemento = @template.elementos.build<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>TemplatesController#edit calls '@template.elementos' 2 times</span>              <span>Locations:</span>                  <a href="templates_controller.html#L48" class="js-smell-location">0</a>                  <a href="templates_controller.html#L49" class="js-smell-location">1</a>                  </div>  </li></ol>
+    elemento.campos.build
+  end
+end
+
+# Cria um novo template com os parâmetros permitidos.
+#
+# @return [void]
+# @note Persiste o template e seus elementos/campos no banco de dados via nested
+#   attributes. Em caso de sucesso, redireciona para a lista de templates; em caso
+#   de falha, re-renderiza o formulário de criação.
+def create<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Too-Many-Statements.md" target="_blank"><b>TooManyStatements</b></a>        </span>      </div>      <span>TemplatesController#create has approx 11 statements</span>          </div>  </li></ol>
+  @template = @admin.templates.build(template_params)<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>TemplatesController#create calls '@admin.templates' 2 times</span>              <span>Locations:</span>                  <a href="templates_controller.html#L61" class="js-smell-location">0</a>                  <a href="templates_controller.html#L68" class="js-smell-location">1</a>                  </div>  </li></ol>
+
+  respond_to do |format|
+    if @template.save
+      format.html { redirect_to admin_templates_path(@admin), notice: &quot;Template criado com sucesso!&quot; }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="http://docs.seattlerb.org/flay/" target="_blank"><b>DuplicateCode</b></a>        </span>      </div>      <span>Similar code found in 2 nodes</span>              <span>Locations:</span>                  <a href="templates_controller.html#L65" class="js-smell-location">0</a>                  <a href="templates_controller.html#L84" class="js-smell-location">1</a>                  </div>  </li>  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>TemplatesController#create calls 'format.html' 2 times</span>              <span>Locations:</span>                  <a href="templates_controller.html#L65" class="js-smell-location">0</a>                  <a href="templates_controller.html#L69" class="js-smell-location">1</a>                  </div>  </li></ol>
+      format.json { render :show, status: :created, location: @template }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>TemplatesController#create calls 'format.json' 2 times</span>              <span>Locations:</span>                  <a href="templates_controller.html#L66" class="js-smell-location">0</a>                  <a href="templates_controller.html#L70" class="js-smell-location">1</a>                  </div>  </li></ol>
+    else
+      @templates = @admin.templates<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="http://docs.seattlerb.org/flay/" target="_blank"><b>DuplicateCode</b></a>        </span>      </div>      <span>Similar code found in 2 nodes</span>              <span>Locations:</span>                  <a href="templates_controller.html#L68" class="js-smell-location">0</a>                  <a href="templates_controller.html#L87" class="js-smell-location">1</a>                  </div>  </li>  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>TemplatesController#create calls '@admin.templates' 2 times</span>              <span>Locations:</span>                  <a href="templates_controller.html#L61" class="js-smell-location">0</a>                  <a href="templates_controller.html#L68" class="js-smell-location">1</a>                  </div>  </li></ol>
+      format.html { render :new, status: :unprocessable_content }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>TemplatesController#create calls 'format.html' 2 times</span>              <span>Locations:</span>                  <a href="templates_controller.html#L65" class="js-smell-location">0</a>                  <a href="templates_controller.html#L69" class="js-smell-location">1</a>                  </div>  </li></ol>
+      format.json { render json: @template.errors, status: :unprocessable_content }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>TemplatesController#create calls 'format.json' 2 times</span>              <span>Locations:</span>                  <a href="templates_controller.html#L66" class="js-smell-location">0</a>                  <a href="templates_controller.html#L70" class="js-smell-location">1</a>                  </div>  </li></ol>
+    end
+  end
+end
+
+# Atualiza os dados de um template existente.
+#
+# @return [void]
+# @note Persiste as alterações no banco de dados, incluindo adição, edição e remoção
+#   de elementos e campos. Em caso de sucesso, redireciona para a lista de templates;
+#   em caso de falha, re-renderiza o formulário de edição.
+def update<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Too-Many-Statements.md" target="_blank"><b>TooManyStatements</b></a>        </span>      </div>      <span>TemplatesController#update has approx 10 statements</span>          </div>  </li></ol>
+  respond_to do |format|
+    if @template.update(template_params)
+      format.html { redirect_to admin_templates_path(@admin), notice: &quot;Template atualizado com sucesso!&quot; }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="http://docs.seattlerb.org/flay/" target="_blank"><b>DuplicateCode</b></a>        </span>      </div>      <span>Similar code found in 2 nodes</span>              <span>Locations:</span>                  <a href="templates_controller.html#L65" class="js-smell-location">0</a>                  <a href="templates_controller.html#L84" class="js-smell-location">1</a>                  </div>  </li>  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>TemplatesController#update calls 'format.html' 2 times</span>              <span>Locations:</span>                  <a href="templates_controller.html#L84" class="js-smell-location">0</a>                  <a href="templates_controller.html#L88" class="js-smell-location">1</a>                  </div>  </li></ol>
+      format.json { render :show, status: :ok, location: @template }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>TemplatesController#update calls 'format.json' 2 times</span>              <span>Locations:</span>                  <a href="templates_controller.html#L85" class="js-smell-location">0</a>                  <a href="templates_controller.html#L89" class="js-smell-location">1</a>                  </div>  </li></ol>
+    else
+      @templates = @admin.templates<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="http://docs.seattlerb.org/flay/" target="_blank"><b>DuplicateCode</b></a>        </span>      </div>      <span>Similar code found in 2 nodes</span>              <span>Locations:</span>                  <a href="templates_controller.html#L68" class="js-smell-location">0</a>                  <a href="templates_controller.html#L87" class="js-smell-location">1</a>                  </div>  </li></ol>
+      format.html { render :edit, status: :unprocessable_content }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>TemplatesController#update calls 'format.html' 2 times</span>              <span>Locations:</span>                  <a href="templates_controller.html#L84" class="js-smell-location">0</a>                  <a href="templates_controller.html#L88" class="js-smell-location">1</a>                  </div>  </li></ol>
+      format.json { render json: @template.errors, status: :unprocessable_content }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>TemplatesController#update calls 'format.json' 2 times</span>              <span>Locations:</span>                  <a href="templates_controller.html#L85" class="js-smell-location">0</a>                  <a href="templates_controller.html#L89" class="js-smell-location">1</a>                  </div>  </li></ol>
+    end
+  end
+end
+
+# Remove permanentemente um template e seus elementos/campos do banco de dados.
+#
+# @return [void]
+# @note Redireciona para a lista de templates após a exclusão.
+def destroy<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Too-Many-Statements.md" target="_blank"><b>TooManyStatements</b></a>        </span>      </div>      <span>TemplatesController#destroy has approx 6 statements</span>          </div>  </li></ol>
+  @template.destroy!
+  respond_to do |format|
+    format.html { redirect_to admin_templates_path(@admin), notice: &quot;Template deletado com sucesso!&quot;, status: :see_other }
+    format.json { head :no_content }
+  end
+end
+
+private
+
+# Busca o template pelo +:id+ da rota dentro dos templates do administrador.
+#
+# @return [void]
+def set_template
+  @template = @admin.templates.find(params.expect(:id))
+end
+
+# Filtra os parâmetros permitidos para criação/atualização de template.
+#
+# @return [ActionController::Parameters] parâmetros filtrados do template com nested
+#   attributes de elementos e campos
+def template_params
+  params.require(:template).permit(
+    :nome,
+    elementos_attributes: [
+      :id, :enunciado, :ordem, :_destroy,
+      campos_attributes: [ :id, :tipo_elemento, :enunciado, :ordem, :_destroy ]
+    ]
+  )
+end
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/app/controllers/turmas_controller_html.html b/doc/tmp/rubycritic/app/controllers/turmas_controller_html.html new file mode 100644 index 0000000000..ec6fbceb81 --- /dev/null +++ b/doc/tmp/rubycritic/app/controllers/turmas_controller_html.html @@ -0,0 +1,1849 @@ + + + + + + + +turmas_controller.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-06-29 19:51:36 -0300'>2026-06-29 19:51:36 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>app/controllers /</small> turmas_controller.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating f big">
+            F
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">100</span><small> lines of codes</small></div>
+            <div><span class="metric">9</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">6.0</span><small> complexity/method</small></div>
+            <div><span class="metric">5</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">53.58</span><small> complexity</small></div>
+            <div><span class="metric">122</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              11
+              smells
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code"># Gerencia o CRUD de turmas.
+ +

# # Turmas representam a oferta de uma disciplina em um semestre, agrupando docentes # e discentes. Este controller oferece as operações básicas de listagem, visualização, # criação, edição e exclusão de turmas. class TurmasController &lt; ApplicationController<ol class=“nocode errors smells”> <li> <div class=“description”> <div class=“heading”> <span> <i class=“fa fa-warning” aria-hidden=“true”></i> <a href=“github.com/troessner/reek/blob/master/docs/Instance-Variable-Assumption.md” target=“_blank”>InstanceVariableAssumption</a> </span> </div> <span>TurmasController assumes too much for instance variable ‘@turma’</span> </div> </li></ol>

+ +
before_action :require_login
+before_action :set_turma, only: %i[ show edit update destroy ]
+
+# Lista todas as turmas cadastradas.
+#
+# @return [void]
+def index
+  @turmas = Turma.all
+end
+
+# Exibe os detalhes de uma turma específica.
+#
+# @return [void]
+def show
+end
+
+# Exibe o formulário de criação de nova turma.
+#
+# @return [void]
+def new
+  @turma = Turma.new
+end
+
+# Exibe o formulário de edição de uma turma existente.
+#
+# @return [void]
+def edit
+end
+
+# Cria uma nova turma com os parâmetros permitidos.
+#
+# @return [void]
+# @note Persiste a turma no banco de dados. Em caso de sucesso, redireciona para a
+#   página da turma; em caso de falha, re-renderiza o formulário de criação.
+def create<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="http://docs.seattlerb.org/flay/" target="_blank"><b>DuplicateCode</b></a>        </span>      </div>      <span>Similar code found in 14 nodes</span>              <span>Locations:</span>                  <a href="campo_forms_controller.html#L42" class="js-smell-location">0</a>                  <a href="campos_controller.html#L42" class="js-smell-location">1</a>                  <a href="cursos_controller.html#L41" class="js-smell-location">2</a>                  <a href="departamentos_controller.html#L42" class="js-smell-location">3</a>                  <a href="discentes_controller.html#L42" class="js-smell-location">4</a>                  <a href="disciplinas_controller.html#L42" class="js-smell-location">5</a>                  <a href="docentes_controller.html#L42" class="js-smell-location">6</a>                  <a href="elemento_forms_controller.html#L42" class="js-smell-location">7</a>                  <a href="elementos_controller.html#L41" class="js-smell-location">8</a>                  <a href="formularios_controller.html#L41" class="js-smell-location">9</a>                  <a href="resposta_elems_controller.html#L42" class="js-smell-location">10</a>                  <a href="resposta_forms_controller.html#L42" class="js-smell-location">11</a>                  <a href="turmas_controller.html#L41" class="js-smell-location">12</a>                  <a href="usuarios_controller.html#L144" class="js-smell-location">13</a>                  </div>  </li>  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Too-Many-Statements.md" target="_blank"><b>TooManyStatements</b></a>        </span>      </div>      <span>TurmasController#create has approx 10 statements</span>          </div>  </li></ol>
+  @turma = Turma.new(turma_params)
+
+  respond_to do |format|
+    if @turma.save
+      format.html { redirect_to @turma, notice: &quot;Turma was successfully created.&quot; }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>TurmasController#create calls 'format.html' 2 times</span>              <span>Locations:</span>                  <a href="turmas_controller.html#L46" class="js-smell-location">0</a>                  <a href="turmas_controller.html#L49" class="js-smell-location">1</a>                  </div>  </li></ol>
+      format.json { render :show, status: :created, location: @turma }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>TurmasController#create calls 'format.json' 2 times</span>              <span>Locations:</span>                  <a href="turmas_controller.html#L47" class="js-smell-location">0</a>                  <a href="turmas_controller.html#L50" class="js-smell-location">1</a>                  </div>  </li></ol>
+    else
+      format.html { render :new, status: :unprocessable_content }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>TurmasController#create calls 'format.html' 2 times</span>              <span>Locations:</span>                  <a href="turmas_controller.html#L46" class="js-smell-location">0</a>                  <a href="turmas_controller.html#L49" class="js-smell-location">1</a>                  </div>  </li></ol>
+      format.json { render json: @turma.errors, status: :unprocessable_content }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>TurmasController#create calls 'format.json' 2 times</span>              <span>Locations:</span>                  <a href="turmas_controller.html#L47" class="js-smell-location">0</a>                  <a href="turmas_controller.html#L50" class="js-smell-location">1</a>                  </div>  </li></ol>
+    end
+  end
+end
+
+# Atualiza os dados de uma turma existente.
+#
+# @return [void]
+# @note Persiste as alterações no banco de dados. Em caso de sucesso, redireciona para
+#   a página da turma; em caso de falha, re-renderiza o formulário de edição.
+def update<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="http://docs.seattlerb.org/flay/" target="_blank"><b>DuplicateCode</b></a>        </span>      </div>      <span>Similar code found in 14 nodes</span>              <span>Locations:</span>                  <a href="campo_forms_controller.html#L61" class="js-smell-location">0</a>                  <a href="campos_controller.html#L61" class="js-smell-location">1</a>                  <a href="cursos_controller.html#L60" class="js-smell-location">2</a>                  <a href="departamentos_controller.html#L61" class="js-smell-location">3</a>                  <a href="discentes_controller.html#L61" class="js-smell-location">4</a>                  <a href="disciplinas_controller.html#L61" class="js-smell-location">5</a>                  <a href="docentes_controller.html#L61" class="js-smell-location">6</a>                  <a href="elemento_forms_controller.html#L61" class="js-smell-location">7</a>                  <a href="elementos_controller.html#L60" class="js-smell-location">8</a>                  <a href="formularios_controller.html#L60" class="js-smell-location">9</a>                  <a href="resposta_elems_controller.html#L61" class="js-smell-location">10</a>                  <a href="resposta_forms_controller.html#L61" class="js-smell-location">11</a>                  <a href="turmas_controller.html#L60" class="js-smell-location">12</a>                  <a href="usuarios_controller.html#L163" class="js-smell-location">13</a>                  </div>  </li>  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Too-Many-Statements.md" target="_blank"><b>TooManyStatements</b></a>        </span>      </div>      <span>TurmasController#update has approx 9 statements</span>          </div>  </li></ol>
+  respond_to do |format|
+    if @turma.update(turma_params)
+      format.html { redirect_to @turma, notice: &quot;Turma was successfully updated.&quot;, status: :see_other }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>TurmasController#update calls 'format.html' 2 times</span>              <span>Locations:</span>                  <a href="turmas_controller.html#L63" class="js-smell-location">0</a>                  <a href="turmas_controller.html#L66" class="js-smell-location">1</a>                  </div>  </li></ol>
+      format.json { render :show, status: :ok, location: @turma }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>TurmasController#update calls 'format.json' 2 times</span>              <span>Locations:</span>                  <a href="turmas_controller.html#L64" class="js-smell-location">0</a>                  <a href="turmas_controller.html#L67" class="js-smell-location">1</a>                  </div>  </li></ol>
+    else
+      format.html { render :edit, status: :unprocessable_content }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>TurmasController#update calls 'format.html' 2 times</span>              <span>Locations:</span>                  <a href="turmas_controller.html#L63" class="js-smell-location">0</a>                  <a href="turmas_controller.html#L66" class="js-smell-location">1</a>                  </div>  </li></ol>
+      format.json { render json: @turma.errors, status: :unprocessable_content }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>TurmasController#update calls 'format.json' 2 times</span>              <span>Locations:</span>                  <a href="turmas_controller.html#L64" class="js-smell-location">0</a>                  <a href="turmas_controller.html#L67" class="js-smell-location">1</a>                  </div>  </li></ol>
+    end
+  end
+end
+
+# Remove permanentemente uma turma do banco de dados.
+#
+# @return [void]
+# @note Redireciona para a lista de turmas após a exclusão.
+def destroy<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="http://docs.seattlerb.org/flay/" target="_blank"><b>DuplicateCode</b></a>        </span>      </div>      <span>Similar code found in 14 nodes</span>              <span>Locations:</span>                  <a href="campo_forms_controller.html#L77" class="js-smell-location">0</a>                  <a href="campos_controller.html#L77" class="js-smell-location">1</a>                  <a href="cursos_controller.html#L76" class="js-smell-location">2</a>                  <a href="departamentos_controller.html#L77" class="js-smell-location">3</a>                  <a href="discentes_controller.html#L77" class="js-smell-location">4</a>                  <a href="disciplinas_controller.html#L77" class="js-smell-location">5</a>                  <a href="docentes_controller.html#L77" class="js-smell-location">6</a>                  <a href="elemento_forms_controller.html#L77" class="js-smell-location">7</a>                  <a href="elementos_controller.html#L76" class="js-smell-location">8</a>                  <a href="formularios_controller.html#L76" class="js-smell-location">9</a>                  <a href="resposta_elems_controller.html#L77" class="js-smell-location">10</a>                  <a href="resposta_forms_controller.html#L77" class="js-smell-location">11</a>                  <a href="turmas_controller.html#L76" class="js-smell-location">12</a>                  <a href="usuarios_controller.html#L179" class="js-smell-location">13</a>                  </div>  </li>  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Too-Many-Statements.md" target="_blank"><b>TooManyStatements</b></a>        </span>      </div>      <span>TurmasController#destroy has approx 6 statements</span>          </div>  </li></ol>
+  @turma.destroy!
+
+  respond_to do |format|
+    format.html { redirect_to turmas_path, notice: &quot;Turma was successfully destroyed.&quot;, status: :see_other }
+    format.json { head :no_content }
+  end
+end
+
+private
+
+# Busca a turma pelo +:id+ da rota e a atribui a +@turma+.
+#
+# @return [void]
+def set_turma
+  @turma = Turma.find(params.expect(:id))
+end
+
+# Filtra os parâmetros permitidos para criação/atualização de turma.
+#
+# @return [ActionController::Parameters] parâmetros filtrados da turma
+def turma_params
+  params.expect(turma: [ :numero_da_turma, :semestre, :horario, :disciplina_id ])
+end
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/app/controllers/usuarios_controller_html.html b/doc/tmp/rubycritic/app/controllers/usuarios_controller_html.html new file mode 100644 index 0000000000..681129b756 --- /dev/null +++ b/doc/tmp/rubycritic/app/controllers/usuarios_controller_html.html @@ -0,0 +1,1950 @@ + + + + + + + +usuarios_controller.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-06-29 19:51:36 -0300'>2026-06-29 19:51:36 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>app/controllers /</small> usuarios_controller.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating f big">
+            F
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">203</span><small> lines of codes</small></div>
+            <div><span class="metric">12</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">13.7</span><small> complexity/method</small></div>
+            <div><span class="metric">9</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">164.61</span><small> complexity</small></div>
+            <div><span class="metric">122</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              30
+              smells
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code"># Gerencia o cadastro de usuários e o fluxo de resposta a formulários de avaliação.
+ +

# # As ações de CRUD (index, show, new, edit, create, update, destroy) # são restritas a administradores. As ações avaliacoes, responder_formulario e # submeter_resposta são acessíveis a qualquer usuário autenticado e compõem o # fluxo pelo qual docentes e discentes visualizam e respondem formulários de avaliação # das suas turmas. class UsuariosController &lt; ApplicationController<ol class=“nocode errors smells”> <li> <div class=“description”> <div class=“heading”> <span> <i class=“fa fa-warning” aria-hidden=“true”></i> <a href=“github.com/troessner/reek/blob/master/docs/Instance-Variable-Assumption.md” target=“_blank”>InstanceVariableAssumption</a> </span> </div> <span>UsuariosController assumes too much for instance variable ‘@formulario’</span> </div> </li> <li> <div class=“description”> <div class=“heading”> <span> <i class=“fa fa-warning” aria-hidden=“true”></i> <a href=“github.com/troessner/reek/blob/master/docs/Instance-Variable-Assumption.md” target=“_blank”>InstanceVariableAssumption</a> </span> </div> <span>UsuariosController assumes too much for instance variable ‘@turmas’</span> </div> </li> <li> <div class=“description”> <div class=“heading”> <span> <i class=“fa fa-warning” aria-hidden=“true”></i> <a href=“github.com/troessner/reek/blob/master/docs/Instance-Variable-Assumption.md” target=“_blank”>InstanceVariableAssumption</a> </span> </div> <span>UsuariosController assumes too much for instance variable ‘@usuario’</span> </div> </li> <li> <div class=“description”> <div class=“heading”> <span> <i class=“fa fa-warning” aria-hidden=“true”></i> <a href=“github.com/troessner/reek/blob/master/docs/Too-Many-Instance-Variables.md” target=“_blank”>TooManyInstanceVariables</a> </span> </div> <span>UsuariosController has at least 5 instance variables</span> </div> </li></ol>

+ +
before_action :require_login
+before_action :require_admin, except: [ :avaliacoes, :responder_formulario, :submeter_resposta ]
+before_action :set_usuario, only: %i[ show edit update destroy ]
+
+# Lista as avaliações (formulários) das turmas do usuário.
+#
+# @return [void]
+# @note Lê o parâmetro +:usuario_id+ da rota. Popula +@turmas+ conforme o tipo do
+#   usuário (+Docente+ ou +Discente+); demais tipos resultam em coleção vazia.
+def avaliacoes
+  @usuario = Usuario.find(params[:usuario_id])
+
+  if @usuario.is_a?(Docente)
+    @turmas = @usuario.turmas<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>UsuariosController#avaliacoes calls '@usuario.turmas' 2 times</span>              <span>Locations:</span>                  <a href="usuarios_controller.html#L22" class="js-smell-location">0</a>                  <a href="usuarios_controller.html#L24" class="js-smell-location">1</a>                  </div>  </li></ol>
+  elsif @usuario.is_a?(Discente)
+    @turmas = @usuario.turmas<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>UsuariosController#avaliacoes calls '@usuario.turmas' 2 times</span>              <span>Locations:</span>                  <a href="usuarios_controller.html#L22" class="js-smell-location">0</a>                  <a href="usuarios_controller.html#L24" class="js-smell-location">1</a>                  </div>  </li></ol>
+  else
+    @turmas = Turma.none
+  end
+
+  @avaliacoes = Formulario
+    .joins(:turma)
+    .where(turma: @turmas)
+    .includes(turma: { disciplina: :departamento, docentes: [] })
+end
+
+# Exibe o formulário de avaliação para preenchimento pelo usuário.
+#
+# @return [void]
+# @note Lê +:usuario_id+ e +:formulario_id+ da rota. Redireciona para a lista de
+#   avaliações com aviso se o usuário já tiver respondido o formulário.
+def responder_formulario
+  @usuario = Usuario.find(params[:usuario_id])
+  @formulario = Formulario.includes(elemento_forms: :campo_forms).find(params[:formulario_id])
+
+  if RespostaForm.exists?(formulario: @formulario, usuario: current_user)
+    redirect_to usuarios_avaliacoes_path(@usuario), notice: &quot;Você já respondeu este formulário.&quot;
+  end
+end
+
+# Persiste as respostas do usuário ao formulário de avaliação.
+#
+# @return [void]
+# @note Lê +:usuario_id+, +:formulario_id+ e o hash +:respostas+ da requisição.
+#   Redireciona com alerta se o formulário já foi respondido ou se alguma questão
+#   obrigatória estiver em branco. Em caso de sucesso, cria um +RespostaForm+ e os
+#   +RespostaElem+ correspondentes a cada elemento dentro de uma transação, depois
+#   redireciona para a lista de avaliações. Em caso de erro de validação, re-renderiza
+#   o formulário com mensagem de alerta.
+def submeter_resposta<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="http://docs.seattlerb.org/flog/" target="_blank"><b>VeryHighComplexity</b></a>        </span>      </div>      <span>UsuariosController#submeter_resposta has a flog score of 84</span>          </div>  </li>  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Too-Many-Statements.md" target="_blank"><b>TooManyStatements</b></a>        </span>      </div>      <span>UsuariosController#submeter_resposta has approx 22 statements</span>          </div>  </li></ol>
+  @usuario = Usuario.find(params[:usuario_id])
+  @formulario = Formulario.includes(elemento_forms: :campo_forms).find(params[:formulario_id])<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>UsuariosController#submeter_resposta calls 'Formulario.includes(elemento_forms: :campo_forms)' 2 times</span>              <span>Locations:</span>                  <a href="usuarios_controller.html#L60" class="js-smell-location">0</a>                  <a href="usuarios_controller.html#L108" class="js-smell-location">1</a>                  </div>  </li>  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>UsuariosController#submeter_resposta calls 'Formulario.includes(elemento_forms: :campo_forms).find(params[:formulario_id])' 2 times</span>              <span>Locations:</span>                  <a href="usuarios_controller.html#L60" class="js-smell-location">0</a>                  <a href="usuarios_controller.html#L108" class="js-smell-location">1</a>                  </div>  </li>  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>UsuariosController#submeter_resposta calls 'params[:formulario_id]' 2 times</span>              <span>Locations:</span>                  <a href="usuarios_controller.html#L60" class="js-smell-location">0</a>                  <a href="usuarios_controller.html#L108" class="js-smell-location">1</a>                  </div>  </li></ol>
+
+  if RespostaForm.exists?(formulario: @formulario, usuario: current_user)
+    redirect_to usuarios_avaliacoes_path(@usuario), alert: &quot;Você já respondeu este formulário.&quot; and return<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>UsuariosController#submeter_resposta calls 'usuarios_avaliacoes_path(@usuario)' 2 times</span>              <span>Locations:</span>                  <a href="usuarios_controller.html#L63" class="js-smell-location">0</a>                  <a href="usuarios_controller.html#L106" class="js-smell-location">1</a>                  </div>  </li></ol>
+  end
+
+  respostas_em_branco = @formulario.elemento_forms.order(:ordem).any? do |ef|<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>UsuariosController#submeter_resposta calls '@formulario.elemento_forms' 2 times</span>              <span>Locations:</span>                  <a href="usuarios_controller.html#L66" class="js-smell-location">0</a>                  <a href="usuarios_controller.html#L84" class="js-smell-location">1</a>                  </div>  </li>  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>UsuariosController#submeter_resposta calls '@formulario.elemento_forms.order(:ordem)' 2 times</span>              <span>Locations:</span>                  <a href="usuarios_controller.html#L66" class="js-smell-location">0</a>                  <a href="usuarios_controller.html#L84" class="js-smell-location">1</a>                  </div>  </li></ol>
+    params.dig(:respostas, ef.id.to_s).blank?<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>UsuariosController#submeter_resposta calls 'ef.id' 2 times</span>              <span>Locations:</span>                  <a href="usuarios_controller.html#L67" class="js-smell-location">0</a>                  <a href="usuarios_controller.html#L85" class="js-smell-location">1</a>                  </div>  </li>  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>UsuariosController#submeter_resposta calls 'ef.id.to_s' 2 times</span>              <span>Locations:</span>                  <a href="usuarios_controller.html#L67" class="js-smell-location">0</a>                  <a href="usuarios_controller.html#L85" class="js-smell-location">1</a>                  </div>  </li>  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>UsuariosController#submeter_resposta calls 'params.dig(:respostas, ef.id.to_s)' 2 times</span>              <span>Locations:</span>                  <a href="usuarios_controller.html#L67" class="js-smell-location">0</a>                  <a href="usuarios_controller.html#L85" class="js-smell-location">1</a>                  </div>  </li></ol>
+  end
+
+  if respostas_em_branco
+    flash.now[:alert] = &quot;Por favor, responda todas as perguntas obrigatórias&quot;<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>UsuariosController#submeter_resposta calls 'flash.now' 2 times</span>              <span>Locations:</span>                  <a href="usuarios_controller.html#L71" class="js-smell-location">0</a>                  <a href="usuarios_controller.html#L109" class="js-smell-location">1</a>                  </div>  </li></ol>
+    render :responder_formulario, status: :unprocessable_content and return<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>UsuariosController#submeter_resposta calls 'render :responder_formulario, status: :unprocessable_content' 2 times</span>              <span>Locations:</span>                  <a href="usuarios_controller.html#L72" class="js-smell-location">0</a>                  <a href="usuarios_controller.html#L110" class="js-smell-location">1</a>                  </div>  </li></ol>
+  end
+
+  resposta_form = RespostaForm.new(
+    formulario: @formulario,
+    usuario: current_user,
+    data_submissao: Date.today
+  )
+
+  ActiveRecord::Base.transaction do
+    resposta_form.save!
+
+    @formulario.elemento_forms.order(:ordem).each do |ef|<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>UsuariosController#submeter_resposta calls '@formulario.elemento_forms' 2 times</span>              <span>Locations:</span>                  <a href="usuarios_controller.html#L66" class="js-smell-location">0</a>                  <a href="usuarios_controller.html#L84" class="js-smell-location">1</a>                  </div>  </li>  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>UsuariosController#submeter_resposta calls '@formulario.elemento_forms.order(:ordem)' 2 times</span>              <span>Locations:</span>                  <a href="usuarios_controller.html#L66" class="js-smell-location">0</a>                  <a href="usuarios_controller.html#L84" class="js-smell-location">1</a>                  </div>  </li></ol>
+      resposta_val = params.dig(:respostas, ef.id.to_s)<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>UsuariosController#submeter_resposta calls 'ef.id' 2 times</span>              <span>Locations:</span>                  <a href="usuarios_controller.html#L67" class="js-smell-location">0</a>                  <a href="usuarios_controller.html#L85" class="js-smell-location">1</a>                  </div>  </li>  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>UsuariosController#submeter_resposta calls 'ef.id.to_s' 2 times</span>              <span>Locations:</span>                  <a href="usuarios_controller.html#L67" class="js-smell-location">0</a>                  <a href="usuarios_controller.html#L85" class="js-smell-location">1</a>                  </div>  </li>  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>UsuariosController#submeter_resposta calls 'params.dig(:respostas, ef.id.to_s)' 2 times</span>              <span>Locations:</span>                  <a href="usuarios_controller.html#L67" class="js-smell-location">0</a>                  <a href="usuarios_controller.html#L85" class="js-smell-location">1</a>                  </div>  </li></ol>
+      next if resposta_val.blank?
+
+      if ef.tipo == &quot;Texto&quot;
+        resposta_form.resposta_elems.create!(<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>UsuariosController#submeter_resposta calls 'resposta_form.resposta_elems' 2 times</span>              <span>Locations:</span>                  <a href="usuarios_controller.html#L89" class="js-smell-location">0</a>                  <a href="usuarios_controller.html#L97" class="js-smell-location">1</a>                  </div>  </li></ol>
+          elemento_form: ef,
+          texto_resposta: resposta_val
+        )
+      else
+        campo = ef.campo_forms.find_by(id: resposta_val)
+        next unless campo
+
+        resposta_form.resposta_elems.create!(<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>UsuariosController#submeter_resposta calls 'resposta_form.resposta_elems' 2 times</span>              <span>Locations:</span>                  <a href="usuarios_controller.html#L89" class="js-smell-location">0</a>                  <a href="usuarios_controller.html#L97" class="js-smell-location">1</a>                  </div>  </li></ol>
+          elemento_form: ef,
+          campo_form: campo,
+          texto_resposta: campo.enunciado
+        )
+      end
+    end
+  end
+
+  redirect_to usuarios_avaliacoes_path(@usuario), notice: &quot;Respostas enviadas com sucesso!&quot;<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>UsuariosController#submeter_resposta calls 'usuarios_avaliacoes_path(@usuario)' 2 times</span>              <span>Locations:</span>                  <a href="usuarios_controller.html#L63" class="js-smell-location">0</a>                  <a href="usuarios_controller.html#L106" class="js-smell-location">1</a>                  </div>  </li></ol>
+rescue ActiveRecord::RecordInvalid =&gt; e<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Uncommunicative-Variable-Name.md" target="_blank"><b>UncommunicativeVariableName</b></a>        </span>      </div>      <span>UsuariosController#submeter_resposta has the variable name 'e'</span>          </div>  </li></ol>
+  @formulario = Formulario.includes(elemento_forms: :campo_forms).find(params[:formulario_id])<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>UsuariosController#submeter_resposta calls 'Formulario.includes(elemento_forms: :campo_forms)' 2 times</span>              <span>Locations:</span>                  <a href="usuarios_controller.html#L60" class="js-smell-location">0</a>                  <a href="usuarios_controller.html#L108" class="js-smell-location">1</a>                  </div>  </li>  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>UsuariosController#submeter_resposta calls 'Formulario.includes(elemento_forms: :campo_forms).find(params[:formulario_id])' 2 times</span>              <span>Locations:</span>                  <a href="usuarios_controller.html#L60" class="js-smell-location">0</a>                  <a href="usuarios_controller.html#L108" class="js-smell-location">1</a>                  </div>  </li>  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>UsuariosController#submeter_resposta calls 'params[:formulario_id]' 2 times</span>              <span>Locations:</span>                  <a href="usuarios_controller.html#L60" class="js-smell-location">0</a>                  <a href="usuarios_controller.html#L108" class="js-smell-location">1</a>                  </div>  </li></ol>
+  flash.now[:alert] = &quot;Erro ao salvar respostas: #{e.message}&quot;<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>UsuariosController#submeter_resposta calls 'flash.now' 2 times</span>              <span>Locations:</span>                  <a href="usuarios_controller.html#L71" class="js-smell-location">0</a>                  <a href="usuarios_controller.html#L109" class="js-smell-location">1</a>                  </div>  </li></ol>
+  render :responder_formulario, status: :unprocessable_content<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>UsuariosController#submeter_resposta calls 'render :responder_formulario, status: :unprocessable_content' 2 times</span>              <span>Locations:</span>                  <a href="usuarios_controller.html#L72" class="js-smell-location">0</a>                  <a href="usuarios_controller.html#L110" class="js-smell-location">1</a>                  </div>  </li></ol>
+end
+
+# Lista todos os usuários cadastrados.
+#
+# @return [void]
+def index
+  @usuarios = Usuario.all
+end
+
+# Exibe os detalhes de um usuário específico.
+#
+# @return [void]
+def show
+end
+
+# Exibe o formulário de criação de novo usuário.
+#
+# @return [void]
+def new
+  @usuario = Usuario.new
+end
+
+# Exibe o formulário de edição de um usuário existente.
+#
+# @return [void]
+def edit
+end
+
+# Cria um novo usuário com os parâmetros permitidos.
+#
+# @return [void]
+# @note Persiste o usuário no banco de dados. Em caso de sucesso, redireciona para a
+#   página do usuário; em caso de falha, re-renderiza o formulário de criação.
+def create<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="http://docs.seattlerb.org/flay/" target="_blank"><b>DuplicateCode</b></a>        </span>      </div>      <span>Similar code found in 14 nodes</span>              <span>Locations:</span>                  <a href="campo_forms_controller.html#L42" class="js-smell-location">0</a>                  <a href="campos_controller.html#L42" class="js-smell-location">1</a>                  <a href="cursos_controller.html#L41" class="js-smell-location">2</a>                  <a href="departamentos_controller.html#L42" class="js-smell-location">3</a>                  <a href="discentes_controller.html#L42" class="js-smell-location">4</a>                  <a href="disciplinas_controller.html#L42" class="js-smell-location">5</a>                  <a href="docentes_controller.html#L42" class="js-smell-location">6</a>                  <a href="elemento_forms_controller.html#L42" class="js-smell-location">7</a>                  <a href="elementos_controller.html#L41" class="js-smell-location">8</a>                  <a href="formularios_controller.html#L41" class="js-smell-location">9</a>                  <a href="resposta_elems_controller.html#L42" class="js-smell-location">10</a>                  <a href="resposta_forms_controller.html#L42" class="js-smell-location">11</a>                  <a href="turmas_controller.html#L41" class="js-smell-location">12</a>                  <a href="usuarios_controller.html#L144" class="js-smell-location">13</a>                  </div>  </li>  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Too-Many-Statements.md" target="_blank"><b>TooManyStatements</b></a>        </span>      </div>      <span>UsuariosController#create has approx 10 statements</span>          </div>  </li></ol>
+  @usuario = Usuario.new(usuario_params)
+
+  respond_to do |format|
+    if @usuario.save
+      format.html { redirect_to @usuario, notice: &quot;Usuario was successfully created.&quot; }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>UsuariosController#create calls 'format.html' 2 times</span>              <span>Locations:</span>                  <a href="usuarios_controller.html#L149" class="js-smell-location">0</a>                  <a href="usuarios_controller.html#L152" class="js-smell-location">1</a>                  </div>  </li></ol>
+      format.json { render :show, status: :created, location: @usuario }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>UsuariosController#create calls 'format.json' 2 times</span>              <span>Locations:</span>                  <a href="usuarios_controller.html#L150" class="js-smell-location">0</a>                  <a href="usuarios_controller.html#L153" class="js-smell-location">1</a>                  </div>  </li></ol>
+    else
+      format.html { render :new, status: :unprocessable_content }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>UsuariosController#create calls 'format.html' 2 times</span>              <span>Locations:</span>                  <a href="usuarios_controller.html#L149" class="js-smell-location">0</a>                  <a href="usuarios_controller.html#L152" class="js-smell-location">1</a>                  </div>  </li></ol>
+      format.json { render json: @usuario.errors, status: :unprocessable_content }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>UsuariosController#create calls 'format.json' 2 times</span>              <span>Locations:</span>                  <a href="usuarios_controller.html#L150" class="js-smell-location">0</a>                  <a href="usuarios_controller.html#L153" class="js-smell-location">1</a>                  </div>  </li></ol>
+    end
+  end
+end
+
+# Atualiza os dados de um usuário existente.
+#
+# @return [void]
+# @note Persiste as alterações no banco de dados. Em caso de sucesso, redireciona para
+#   a página do usuário; em caso de falha, re-renderiza o formulário de edição.
+def update<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="http://docs.seattlerb.org/flay/" target="_blank"><b>DuplicateCode</b></a>        </span>      </div>      <span>Similar code found in 14 nodes</span>              <span>Locations:</span>                  <a href="campo_forms_controller.html#L61" class="js-smell-location">0</a>                  <a href="campos_controller.html#L61" class="js-smell-location">1</a>                  <a href="cursos_controller.html#L60" class="js-smell-location">2</a>                  <a href="departamentos_controller.html#L61" class="js-smell-location">3</a>                  <a href="discentes_controller.html#L61" class="js-smell-location">4</a>                  <a href="disciplinas_controller.html#L61" class="js-smell-location">5</a>                  <a href="docentes_controller.html#L61" class="js-smell-location">6</a>                  <a href="elemento_forms_controller.html#L61" class="js-smell-location">7</a>                  <a href="elementos_controller.html#L60" class="js-smell-location">8</a>                  <a href="formularios_controller.html#L60" class="js-smell-location">9</a>                  <a href="resposta_elems_controller.html#L61" class="js-smell-location">10</a>                  <a href="resposta_forms_controller.html#L61" class="js-smell-location">11</a>                  <a href="turmas_controller.html#L60" class="js-smell-location">12</a>                  <a href="usuarios_controller.html#L163" class="js-smell-location">13</a>                  </div>  </li>  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Too-Many-Statements.md" target="_blank"><b>TooManyStatements</b></a>        </span>      </div>      <span>UsuariosController#update has approx 9 statements</span>          </div>  </li></ol>
+  respond_to do |format|
+    if @usuario.update(usuario_params)
+      format.html { redirect_to @usuario, notice: &quot;Usuario was successfully updated.&quot;, status: :see_other }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>UsuariosController#update calls 'format.html' 2 times</span>              <span>Locations:</span>                  <a href="usuarios_controller.html#L166" class="js-smell-location">0</a>                  <a href="usuarios_controller.html#L169" class="js-smell-location">1</a>                  </div>  </li></ol>
+      format.json { render :show, status: :ok, location: @usuario }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>UsuariosController#update calls 'format.json' 2 times</span>              <span>Locations:</span>                  <a href="usuarios_controller.html#L167" class="js-smell-location">0</a>                  <a href="usuarios_controller.html#L170" class="js-smell-location">1</a>                  </div>  </li></ol>
+    else
+      format.html { render :edit, status: :unprocessable_content }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>UsuariosController#update calls 'format.html' 2 times</span>              <span>Locations:</span>                  <a href="usuarios_controller.html#L166" class="js-smell-location">0</a>                  <a href="usuarios_controller.html#L169" class="js-smell-location">1</a>                  </div>  </li></ol>
+      format.json { render json: @usuario.errors, status: :unprocessable_content }<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>UsuariosController#update calls 'format.json' 2 times</span>              <span>Locations:</span>                  <a href="usuarios_controller.html#L167" class="js-smell-location">0</a>                  <a href="usuarios_controller.html#L170" class="js-smell-location">1</a>                  </div>  </li></ol>
+    end
+  end
+end
+
+# Remove permanentemente um usuário do banco de dados.
+#
+# @return [void]
+# @note Redireciona para a lista de usuários após a exclusão.
+def destroy<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="http://docs.seattlerb.org/flay/" target="_blank"><b>DuplicateCode</b></a>        </span>      </div>      <span>Similar code found in 14 nodes</span>              <span>Locations:</span>                  <a href="campo_forms_controller.html#L77" class="js-smell-location">0</a>                  <a href="campos_controller.html#L77" class="js-smell-location">1</a>                  <a href="cursos_controller.html#L76" class="js-smell-location">2</a>                  <a href="departamentos_controller.html#L77" class="js-smell-location">3</a>                  <a href="discentes_controller.html#L77" class="js-smell-location">4</a>                  <a href="disciplinas_controller.html#L77" class="js-smell-location">5</a>                  <a href="docentes_controller.html#L77" class="js-smell-location">6</a>                  <a href="elemento_forms_controller.html#L77" class="js-smell-location">7</a>                  <a href="elementos_controller.html#L76" class="js-smell-location">8</a>                  <a href="formularios_controller.html#L76" class="js-smell-location">9</a>                  <a href="resposta_elems_controller.html#L77" class="js-smell-location">10</a>                  <a href="resposta_forms_controller.html#L77" class="js-smell-location">11</a>                  <a href="turmas_controller.html#L76" class="js-smell-location">12</a>                  <a href="usuarios_controller.html#L179" class="js-smell-location">13</a>                  </div>  </li>  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Too-Many-Statements.md" target="_blank"><b>TooManyStatements</b></a>        </span>      </div>      <span>UsuariosController#destroy has approx 6 statements</span>          </div>  </li></ol>
+  @usuario.destroy!
+
+  respond_to do |format|
+    format.html { redirect_to usuarios_path, notice: &quot;Usuario was successfully destroyed.&quot;, status: :see_other }
+    format.json { head :no_content }
+  end
+end
+
+private
+
+# Busca o usuário pelo +:id+ da rota e o atribui a +@usuario+.
+#
+# @return [void]
+def set_usuario
+  @usuario = Usuario.find(params.expect(:id))
+end
+
+# Filtra os parâmetros permitidos para criação/atualização de usuário.
+#
+# @return [ActionController::Parameters] parâmetros filtrados do usuário
+def usuario_params
+  params.expect(usuario: [ :matricula, :email, :nome, :formacao, :type ])
+end
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/app/helpers/admin_helper_html.html b/doc/tmp/rubycritic/app/helpers/admin_helper_html.html new file mode 100644 index 0000000000..3bc7de6a03 --- /dev/null +++ b/doc/tmp/rubycritic/app/helpers/admin_helper_html.html @@ -0,0 +1,1753 @@ + + + + + + + +admin_helper.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-06-01 18:30:01 -0300'>2026-06-01 18:30:01 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>app/helpers /</small> admin_helper.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating a big">
+            A
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">2</span><small> lines of codes</small></div>
+            <div><span class="metric">0</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">N/A</span><small> complexity/method</small></div>
+            <div><span class="metric">1</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">0.0</span><small> complexity</small></div>
+            <div><span class="metric">0</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              1
+              smell
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code">module AdminHelper<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Irresponsible-Module.md" target="_blank"><b>IrresponsibleModule</b></a>        </span>      </div>      <span>AdminHelper has no descriptive comment</span>          </div>  </li></ol>
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/app/helpers/application_helper_html.html b/doc/tmp/rubycritic/app/helpers/application_helper_html.html new file mode 100644 index 0000000000..61fbd9cb37 --- /dev/null +++ b/doc/tmp/rubycritic/app/helpers/application_helper_html.html @@ -0,0 +1,1769 @@ + + + + + + + +application_helper.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-06-29 10:00:29 -0300'>2026-06-29 10:00:29 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>app/helpers /</small> application_helper.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating a big">
+            A
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">18</span><small> lines of codes</small></div>
+            <div><span class="metric">1</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">10.6</span><small> complexity/method</small></div>
+            <div><span class="metric">4</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">10.55</span><small> complexity</small></div>
+            <div><span class="metric">0</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              2
+              smells
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code">module ApplicationHelper<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Irresponsible-Module.md" target="_blank"><b>IrresponsibleModule</b></a>        </span>      </div>      <span>ApplicationHelper has no descriptive comment</span>          </div>  </li></ol>
+# Renderiza um ícone SVG inline a partir de um arquivo na pasta de assets.
+#
+# @param name [String] nome do arquivo SVG sem extensão (ex.: &quot;check&quot;, &quot;trash&quot;)
+# @param options [Hash] atributos HTML adicionais a serem aplicados ao elemento
+#   +&lt;span&gt;+ envolvente (ex.: &lt;tt&gt;class:&lt;/tt&gt;, &lt;tt&gt;id:&lt;/tt&gt;, &lt;tt&gt;data:&lt;/tt&gt;)
+# @return [ActiveSupport::SafeBuffer] elemento +&lt;span&gt;+ contendo o SVG inline;
+#   ou a string &lt;tt&gt;&quot;(ícone não encontrado)&quot;&lt;/tt&gt; caso o arquivo não exista
+def svg_icon(name, options = {})
+  file_path = Rails.root.join(&quot;app&quot;, &quot;assets&quot;, &quot;images&quot;, &quot;icons&quot;, &quot;#{name}.svg&quot;)
+  if File.exist?(file_path)
+    svg = File.read(file_path).html_safe
+    content_tag(:span, svg, options.merge(class: &quot;icon-wrapper #{options[:class]}&quot;))<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Feature-Envy.md" target="_blank"><b>FeatureEnvy</b></a>        </span>      </div>      <span>ApplicationHelper#svg_icon refers to 'options' more than self (maybe move it to another class?)</span>          </div>  </li></ol>
+  else
+    &quot;(ícone não encontrado)&quot;
+  end
+end
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/app/helpers/campo_forms_helper_html.html b/doc/tmp/rubycritic/app/helpers/campo_forms_helper_html.html new file mode 100644 index 0000000000..42974edc42 --- /dev/null +++ b/doc/tmp/rubycritic/app/helpers/campo_forms_helper_html.html @@ -0,0 +1,1753 @@ + + + + + + + +campo_forms_helper.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-05-27 21:40:34 -0300'>2026-05-27 21:40:34 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>app/helpers /</small> campo_forms_helper.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating a big">
+            A
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">2</span><small> lines of codes</small></div>
+            <div><span class="metric">0</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">N/A</span><small> complexity/method</small></div>
+            <div><span class="metric">1</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">0.0</span><small> complexity</small></div>
+            <div><span class="metric">0</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              1
+              smell
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code">module CampoFormsHelper<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Irresponsible-Module.md" target="_blank"><b>IrresponsibleModule</b></a>        </span>      </div>      <span>CampoFormsHelper has no descriptive comment</span>          </div>  </li></ol>
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/app/helpers/campos_helper_html.html b/doc/tmp/rubycritic/app/helpers/campos_helper_html.html new file mode 100644 index 0000000000..e4d26a3e2a --- /dev/null +++ b/doc/tmp/rubycritic/app/helpers/campos_helper_html.html @@ -0,0 +1,1753 @@ + + + + + + + +campos_helper.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-05-27 21:40:34 -0300'>2026-05-27 21:40:34 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>app/helpers /</small> campos_helper.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating a big">
+            A
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">2</span><small> lines of codes</small></div>
+            <div><span class="metric">0</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">N/A</span><small> complexity/method</small></div>
+            <div><span class="metric">1</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">0.0</span><small> complexity</small></div>
+            <div><span class="metric">0</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              1
+              smell
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code">module CamposHelper<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Irresponsible-Module.md" target="_blank"><b>IrresponsibleModule</b></a>        </span>      </div>      <span>CamposHelper has no descriptive comment</span>          </div>  </li></ol>
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/app/helpers/cursos_helper_html.html b/doc/tmp/rubycritic/app/helpers/cursos_helper_html.html new file mode 100644 index 0000000000..8a4df2ec7e --- /dev/null +++ b/doc/tmp/rubycritic/app/helpers/cursos_helper_html.html @@ -0,0 +1,1753 @@ + + + + + + + +cursos_helper.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-05-27 21:40:34 -0300'>2026-05-27 21:40:34 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>app/helpers /</small> cursos_helper.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating a big">
+            A
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">2</span><small> lines of codes</small></div>
+            <div><span class="metric">0</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">N/A</span><small> complexity/method</small></div>
+            <div><span class="metric">1</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">0.0</span><small> complexity</small></div>
+            <div><span class="metric">0</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              1
+              smell
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code">module CursosHelper<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Irresponsible-Module.md" target="_blank"><b>IrresponsibleModule</b></a>        </span>      </div>      <span>CursosHelper has no descriptive comment</span>          </div>  </li></ol>
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/app/helpers/departamentos_helper_html.html b/doc/tmp/rubycritic/app/helpers/departamentos_helper_html.html new file mode 100644 index 0000000000..cc4755dca1 --- /dev/null +++ b/doc/tmp/rubycritic/app/helpers/departamentos_helper_html.html @@ -0,0 +1,1753 @@ + + + + + + + +departamentos_helper.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-05-27 21:40:34 -0300'>2026-05-27 21:40:34 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>app/helpers /</small> departamentos_helper.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating a big">
+            A
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">2</span><small> lines of codes</small></div>
+            <div><span class="metric">0</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">N/A</span><small> complexity/method</small></div>
+            <div><span class="metric">1</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">0.0</span><small> complexity</small></div>
+            <div><span class="metric">0</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              1
+              smell
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code">module DepartamentosHelper<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Irresponsible-Module.md" target="_blank"><b>IrresponsibleModule</b></a>        </span>      </div>      <span>DepartamentosHelper has no descriptive comment</span>          </div>  </li></ol>
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/app/helpers/discentes_helper_html.html b/doc/tmp/rubycritic/app/helpers/discentes_helper_html.html new file mode 100644 index 0000000000..37774c39e0 --- /dev/null +++ b/doc/tmp/rubycritic/app/helpers/discentes_helper_html.html @@ -0,0 +1,1753 @@ + + + + + + + +discentes_helper.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-05-27 21:40:34 -0300'>2026-05-27 21:40:34 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>app/helpers /</small> discentes_helper.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating a big">
+            A
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">2</span><small> lines of codes</small></div>
+            <div><span class="metric">0</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">N/A</span><small> complexity/method</small></div>
+            <div><span class="metric">1</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">0.0</span><small> complexity</small></div>
+            <div><span class="metric">0</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              1
+              smell
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code">module DiscentesHelper<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Irresponsible-Module.md" target="_blank"><b>IrresponsibleModule</b></a>        </span>      </div>      <span>DiscentesHelper has no descriptive comment</span>          </div>  </li></ol>
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/app/helpers/disciplinas_helper_html.html b/doc/tmp/rubycritic/app/helpers/disciplinas_helper_html.html new file mode 100644 index 0000000000..4f89bfb7b3 --- /dev/null +++ b/doc/tmp/rubycritic/app/helpers/disciplinas_helper_html.html @@ -0,0 +1,1753 @@ + + + + + + + +disciplinas_helper.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-05-27 21:40:34 -0300'>2026-05-27 21:40:34 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>app/helpers /</small> disciplinas_helper.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating a big">
+            A
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">2</span><small> lines of codes</small></div>
+            <div><span class="metric">0</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">N/A</span><small> complexity/method</small></div>
+            <div><span class="metric">1</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">0.0</span><small> complexity</small></div>
+            <div><span class="metric">0</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              1
+              smell
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code">module DisciplinasHelper<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Irresponsible-Module.md" target="_blank"><b>IrresponsibleModule</b></a>        </span>      </div>      <span>DisciplinasHelper has no descriptive comment</span>          </div>  </li></ol>
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/app/helpers/docentes_helper_html.html b/doc/tmp/rubycritic/app/helpers/docentes_helper_html.html new file mode 100644 index 0000000000..dd250a7edf --- /dev/null +++ b/doc/tmp/rubycritic/app/helpers/docentes_helper_html.html @@ -0,0 +1,1753 @@ + + + + + + + +docentes_helper.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-05-27 21:40:34 -0300'>2026-05-27 21:40:34 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>app/helpers /</small> docentes_helper.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating a big">
+            A
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">2</span><small> lines of codes</small></div>
+            <div><span class="metric">0</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">N/A</span><small> complexity/method</small></div>
+            <div><span class="metric">1</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">0.0</span><small> complexity</small></div>
+            <div><span class="metric">0</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              1
+              smell
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code">module DocentesHelper<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Irresponsible-Module.md" target="_blank"><b>IrresponsibleModule</b></a>        </span>      </div>      <span>DocentesHelper has no descriptive comment</span>          </div>  </li></ol>
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/app/helpers/elemento_forms_helper_html.html b/doc/tmp/rubycritic/app/helpers/elemento_forms_helper_html.html new file mode 100644 index 0000000000..507e6b8202 --- /dev/null +++ b/doc/tmp/rubycritic/app/helpers/elemento_forms_helper_html.html @@ -0,0 +1,1753 @@ + + + + + + + +elemento_forms_helper.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-05-27 21:40:34 -0300'>2026-05-27 21:40:34 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>app/helpers /</small> elemento_forms_helper.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating a big">
+            A
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">2</span><small> lines of codes</small></div>
+            <div><span class="metric">0</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">N/A</span><small> complexity/method</small></div>
+            <div><span class="metric">1</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">0.0</span><small> complexity</small></div>
+            <div><span class="metric">0</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              1
+              smell
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code">module ElementoFormsHelper<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Irresponsible-Module.md" target="_blank"><b>IrresponsibleModule</b></a>        </span>      </div>      <span>ElementoFormsHelper has no descriptive comment</span>          </div>  </li></ol>
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/app/helpers/elementos_helper_html.html b/doc/tmp/rubycritic/app/helpers/elementos_helper_html.html new file mode 100644 index 0000000000..86df689bb7 --- /dev/null +++ b/doc/tmp/rubycritic/app/helpers/elementos_helper_html.html @@ -0,0 +1,1753 @@ + + + + + + + +elementos_helper.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-05-27 21:40:34 -0300'>2026-05-27 21:40:34 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>app/helpers /</small> elementos_helper.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating a big">
+            A
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">2</span><small> lines of codes</small></div>
+            <div><span class="metric">0</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">N/A</span><small> complexity/method</small></div>
+            <div><span class="metric">1</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">0.0</span><small> complexity</small></div>
+            <div><span class="metric">0</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              1
+              smell
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code">module ElementosHelper<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Irresponsible-Module.md" target="_blank"><b>IrresponsibleModule</b></a>        </span>      </div>      <span>ElementosHelper has no descriptive comment</span>          </div>  </li></ol>
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/app/helpers/formularios_helper_html.html b/doc/tmp/rubycritic/app/helpers/formularios_helper_html.html new file mode 100644 index 0000000000..26221f2114 --- /dev/null +++ b/doc/tmp/rubycritic/app/helpers/formularios_helper_html.html @@ -0,0 +1,1753 @@ + + + + + + + +formularios_helper.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-05-27 21:40:34 -0300'>2026-05-27 21:40:34 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>app/helpers /</small> formularios_helper.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating a big">
+            A
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">2</span><small> lines of codes</small></div>
+            <div><span class="metric">0</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">N/A</span><small> complexity/method</small></div>
+            <div><span class="metric">1</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">0.0</span><small> complexity</small></div>
+            <div><span class="metric">0</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              1
+              smell
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code">module FormulariosHelper<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Irresponsible-Module.md" target="_blank"><b>IrresponsibleModule</b></a>        </span>      </div>      <span>FormulariosHelper has no descriptive comment</span>          </div>  </li></ol>
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/app/helpers/resposta_elems_helper_html.html b/doc/tmp/rubycritic/app/helpers/resposta_elems_helper_html.html new file mode 100644 index 0000000000..361f64f042 --- /dev/null +++ b/doc/tmp/rubycritic/app/helpers/resposta_elems_helper_html.html @@ -0,0 +1,1753 @@ + + + + + + + +resposta_elems_helper.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-05-27 21:40:34 -0300'>2026-05-27 21:40:34 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>app/helpers /</small> resposta_elems_helper.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating a big">
+            A
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">2</span><small> lines of codes</small></div>
+            <div><span class="metric">0</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">N/A</span><small> complexity/method</small></div>
+            <div><span class="metric">1</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">0.0</span><small> complexity</small></div>
+            <div><span class="metric">0</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              1
+              smell
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code">module RespostaElemsHelper<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Irresponsible-Module.md" target="_blank"><b>IrresponsibleModule</b></a>        </span>      </div>      <span>RespostaElemsHelper has no descriptive comment</span>          </div>  </li></ol>
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/app/helpers/resposta_forms_helper_html.html b/doc/tmp/rubycritic/app/helpers/resposta_forms_helper_html.html new file mode 100644 index 0000000000..f3399bcbe7 --- /dev/null +++ b/doc/tmp/rubycritic/app/helpers/resposta_forms_helper_html.html @@ -0,0 +1,1753 @@ + + + + + + + +resposta_forms_helper.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-05-27 21:40:34 -0300'>2026-05-27 21:40:34 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>app/helpers /</small> resposta_forms_helper.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating a big">
+            A
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">2</span><small> lines of codes</small></div>
+            <div><span class="metric">0</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">N/A</span><small> complexity/method</small></div>
+            <div><span class="metric">1</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">0.0</span><small> complexity</small></div>
+            <div><span class="metric">0</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              1
+              smell
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code">module RespostaFormsHelper<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Irresponsible-Module.md" target="_blank"><b>IrresponsibleModule</b></a>        </span>      </div>      <span>RespostaFormsHelper has no descriptive comment</span>          </div>  </li></ol>
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/app/helpers/templates_helper_html.html b/doc/tmp/rubycritic/app/helpers/templates_helper_html.html new file mode 100644 index 0000000000..8809cff1ab --- /dev/null +++ b/doc/tmp/rubycritic/app/helpers/templates_helper_html.html @@ -0,0 +1,1753 @@ + + + + + + + +templates_helper.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-05-27 21:40:34 -0300'>2026-05-27 21:40:34 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>app/helpers /</small> templates_helper.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating a big">
+            A
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">2</span><small> lines of codes</small></div>
+            <div><span class="metric">0</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">N/A</span><small> complexity/method</small></div>
+            <div><span class="metric">1</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">0.0</span><small> complexity</small></div>
+            <div><span class="metric">0</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              1
+              smell
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code">module TemplatesHelper<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Irresponsible-Module.md" target="_blank"><b>IrresponsibleModule</b></a>        </span>      </div>      <span>TemplatesHelper has no descriptive comment</span>          </div>  </li></ol>
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/app/helpers/turmas_helper_html.html b/doc/tmp/rubycritic/app/helpers/turmas_helper_html.html new file mode 100644 index 0000000000..a4fd131707 --- /dev/null +++ b/doc/tmp/rubycritic/app/helpers/turmas_helper_html.html @@ -0,0 +1,1753 @@ + + + + + + + +turmas_helper.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-05-27 21:40:34 -0300'>2026-05-27 21:40:34 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>app/helpers /</small> turmas_helper.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating a big">
+            A
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">2</span><small> lines of codes</small></div>
+            <div><span class="metric">0</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">N/A</span><small> complexity/method</small></div>
+            <div><span class="metric">1</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">0.0</span><small> complexity</small></div>
+            <div><span class="metric">0</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              1
+              smell
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code">module TurmasHelper<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Irresponsible-Module.md" target="_blank"><b>IrresponsibleModule</b></a>        </span>      </div>      <span>TurmasHelper has no descriptive comment</span>          </div>  </li></ol>
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/app/helpers/usuarios_helper_html.html b/doc/tmp/rubycritic/app/helpers/usuarios_helper_html.html new file mode 100644 index 0000000000..dc2e83834e --- /dev/null +++ b/doc/tmp/rubycritic/app/helpers/usuarios_helper_html.html @@ -0,0 +1,1753 @@ + + + + + + + +usuarios_helper.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-05-27 21:40:34 -0300'>2026-05-27 21:40:34 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>app/helpers /</small> usuarios_helper.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating a big">
+            A
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">2</span><small> lines of codes</small></div>
+            <div><span class="metric">0</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">N/A</span><small> complexity/method</small></div>
+            <div><span class="metric">1</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">0.0</span><small> complexity</small></div>
+            <div><span class="metric">0</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              1
+              smell
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code">module UsuariosHelper<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Irresponsible-Module.md" target="_blank"><b>IrresponsibleModule</b></a>        </span>      </div>      <span>UsuariosHelper has no descriptive comment</span>          </div>  </li></ol>
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/app/jobs/application_job_html.html b/doc/tmp/rubycritic/app/jobs/application_job_html.html new file mode 100644 index 0000000000..fc91f6a7e7 --- /dev/null +++ b/doc/tmp/rubycritic/app/jobs/application_job_html.html @@ -0,0 +1,1758 @@ + + + + + + + +application_job.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-05-20 08:32:31 -0300'>2026-05-20 08:32:31 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>app/jobs /</small> application_job.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating a big">
+            A
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">7</span><small> lines of codes</small></div>
+            <div><span class="metric">0</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">N/A</span><small> complexity/method</small></div>
+            <div><span class="metric">1</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">0.0</span><small> complexity</small></div>
+            <div><span class="metric">0</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              1
+              smell
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code">class ApplicationJob &lt; ActiveJob::Base<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Irresponsible-Module.md" target="_blank"><b>IrresponsibleModule</b></a>        </span>      </div>      <span>ApplicationJob has no descriptive comment</span>          </div>  </li></ol>
+# Automatically retry jobs that encountered a deadlock
+# retry_on ActiveRecord::Deadlocked
+
+# Most jobs are safe to ignore if the underlying records are no longer available
+# discard_on ActiveJob::DeserializationError
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/app/mailers/application_mailer_html.html b/doc/tmp/rubycritic/app/mailers/application_mailer_html.html new file mode 100644 index 0000000000..0cf816aeb6 --- /dev/null +++ b/doc/tmp/rubycritic/app/mailers/application_mailer_html.html @@ -0,0 +1,1755 @@ + + + + + + + +application_mailer.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-06-14 16:59:45 -0300'>2026-06-14 16:59:45 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>app/mailers /</small> application_mailer.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating a big">
+            A
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">4</span><small> lines of codes</small></div>
+            <div><span class="metric">0</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">N/A</span><small> complexity/method</small></div>
+            <div><span class="metric">2</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">0.0</span><small> complexity</small></div>
+            <div><span class="metric">0</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              1
+              smell
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code">class ApplicationMailer &lt; ActionMailer::Base<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Irresponsible-Module.md" target="_blank"><b>IrresponsibleModule</b></a>        </span>      </div>      <span>ApplicationMailer has no descriptive comment</span>          </div>  </li></ol>
+default from: ENV.fetch(&quot;MAILER_FROM_ADDRESS&quot;, &quot;camaar@gmail.com&quot;)
+layout &quot;mailer&quot;
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/app/mailers/usuario_mailer_html.html b/doc/tmp/rubycritic/app/mailers/usuario_mailer_html.html new file mode 100644 index 0000000000..8a4bbe4c82 --- /dev/null +++ b/doc/tmp/rubycritic/app/mailers/usuario_mailer_html.html @@ -0,0 +1,1774 @@ + + + + + + + +usuario_mailer.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-06-29 10:00:29 -0300'>2026-06-29 10:00:29 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>app/mailers /</small> usuario_mailer.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating a big">
+            A
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">23</span><small> lines of codes</small></div>
+            <div><span class="metric">2</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">4.8</span><small> complexity/method</small></div>
+            <div><span class="metric">2</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">9.67</span><small> complexity</small></div>
+            <div><span class="metric">34</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              2
+              smells
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code">class UsuarioMailer &lt; ApplicationMailer<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Irresponsible-Module.md" target="_blank"><b>IrresponsibleModule</b></a>        </span>      </div>      <span>UsuarioMailer has no descriptive comment</span>          </div>  </li></ol>
+# Prepara o email de definição de senha inicial para o usuário.
+#
+# @param usuario [Usuario] destinatário do email, deve possuir +definicao_senha_token+ gerado
+# @return [Mail::Message] mensagem de email pronta para ser entregue
+def definicao_senha(usuario)<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="http://docs.seattlerb.org/flay/" target="_blank"><b>DuplicateCode</b></a>        </span>      </div>      <span>Similar code found in 2 nodes</span>              <span>Locations:</span>                  <a href="usuario_mailer.html#L6" class="js-smell-location">0</a>                  <a href="usuario_mailer.html#L17" class="js-smell-location">1</a>                  </div>  </li></ol>
+  @usuario = usuario
+  @url = edit_definicao_senha_url(token: usuario.definicao_senha_token)
+
+  mail(to: usuario.email, subject: &quot;Definição de senha&quot;)
+end
+
+# Prepara o email de redefinição de senha para o usuário.
+#
+# @param usuario [Usuario] destinatário do email, deve possuir +redefinicao_senha_token+ gerado
+# @return [Mail::Message] mensagem de email pronta para ser entregue
+def redefinicao_senha(usuario)<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="http://docs.seattlerb.org/flay/" target="_blank"><b>DuplicateCode</b></a>        </span>      </div>      <span>Similar code found in 2 nodes</span>              <span>Locations:</span>                  <a href="usuario_mailer.html#L6" class="js-smell-location">0</a>                  <a href="usuario_mailer.html#L17" class="js-smell-location">1</a>                  </div>  </li></ol>
+  @usuario = usuario
+  @url = edit_redefinicao_senha_url(token: usuario.redefinicao_senha_token)
+
+  mail(to: usuario.email, subject: &quot;Redefinição de senha&quot;)
+end
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/app/models/administrador_html.html b/doc/tmp/rubycritic/app/models/administrador_html.html new file mode 100644 index 0000000000..52fb69b3fd --- /dev/null +++ b/doc/tmp/rubycritic/app/models/administrador_html.html @@ -0,0 +1,1758 @@ + + + + + + + +administrador.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-06-29 10:00:29 -0300'>2026-06-29 10:00:29 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>app/models /</small> administrador.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating a big">
+            A
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">10</span><small> lines of codes</small></div>
+            <div><span class="metric">0</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">N/A</span><small> complexity/method</small></div>
+            <div><span class="metric">4</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">0.0</span><small> complexity</small></div>
+            <div><span class="metric">0</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              0
+              smell
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code"># Representa um usuário com perfil de administrador do sistema.
+ +

# # Herda de Usuario e adiciona a obrigatoriedade de estar vinculado a um # Departamento. Possui acesso exclusivo às funcionalidades de gerenciamento, # envio de formulários e sincronização com o SIGAA, além de poder criar e # gerenciar +Template+s de avaliação. class Administrador &lt; Usuario

+ +
has_many :templates, foreign_key: &quot;usuario_id&quot;, dependent: :destroy
+validates :departamento_id, presence: true
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/app/models/application_record_html.html b/doc/tmp/rubycritic/app/models/application_record_html.html new file mode 100644 index 0000000000..f235ba8556 --- /dev/null +++ b/doc/tmp/rubycritic/app/models/application_record_html.html @@ -0,0 +1,1754 @@ + + + + + + + +application_record.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-05-20 08:32:31 -0300'>2026-05-20 08:32:31 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>app/models /</small> application_record.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating a big">
+            A
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">3</span><small> lines of codes</small></div>
+            <div><span class="metric">0</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">N/A</span><small> complexity/method</small></div>
+            <div><span class="metric">1</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">0.0</span><small> complexity</small></div>
+            <div><span class="metric">0</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              1
+              smell
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code">class ApplicationRecord &lt; ActiveRecord::Base<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Irresponsible-Module.md" target="_blank"><b>IrresponsibleModule</b></a>        </span>      </div>      <span>ApplicationRecord has no descriptive comment</span>          </div>  </li></ol>
+primary_abstract_class
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/app/models/campo_form_html.html b/doc/tmp/rubycritic/app/models/campo_form_html.html new file mode 100644 index 0000000000..faaa945efe --- /dev/null +++ b/doc/tmp/rubycritic/app/models/campo_form_html.html @@ -0,0 +1,1760 @@ + + + + + + + +campo_form.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-06-29 10:00:29 -0300'>2026-06-29 10:00:29 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>app/models /</small> campo_form.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating a big">
+            A
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">10</span><small> lines of codes</small></div>
+            <div><span class="metric">0</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">N/A</span><small> complexity/method</small></div>
+            <div><span class="metric">3</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">0.0</span><small> complexity</small></div>
+            <div><span class="metric">0</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              0
+              smell
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code"># Representa uma opção de resposta instanciada em um +ElementoForm+.
+ +

# # É criado a partir de um Campo de template no momento em que o formulário # é enviado a uma turma. Quando um usuário seleciona esta opção, um # RespostaElem é criado referenciando este campo. class CampoForm &lt; ApplicationRecord

+ +
belongs_to :elemento_form
+has_many :resposta_elems, dependent: :destroy
+validates :ordem, presence: true
+
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/app/models/campo_html.html b/doc/tmp/rubycritic/app/models/campo_html.html new file mode 100644 index 0000000000..27493a4579 --- /dev/null +++ b/doc/tmp/rubycritic/app/models/campo_html.html @@ -0,0 +1,1761 @@ + + + + + + + +campo.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-06-29 10:00:29 -0300'>2026-06-29 10:00:29 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>app/models /</small> campo.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating a big">
+            A
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">11</span><small> lines of codes</small></div>
+            <div><span class="metric">0</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">N/A</span><small> complexity/method</small></div>
+            <div><span class="metric">3</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">0.0</span><small> complexity</small></div>
+            <div><span class="metric">0</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              0
+              smell
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code"># Representa uma opção de resposta ou configuração de tipo dentro de um +Elemento+.
+ +

# # Cada campo pertence a um Elemento de template e define o tipo_elemento # (&quot;Texto&quot;, &quot;Múltipla Escolha&quot;, etc.) e o enunciado da opção. A ordem é única # dentro do escopo do elemento pai. class Campo &lt; ApplicationRecord

+ +
belongs_to :elemento
+validates :ordem, presence: true
+validates :ordem, uniqueness: { scope: :elemento_id }
+validates :tipo_elemento, presence: true
+
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/app/models/curso_html.html b/doc/tmp/rubycritic/app/models/curso_html.html new file mode 100644 index 0000000000..963d4ea0ff --- /dev/null +++ b/doc/tmp/rubycritic/app/models/curso_html.html @@ -0,0 +1,1761 @@ + + + + + + + +curso.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-06-29 10:00:29 -0300'>2026-06-29 10:00:29 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>app/models /</small> curso.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating a big">
+            A
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">10</span><small> lines of codes</small></div>
+            <div><span class="metric">0</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">N/A</span><small> complexity/method</small></div>
+            <div><span class="metric">3</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">0.0</span><small> complexity</small></div>
+            <div><span class="metric">0</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              0
+              smell
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code"># Representa um curso de graduação ou pós-graduação.
+ +

# # Pertence a um Departamento e agrega os +Discente+s nele matriculados. # Identificado de forma única pelo atributo codigo. class Curso &lt; ApplicationRecord

+ +
belongs_to :departamento
+has_many :discentes
+validates :codigo, presence: true, uniqueness: true
+validates :nome, presence: true
+
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/app/models/departamento_html.html b/doc/tmp/rubycritic/app/models/departamento_html.html new file mode 100644 index 0000000000..ae63216d77 --- /dev/null +++ b/doc/tmp/rubycritic/app/models/departamento_html.html @@ -0,0 +1,1762 @@ + + + + + + + +departamento.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-06-29 10:00:29 -0300'>2026-06-29 10:00:29 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>app/models /</small> departamento.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating a big">
+            A
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">12</span><small> lines of codes</small></div>
+            <div><span class="metric">0</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">N/A</span><small> complexity/method</small></div>
+            <div><span class="metric">3</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">0.0</span><small> complexity</small></div>
+            <div><span class="metric">0</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              0
+              smell
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code"># Representa um departamento acadêmico da instituição.
+ +

# # Agrupa +Curso+s, +Disciplina+s e +Administrador+es. Não pode ser excluído # enquanto houver cursos ou disciplinas vinculados (restrict_with_error). # Identificado de forma única pelo atributo codigo. class Departamento &lt; ApplicationRecord

+ +
has_many :cursos, dependent: :restrict_with_error
+has_many :disciplinas, dependent: :restrict_with_error
+has_many :administradores
+validates :codigo, presence: true, uniqueness: true
+validates :nome, presence: true
+
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/app/models/discente_html.html b/doc/tmp/rubycritic/app/models/discente_html.html new file mode 100644 index 0000000000..04a848eec9 --- /dev/null +++ b/doc/tmp/rubycritic/app/models/discente_html.html @@ -0,0 +1,1758 @@ + + + + + + + +discente.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-06-29 10:00:29 -0300'>2026-06-29 10:00:29 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>app/models /</small> discente.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating a big">
+            A
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">9</span><small> lines of codes</small></div>
+            <div><span class="metric">0</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">N/A</span><small> complexity/method</small></div>
+            <div><span class="metric">4</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">0.0</span><small> complexity</small></div>
+            <div><span class="metric">0</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              0
+              smell
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code"># Representa um estudante (aluno) cadastrado no sistema.
+ +

# # Herda de Usuario e obrigatoriamente pertence a um Curso. Pode estar # matriculado em múltiplas +Turma+s, nas quais receberá formulários de # avaliação para responder. class Discente &lt; Usuario

+ +
validates :curso_id, presence: true
+has_and_belongs_to_many :turmas, join_table: &quot;discentes_turmas&quot;
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/app/models/disciplina_html.html b/doc/tmp/rubycritic/app/models/disciplina_html.html new file mode 100644 index 0000000000..24608c37ab --- /dev/null +++ b/doc/tmp/rubycritic/app/models/disciplina_html.html @@ -0,0 +1,1761 @@ + + + + + + + +disciplina.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-06-29 10:00:29 -0300'>2026-06-29 10:00:29 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>app/models /</small> disciplina.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating a big">
+            A
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">10</span><small> lines of codes</small></div>
+            <div><span class="metric">0</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">N/A</span><small> complexity/method</small></div>
+            <div><span class="metric">3</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">0.0</span><small> complexity</small></div>
+            <div><span class="metric">0</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              0
+              smell
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code"># Representa uma disciplina ofertada por um +Departamento+.
+ +

# # Pode ter múltiplas +Turma+s associadas (uma por semestre/oferta). Identificada # de forma única pelo atributo codigo, que corresponde ao código do SIGAA. class Disciplina &lt; ApplicationRecord

+ +
belongs_to :departamento
+has_many :turmas, dependent: :destroy
+validates :codigo, presence: true, uniqueness: true
+validates :nome, presence: true
+
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/app/models/docente_html.html b/doc/tmp/rubycritic/app/models/docente_html.html new file mode 100644 index 0000000000..efadcfbaf7 --- /dev/null +++ b/doc/tmp/rubycritic/app/models/docente_html.html @@ -0,0 +1,1758 @@ + + + + + + + +docente.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-06-29 10:00:29 -0300'>2026-06-29 10:00:29 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>app/models /</small> docente.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating a big">
+            A
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">9</span><small> lines of codes</small></div>
+            <div><span class="metric">0</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">N/A</span><small> complexity/method</small></div>
+            <div><span class="metric">4</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">0.0</span><small> complexity</small></div>
+            <div><span class="metric">0</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              0
+              smell
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code"># Representa um professor vinculado a uma ou mais turmas.
+ +

# # Herda de Usuario e exige que o atributo formacao esteja preenchido. # Pode estar associado a múltiplas +Turma+s e é alvo das avaliações # respondidas pelos discentes via Formulario. class Docente &lt; Usuario

+ +
validates :formacao, presence: true
+has_and_belongs_to_many :turmas, join_table: &quot;docentes_turmas&quot;
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/app/models/elemento_form_html.html b/doc/tmp/rubycritic/app/models/elemento_form_html.html new file mode 100644 index 0000000000..9001abf4b5 --- /dev/null +++ b/doc/tmp/rubycritic/app/models/elemento_form_html.html @@ -0,0 +1,1760 @@ + + + + + + + +elemento_form.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-06-29 10:00:29 -0300'>2026-06-29 10:00:29 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>app/models /</small> elemento_form.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating a big">
+            A
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">10</span><small> lines of codes</small></div>
+            <div><span class="metric">0</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">N/A</span><small> complexity/method</small></div>
+            <div><span class="metric">3</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">0.0</span><small> complexity</small></div>
+            <div><span class="metric">0</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              0
+              smell
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code"># Representa uma questão instanciada em um +Formulario+ de avaliação.
+ +

# # É criado a partir de um Elemento de template no momento em que o formulário # é enviado a uma turma. Contém o enunciado e o tipo da questão, e agrupa os # +CampoForm+s com as opções de resposta disponíveis. class ElementoForm &lt; ApplicationRecord

+ +
belongs_to :formulario
+has_many :campo_forms, dependent: :destroy
+validates :ordem, presence: true
+
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/app/models/elemento_html.html b/doc/tmp/rubycritic/app/models/elemento_html.html new file mode 100644 index 0000000000..fb95b929fb --- /dev/null +++ b/doc/tmp/rubycritic/app/models/elemento_html.html @@ -0,0 +1,1760 @@ + + + + + + + +elemento.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-06-29 10:00:29 -0300'>2026-06-29 10:00:29 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>app/models /</small> elemento.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating a big">
+            A
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">10</span><small> lines of codes</small></div>
+            <div><span class="metric">0</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">N/A</span><small> complexity/method</small></div>
+            <div><span class="metric">4</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">0.0</span><small> complexity</small></div>
+            <div><span class="metric">0</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              0
+              smell
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code"># Representa uma questão dentro de um +Template+ de avaliação.
+ +

# # Contém um enunciado e uma ordem de exibição, além de possuir múltiplos # +Campo+s que definem as opções de resposta (para questões de múltipla # escolha) ou configuram o tipo da questão. class Elemento &lt; ApplicationRecord

+ +
belongs_to :template
+has_many :campos, dependent: :destroy
+accepts_nested_attributes_for :campos, allow_destroy: true
+
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/app/models/formulario_html.html b/doc/tmp/rubycritic/app/models/formulario_html.html new file mode 100644 index 0000000000..2ebf70c2a5 --- /dev/null +++ b/doc/tmp/rubycritic/app/models/formulario_html.html @@ -0,0 +1,1760 @@ + + + + + + + +formulario.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-06-29 10:00:29 -0300'>2026-06-29 10:00:29 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>app/models /</small> formulario.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating a big">
+            A
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">10</span><small> lines of codes</small></div>
+            <div><span class="metric">0</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">N/A</span><small> complexity/method</small></div>
+            <div><span class="metric">5</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">0.0</span><small> complexity</small></div>
+            <div><span class="metric">0</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              0
+              smell
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code"># Representa um formulário de avaliação enviado a uma turma.
+ +

# # É criado a partir de um Template e associado a uma Turma. Contém os # +ElementoForm+s (questões) que os usuários respondem, e agrega as # +RespostaForm+s submetidas pelos participantes. class Formulario &lt; ApplicationRecord

+ +
belongs_to :turma
+has_many :elemento_forms, dependent: :destroy
+has_many :resposta_forms, dependent: :destroy
+
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/app/models/resposta_elem_html.html b/doc/tmp/rubycritic/app/models/resposta_elem_html.html new file mode 100644 index 0000000000..5529596acb --- /dev/null +++ b/doc/tmp/rubycritic/app/models/resposta_elem_html.html @@ -0,0 +1,1761 @@ + + + + + + + +resposta_elem.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-06-29 10:00:29 -0300'>2026-06-29 10:00:29 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>app/models /</small> resposta_elem.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating a big">
+            A
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">11</span><small> lines of codes</small></div>
+            <div><span class="metric">0</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">N/A</span><small> complexity/method</small></div>
+            <div><span class="metric">3</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">0.0</span><small> complexity</small></div>
+            <div><span class="metric">0</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              0
+              smell
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code"># Representa a resposta de um usuário a um elemento (questão) específico do formulário.
+ +

# # Pertence a uma RespostaForm e ao ElementoForm respondido. Para questões de # múltipla escolha, também referencia o CampoForm selecionado. Para questões de # texto livre, campo_form é opcional e o conteúdo fica em texto_resposta. class RespostaElem &lt; ApplicationRecord

+ +
belongs_to :resposta_form
+belongs_to :elemento_form
+belongs_to :campo_form, optional: true
+validates :texto_resposta, presence: true
+
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/app/models/resposta_form_html.html b/doc/tmp/rubycritic/app/models/resposta_form_html.html new file mode 100644 index 0000000000..ced51dcb27 --- /dev/null +++ b/doc/tmp/rubycritic/app/models/resposta_form_html.html @@ -0,0 +1,1764 @@ + + + + + + + +resposta_form.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-06-29 10:00:29 -0300'>2026-06-29 10:00:29 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>app/models /</small> resposta_form.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating a big">
+            A
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">14</span><small> lines of codes</small></div>
+            <div><span class="metric">0</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">N/A</span><small> complexity/method</small></div>
+            <div><span class="metric">3</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">0.0</span><small> complexity</small></div>
+            <div><span class="metric">0</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              0
+              smell
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code"># Representa a submissão completa de um formulário de avaliação por um usuário.
+ +

# # Registra qual Usuario respondeu qual Formulario e em que data. Um usuário # só pode submeter uma resposta por formulário (unicidade do par usuario_id + # formulario_id). Agrega os +RespostaElem+s com as respostas individuais a cada questão. class RespostaForm &lt; ApplicationRecord

+ +
belongs_to :formulario
+belongs_to :usuario
+has_many :resposta_elems, dependent: :destroy
+validates :data_submissao, presence: true
+validates :usuario_id, uniqueness: {
+  scope: :formulario_id
+}
+
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/app/models/template_html.html b/doc/tmp/rubycritic/app/models/template_html.html new file mode 100644 index 0000000000..f2119212eb --- /dev/null +++ b/doc/tmp/rubycritic/app/models/template_html.html @@ -0,0 +1,1810 @@ + + + + + + + +template.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-06-29 10:00:29 -0300'>2026-06-29 10:00:29 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>app/models /</small> template.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating a big">
+            A
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">61</span><small> lines of codes</small></div>
+            <div><span class="metric">3</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">13.6</span><small> complexity/method</small></div>
+            <div><span class="metric">5</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">40.84</span><small> complexity</small></div>
+            <div><span class="metric">0</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              3
+              smells
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code"># Representa um modelo reutilizável de formulário criado por um +Administrador+.
+ +

# # Contém um conjunto ordenado de +Elemento+s (questões), cada um com seus # +Campo+s (opções). Ao ser enviado a turmas, o template é instanciado em # +Formulario+s com +ElementoForm+s e +CampoForm+s correspondentes. class Template &lt; ApplicationRecord

+ +
belongs_to :administrador, foreign_key: &quot;usuario_id&quot;, class_name: &quot;Administrador&quot;
+has_many :elementos, dependent: :destroy
+accepts_nested_attributes_for :elementos, allow_destroy: true
+
+validate :validar_titulo
+validate :validar_elementos
+validate :validar_preenchimento
+
+private
+
+# Valida que o nome do template não está em branco.
+#
+# @return [void]
+# @note Adiciona erro em +:base+ se o atributo +nome+ estiver vazio.
+def validar_titulo
+  if nome.blank?
+    errors.add(:base, &quot;Título não pode ficar em branco!&quot;)
+  end
+end
+
+# Valida que o template possui pelo menos um elemento não marcado para exclusão.
+#
+# @return [void]
+# @note Adiciona erro em +:base+ se nenhum elemento sobreviver à filtragem de
+#   +marked_for_destruction?+.
+def validar_elementos
+  if elementos.reject(&amp;:marked_for_destruction?).empty?
+    errors.add(:base, &quot;Template deve ter pelo menos um elemento!&quot;)
+  end
+end
+
+# Valida que todos os elementos e seus campos estão devidamente preenchidos.
+#
+# @return [void]
+# @note Adiciona erro em +:base+ e interrompe a execução na primeira violação
+#   encontrada: enunciado de elemento em branco, ou enunciado de campo em branco
+#   quando o tipo do campo não é &quot;Texto&quot;. Não é executada se já existirem erros
+#   prévios.
+def validar_preenchimento<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="http://docs.seattlerb.org/flog/" target="_blank"><b>HighComplexity</b></a>        </span>      </div>      <span>Template#validar_preenchimento has a flog score of 29</span>          </div>  </li>  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Too-Many-Statements.md" target="_blank"><b>TooManyStatements</b></a>        </span>      </div>      <span>Template#validar_preenchimento has approx 7 statements</span>          </div>  </li></ol>
+  return if errors.any?
+  elementos.reject(&amp;:marked_for_destruction?).each do |elemento|
+    if elemento.enunciado.blank?
+      errors.add(:base, &quot;O texto de todas as questões deve ser preenchido!&quot;)
+      return # Para a execução aqui para não repetir a mensagem várias vezes
+    end
+
+    elemento.campos.reject(&amp;:marked_for_destruction?).each do |campo|<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Nested-Iterators.md" target="_blank"><b>NestedIterators</b></a>        </span>      </div>      <span>Template#validar_preenchimento contains iterators nested 2 deep</span>          </div>  </li></ol>
+      if campo.tipo_elemento != &quot;Texto&quot; &amp;&amp; campo.enunciado.blank?
+        errors.add(:base, &quot;Todas as opções das questões devem ser preenchidas!&quot;)
+        return
+      end
+    end
+  end
+end
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/app/models/turma_html.html b/doc/tmp/rubycritic/app/models/turma_html.html new file mode 100644 index 0000000000..87c153041d --- /dev/null +++ b/doc/tmp/rubycritic/app/models/turma_html.html @@ -0,0 +1,1765 @@ + + + + + + + +turma.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-06-29 10:00:29 -0300'>2026-06-29 10:00:29 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>app/models /</small> turma.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating a big">
+            A
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">16</span><small> lines of codes</small></div>
+            <div><span class="metric">0</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">N/A</span><small> complexity/method</small></div>
+            <div><span class="metric">4</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">0.0</span><small> complexity</small></div>
+            <div><span class="metric">0</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              0
+              smell
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code"># Representa uma oferta de disciplina em um determinado semestre.
+ +

# # Agrupa +Discente+s e +Docente+s que cursam/ministram uma Disciplina em um # semestre específico. Cada turma pode ter múltiplos +Formulario+s de avaliação # associados. O número da turma é único dentro do escopo de semestre e disciplina. class Turma &lt; ApplicationRecord

+ +
belongs_to :disciplina
+has_many :formularios, dependent: :destroy
+has_and_belongs_to_many :discentes, join_table: &quot;discentes_turmas&quot;
+has_and_belongs_to_many :docentes, join_table: &quot;docentes_turmas&quot;
+
+validates :numero_da_turma, presence: true, uniqueness: {
+  scope: [ :semestre, :disciplina_id ]
+}
+validates :semestre, presence: true
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/app/models/usuario_html.html b/doc/tmp/rubycritic/app/models/usuario_html.html new file mode 100644 index 0000000000..cc26058562 --- /dev/null +++ b/doc/tmp/rubycritic/app/models/usuario_html.html @@ -0,0 +1,1880 @@ + + + + + + + +usuario.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-06-29 10:00:29 -0300'>2026-06-29 10:00:29 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>app/models /</small> usuario.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating a big">
+            A
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">132</span><small> lines of codes</small></div>
+            <div><span class="metric">11</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">4.0</span><small> complexity/method</small></div>
+            <div><span class="metric">4</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">43.76</span><small> complexity</small></div>
+            <div><span class="metric">0</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              7
+              smells
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code"># Classe base para todos os usuários do sistema (STI).
+ +

# # Gerencia autenticação via BCrypt e tokens de email para definição e # redefinição de senha. As subclasses concretas são Administrador, # Docente e Discente, diferenciadas pela coluna type (Single Table # Inheritance). class Usuario &lt; ApplicationRecord

+ +
belongs_to :curso, optional: true
+belongs_to :departamento, optional: true
+validates :matricula, presence: true, uniqueness: true
+validates :email, presence: true, uniqueness: true
+validates :nome, presence: true
+
+attr_reader :senha
+attr_accessor :senha_confirmation<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Attribute.md" target="_blank"><b>Attribute</b></a>        </span>      </div>      <span>Usuario#senha_confirmation is a writable attribute</span>          </div>  </li></ol>
+
+before_save :atualizar_senha_hash, if: -&gt; { senha.present? }
+validate :validar_senha, if: -&gt; { senha.present? }
+
+# Armazena a senha em texto plano em atributo virtual para uso nas validações e no hash.
+#
+# @param nova_senha [String] senha em texto plano fornecida pelo usuário
+# @return [String] a mesma senha recebida
+def senha=(nova_senha)
+  @senha = nova_senha
+end
+
+# Verifica se o usuário já possui uma senha cadastrada.
+#
+# @return [Boolean] +true+ se o hash de senha estiver presente, +false+ caso contrário
+def senha_definida?
+  senha_hash.present?
+end
+
+# Verifica se a senha fornecida corresponde ao hash armazenado.
+#
+# @param tentativa [String] senha em texto plano a ser verificada
+# @return [Boolean] +true+ se a senha conferir, +false+ caso contrário ou se o hash
+#   for inválido
+def autenticar_senha(tentativa)
+  return false if senha_hash.blank?
+
+  BCrypt::Password.new(senha_hash) == tentativa
+rescue BCrypt::Errors::InvalidHash
+  false
+end
+
+# Gera e persiste um token de definição de senha com a data/hora atual.
+#
+# @return [void]
+# @note Atualiza os campos +definicao_senha_token+ e +definicao_senha_sent_at+
+#   diretamente no banco de dados.
+def gerar_definicao_senha_token!<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Missing-Safe-Method.md" target="_blank"><b>MissingSafeMethod</b></a>        </span>      </div>      <span>Usuario has missing safe method 'gerar_definicao_senha_token!'</span>          </div>  </li></ol>
+  update!(
+    definicao_senha_token: SecureRandom.urlsafe_base64(32),
+    definicao_senha_sent_at: Time.current
+  )
+end
+
+# Gera o token de definição de senha e envia o email correspondente ao usuário.
+#
+# @return [void]
+# @note Chama +gerar_definicao_senha_token!+ e dispara o envio do email via
+#   +UsuarioMailer#definicao_senha+ de forma síncrona.
+def enviar_email_definicao_senha!<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Missing-Safe-Method.md" target="_blank"><b>MissingSafeMethod</b></a>        </span>      </div>      <span>Usuario has missing safe method 'enviar_email_definicao_senha!'</span>          </div>  </li></ol>
+  gerar_definicao_senha_token!
+  UsuarioMailer.definicao_senha(self).deliver_now
+end
+
+# Gera e persiste um token de redefinição de senha com a data/hora atual.
+#
+# @return [void]
+# @note Atualiza os campos +redefinicao_senha_token+ e +redefinicao_senha_sent_at+
+#   diretamente no banco de dados.
+def gerar_redefinicao_senha_token!<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Missing-Safe-Method.md" target="_blank"><b>MissingSafeMethod</b></a>        </span>      </div>      <span>Usuario has missing safe method 'gerar_redefinicao_senha_token!'</span>          </div>  </li></ol>
+  update!(
+    redefinicao_senha_token: SecureRandom.urlsafe_base64(32),
+    redefinicao_senha_sent_at: Time.current
+  )
+end
+
+# Gera o token de redefinição de senha e envia o email correspondente ao usuário.
+#
+# @return [void]
+# @note Chama +gerar_redefinicao_senha_token!+ e dispara o envio do email via
+#   +UsuarioMailer#redefinicao_senha+ de forma síncrona.
+def enviar_email_redefinicao_senha!<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Missing-Safe-Method.md" target="_blank"><b>MissingSafeMethod</b></a>        </span>      </div>      <span>Usuario has missing safe method 'enviar_email_redefinicao_senha!'</span>          </div>  </li></ol>
+  gerar_redefinicao_senha_token!
+  UsuarioMailer.redefinicao_senha(self).deliver_now
+end
+
+# Remove o token de redefinição de senha e a data de envio do banco de dados.
+#
+# @return [void]
+# @note Define +redefinicao_senha_token+ e +redefinicao_senha_sent_at+ como +nil+.
+def limpar_redefinicao_senha_token!<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Missing-Safe-Method.md" target="_blank"><b>MissingSafeMethod</b></a>        </span>      </div>      <span>Usuario has missing safe method 'limpar_redefinicao_senha_token!'</span>          </div>  </li></ol>
+  update!(redefinicao_senha_token: nil, redefinicao_senha_sent_at: nil)
+end
+
+# Remove o token de definição de senha e a data de envio do banco de dados.
+#
+# @return [void]
+# @note Define +definicao_senha_token+ e +definicao_senha_sent_at+ como +nil+.
+def limpar_definicao_senha_token!<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Missing-Safe-Method.md" target="_blank"><b>MissingSafeMethod</b></a>        </span>      </div>      <span>Usuario has missing safe method 'limpar_definicao_senha_token!'</span>          </div>  </li></ol>
+  update!(definicao_senha_token: nil, definicao_senha_sent_at: nil)
+end
+
+private
+
+# Valida a confirmação e o tamanho mínimo da senha.
+#
+# @return [void]
+# @note Adiciona erros em +:senha+ se a confirmação não conferir ou se a senha tiver
+#   menos de 6 caracteres.
+def validar_senha
+  if senha_confirmation.present? &amp;&amp; senha != senha_confirmation
+    errors.add(:senha, :confirmation, message: &quot;confirmação não confere&quot;)
+  end
+
+  if senha.length &lt; 6
+    errors.add(:senha, :invalid, message: &quot;senha inválida&quot;)
+  end
+end
+
+# Gera e armazena o hash BCrypt da senha antes de salvar o registro.
+#
+# @return [void]
+# @note Atualiza o campo virtual +senha_hash+ com o resultado de +BCrypt::Password.create+.
+def atualizar_senha_hash
+  self.senha_hash = BCrypt::Password.create(senha)
+end
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/app/services/sigaa_importer_html.html b/doc/tmp/rubycritic/app/services/sigaa_importer_html.html new file mode 100644 index 0000000000..9682841091 --- /dev/null +++ b/doc/tmp/rubycritic/app/services/sigaa_importer_html.html @@ -0,0 +1,2140 @@ + + + + + + + +sigaa_importer.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-06-29 19:51:36 -0300'>2026-06-29 19:51:36 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>app/services /</small> sigaa_importer.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating d big">
+            D
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">399</span><small> lines of codes</small></div>
+            <div><span class="metric">25</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">8.2</span><small> complexity/method</small></div>
+            <div><span class="metric">7</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">204.8</span><small> complexity</small></div>
+            <div><span class="metric">0</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              29
+              smells
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code"># Serviço responsável pela importação e atualização de dados acadêmicos a partir
+ +

# dos arquivos JSON exportados pelo SIGAA (Sistema Integrado de Gestão de Atividades # Acadêmicas). # # Processa dois arquivos: o de turmas/disciplinas (classes.json) e o de membros # (class_members.json), criando ou atualizando +Departamento+s, +Disciplina+s, # +Turma+s, +Docente+s, +Discente+s e +Curso+s dentro de uma única transação. # Toda a lógica de persistência é encapsulada em métodos privados especializados, # mantendo os métodos públicos enxutos. # # Os métodos de classe (self.import_from_files, self.update_from_files) são # a interface pública recomendada; eles delegam para instâncias privadas para # facilitar testes e reutilização interna. class SigaaImporter<ol class=“nocode errors smells”> <li> <div class=“description”> <div class=“heading”> <span> <i class=“fa fa-warning” aria-hidden=“true”></i> <a href=“github.com/troessner/reek/blob/master/docs/Too-Many-Methods.md” target=“_blank”>TooManyMethods</a> </span> </div> <span>SigaaImporter has at least 23 methods</span> </div> </li></ol>

+ +
DEFAULT_DEP_CODIGO = &quot;NAO_ESP&quot;.freeze
+DEFAULT_DEP_NOME   = &quot;Não especificado&quot;.freeze
+
+# Agrupa o hash de membro com a turma correspondente, eliminando a necessidade
+# de passar ambos como argumentos separados em todos os métodos de processamento.
+MemberEntry = Struct.new(:member_hash, :turma)
+
+# Importa disciplinas, turmas, docentes e discentes a partir dos arquivos JSON do SIGAA.
+#
+# Registros já existentes no banco de dados (identificados por código ou email/matrícula)
+# são ignorados; somente novos registros são criados.
+#
+# @param classes_path [String] caminho para o arquivo JSON com os dados das turmas/disciplinas
+# @param members_path [String] caminho para o arquivo JSON com os dados dos membros (docentes e discentes)
+# @return [String] mensagem descrevendo o resultado da operação
+def self.import_from_files(classes_path, members_path)
+  new.import_from_files(classes_path, members_path)
+end
+
+# Executa a importação propriamente dita (método de instância delegado pelo class method).
+#
+# @param classes_path [String] caminho para o arquivo JSON de turmas/disciplinas
+# @param members_path [String] caminho para o arquivo JSON de membros
+# @return [String] mensagem de resultado da operação
+# @note Toda a operação roda dentro de uma transação; em caso de erro a transação
+#   é revertida e retorna &quot;a importação falhou&quot;.
+def import_from_files(classes_path, members_path)<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Too-Many-Statements.md" target="_blank"><b>TooManyStatements</b></a>        </span>      </div>      <span>SigaaImporter#import_from_files has approx 7 statements</span>          </div>  </li></ol>
+  counters = { created: 0, ignored: 0 }
+
+  ActiveRecord::Base.transaction do
+    dep_padrao
+    import_classes_into(classes_path, counters)
+    import_members_into(members_path, counters)
+  end
+
+  build_import_result(counters)
+rescue StandardError
+  &quot;a importação falhou&quot;
+end
+
+# Atualiza disciplinas, turmas, docentes e discentes existentes a partir dos arquivos JSON do SIGAA.
+#
+# @param classes_path [String] caminho para o arquivo JSON com os dados das turmas/disciplinas
+# @param members_path [String] caminho para o arquivo JSON com os dados dos membros (docentes e discentes)
+# @return [String] mensagem descrevendo o resultado da operação
+def self.update_from_files(classes_path, members_path)
+  new.update_from_files(classes_path, members_path)
+end
+
+# Executa a atualização propriamente dita (método de instância delegado pelo class method).
+#
+# @param classes_path [String] caminho para o arquivo JSON de turmas/disciplinas
+# @param members_path [String] caminho para o arquivo JSON de membros
+# @return [String] mensagem de resultado da operação
+# @note Toda a operação roda dentro de uma transação; em caso de erro a transação
+#   é revertida e retorna &quot;a atualização falhou&quot;.
+def update_from_files(classes_path, members_path)
+  ActiveRecord::Base.transaction do
+    update_classes_from(classes_path)
+    update_members_from(members_path)
+  end
+
+  &quot;atualização realizada com sucesso&quot;
+rescue StandardError
+  &quot;a atualização falhou&quot;
+end
+
+private
+
+# Departamentos ------------------------------------------------------------
+
+# Retorna (ou cria na primeira chamada) o departamento padrão &quot;Não especificado&quot;.
+#
+# @return [Departamento] instância memoizada do departamento padrão
+def dep_padrao
+  @dep_padrao ||= Departamento.find_or_create_by!(codigo: DEFAULT_DEP_CODIGO) do |departamento|
+    departamento.nome = DEFAULT_DEP_NOME
+  end
+end
+
+# Localiza ou cria um departamento pelo nome informado.
+#
+# @param nome [String, nil] nome do departamento; se em branco, retorna o padrão
+# @return [Departamento] departamento encontrado ou recém-criado
+def find_or_create_departamento(nome)
+  return dep_padrao if nome.blank?<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Repeated-Conditional.md" target="_blank"><b>RepeatedConditional</b></a>        </span>      </div>      <span>SigaaImporter tests 'nome.blank?' at least 3 times</span>              <span>Locations:</span>                  <a href="sigaa_importer.html#L100" class="js-smell-location">0</a>                  <a href="sigaa_importer.html#L113" class="js-smell-location">1</a>                  <a href="sigaa_importer.html#L127" class="js-smell-location">2</a>                  </div>  </li></ol>
+
+  codigo = codigo_de_nome(nome, 20)
+  Departamento.find_or_create_by!(codigo: codigo) { |dep| dep.nome = nome }
+end
+
+# Cursos -------------------------------------------------------------------
+
+# Localiza ou cria um curso pelo nome informado durante a importação.
+#
+# @param nome [String, nil] nome do curso; se em branco, retorna +nil+
+# @return [Curso, nil] curso encontrado ou recém-criado, ou +nil+ se nome ausente
+def find_or_create_curso(nome)
+  return nil if nome.blank?<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Repeated-Conditional.md" target="_blank"><b>RepeatedConditional</b></a>        </span>      </div>      <span>SigaaImporter tests 'nome.blank?' at least 3 times</span>              <span>Locations:</span>                  <a href="sigaa_importer.html#L100" class="js-smell-location">0</a>                  <a href="sigaa_importer.html#L113" class="js-smell-location">1</a>                  <a href="sigaa_importer.html#L127" class="js-smell-location">2</a>                  </div>  </li></ol>
+
+  codigo = codigo_de_nome(nome, 30)
+  Curso.find_or_create_by!(codigo: codigo) do |curso|
+    curso.nome = nome
+    curso.departamento = dep_padrao
+  end
+end
+
+# Localiza um curso existente pelo nome durante a atualização (não cria novo).
+#
+# @param nome [String, nil] nome do curso; se em branco, retorna +nil+
+# @return [Curso, nil] curso encontrado por código derivado ou por nome, ou +nil+
+def find_curso(nome)
+  return nil if nome.blank?<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Repeated-Conditional.md" target="_blank"><b>RepeatedConditional</b></a>        </span>      </div>      <span>SigaaImporter tests 'nome.blank?' at least 3 times</span>              <span>Locations:</span>                  <a href="sigaa_importer.html#L100" class="js-smell-location">0</a>                  <a href="sigaa_importer.html#L113" class="js-smell-location">1</a>                  <a href="sigaa_importer.html#L127" class="js-smell-location">2</a>                  </div>  </li></ol>
+
+  codigo = codigo_de_nome(nome, 30)
+  Curso.find_by(codigo: codigo) || Curso.find_by(nome: nome)
+end
+
+# JSON parsing -------------------------------------------------------------
+
+# Lê e faz o parse de um arquivo JSON.
+#
+# @param path [String] caminho absoluto para o arquivo
+# @return [Array&lt;Hash&gt;] lista de entradas do JSON
+def parse_json(path)<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Utility-Function.md" target="_blank"><b>UtilityFunction</b></a>        </span>      </div>      <span>SigaaImporter#parse_json doesn't depend on instance state (maybe move it to another class?)</span>          </div>  </li></ol>
+  JSON.parse(File.read(path))
+end
+
+# Turma lookup -------------------------------------------------------------
+
+# Localiza a turma referenciada por um hash de membro do JSON.
+#
+# @param member_hash [Hash] entrada do JSON de membros contendo os dados da turma
+# @return [Turma, nil] turma encontrada, ou +nil+ se a disciplina ou turma não existir
+def lookup_turma(member_hash)<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Utility-Function.md" target="_blank"><b>UtilityFunction</b></a>        </span>      </div>      <span>SigaaImporter#lookup_turma doesn't depend on instance state (maybe move it to another class?)</span>          </div>  </li></ol>
+  code       = member_hash.dig(&quot;class&quot;, &quot;code&quot;)       || member_hash[&quot;code&quot;]
+  class_code = member_hash.dig(&quot;class&quot;, &quot;classCode&quot;)  || member_hash[&quot;classCode&quot;]
+  semester   = member_hash.dig(&quot;class&quot;, &quot;semester&quot;)   || member_hash[&quot;semester&quot;]
+
+  disciplina = Disciplina.find_by(codigo: code)
+  Turma.find_by(disciplina: disciplina, numero_da_turma: class_code, semestre: semester)
+end
+
+# Import classes -----------------------------------------------------------
+
+# Importa disciplinas e turmas a partir do arquivo JSON de classes.
+#
+# @param classes_path [String] caminho para o arquivo JSON de turmas/disciplinas
+# @param counters [Hash] hash com chaves +:created+ e +:ignored+ para contagem
+# @return [void]
+def import_classes_into(classes_path, counters)
+  parse_json(classes_path).each do |entry|
+    disciplina = find_or_create_disciplina(entry)
+    turma = find_or_create_turma(disciplina, entry[&quot;class&quot;] || {})
+
+    if turma.created_at == turma.updated_at
+      counters[:created] += 1
+    else
+      counters[:ignored] += 1
+    end
+  end
+end
+
+# Localiza ou cria uma disciplina a partir de uma entrada do JSON de classes.
+#
+# @param entry [Hash] entrada do JSON com as chaves &quot;code&quot; e &quot;name&quot;
+# @return [Disciplina] disciplina encontrada ou recém-criada
+def find_or_create_disciplina(entry)
+  Disciplina.find_or_create_by!(codigo: entry[&quot;code&quot;]) do |disciplina|<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Feature-Envy.md" target="_blank"><b>FeatureEnvy</b></a>        </span>      </div>      <span>SigaaImporter#find_or_create_disciplina refers to 'entry' more than self (maybe move it to another class?)</span>              <span>Locations:</span>                  <a href="sigaa_importer.html#L183" class="js-smell-location">0</a>                  <a href="sigaa_importer.html#L184" class="js-smell-location">1</a>                  </div>  </li></ol>
+    disciplina.nome = entry[&quot;name&quot;]<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Feature-Envy.md" target="_blank"><b>FeatureEnvy</b></a>        </span>      </div>      <span>SigaaImporter#find_or_create_disciplina refers to 'disciplina' more than self (maybe move it to another class?)</span>              <span>Locations:</span>                  <a href="sigaa_importer.html#L184" class="js-smell-location">0</a>                  <a href="sigaa_importer.html#L185" class="js-smell-location">1</a>                  </div>  </li>  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Feature-Envy.md" target="_blank"><b>FeatureEnvy</b></a>        </span>      </div>      <span>SigaaImporter#find_or_create_disciplina refers to 'entry' more than self (maybe move it to another class?)</span>              <span>Locations:</span>                  <a href="sigaa_importer.html#L183" class="js-smell-location">0</a>                  <a href="sigaa_importer.html#L184" class="js-smell-location">1</a>                  </div>  </li></ol>
+    disciplina.departamento = dep_padrao<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Feature-Envy.md" target="_blank"><b>FeatureEnvy</b></a>        </span>      </div>      <span>SigaaImporter#find_or_create_disciplina refers to 'disciplina' more than self (maybe move it to another class?)</span>              <span>Locations:</span>                  <a href="sigaa_importer.html#L184" class="js-smell-location">0</a>                  <a href="sigaa_importer.html#L185" class="js-smell-location">1</a>                  </div>  </li></ol>
+  end
+end
+
+# Localiza ou cria uma turma para a disciplina a partir dos dados de classe.
+#
+# @param disciplina [Disciplina] disciplina à qual a turma pertence
+# @param class_info [Hash] hash com &quot;classCode&quot;, &quot;semester&quot; e &quot;time&quot;
+# @return [Turma] turma encontrada ou recém-criada
+def find_or_create_turma(disciplina, class_info)<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Utility-Function.md" target="_blank"><b>UtilityFunction</b></a>        </span>      </div>      <span>SigaaImporter#find_or_create_turma doesn't depend on instance state (maybe move it to another class?)</span>          </div>  </li></ol>
+  Turma.find_or_create_by!(
+    disciplina: disciplina,
+    numero_da_turma: class_info[&quot;classCode&quot;],
+    semestre: class_info[&quot;semester&quot;]
+  ) do |turma|
+    turma.horario = class_info[&quot;time&quot;]
+  end
+end
+
+# Update classes -----------------------------------------------------------
+
+# Atualiza disciplinas e turmas existentes a partir do arquivo JSON de classes.
+#
+# @param classes_path [String] caminho para o arquivo JSON de turmas/disciplinas
+# @return [void]
+# @note Apenas registros já existentes são atualizados; nenhum novo é criado.
+def update_classes_from(classes_path)<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Too-Many-Statements.md" target="_blank"><b>TooManyStatements</b></a>        </span>      </div>      <span>SigaaImporter#update_classes_from has approx 6 statements</span>          </div>  </li></ol>
+  parse_json(classes_path).each do |entry|
+    disciplina = Disciplina.find_by(codigo: entry[&quot;code&quot;])<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Feature-Envy.md" target="_blank"><b>FeatureEnvy</b></a>        </span>      </div>      <span>SigaaImporter#update_classes_from refers to 'entry' more than self (maybe move it to another class?)</span>              <span>Locations:</span>                  <a href="sigaa_importer.html#L213" class="js-smell-location">0</a>                  <a href="sigaa_importer.html#L214" class="js-smell-location">1</a>                  <a href="sigaa_importer.html#L216" class="js-smell-location">2</a>                  </div>  </li></ol>
+    disciplina&amp;.update(nome: entry[&quot;name&quot;])<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Feature-Envy.md" target="_blank"><b>FeatureEnvy</b></a>        </span>      </div>      <span>SigaaImporter#update_classes_from refers to 'entry' more than self (maybe move it to another class?)</span>              <span>Locations:</span>                  <a href="sigaa_importer.html#L213" class="js-smell-location">0</a>                  <a href="sigaa_importer.html#L214" class="js-smell-location">1</a>                  <a href="sigaa_importer.html#L216" class="js-smell-location">2</a>                  </div>  </li></ol>
+
+    class_info = entry[&quot;class&quot;] || {}<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Feature-Envy.md" target="_blank"><b>FeatureEnvy</b></a>        </span>      </div>      <span>SigaaImporter#update_classes_from refers to 'entry' more than self (maybe move it to another class?)</span>              <span>Locations:</span>                  <a href="sigaa_importer.html#L213" class="js-smell-location">0</a>                  <a href="sigaa_importer.html#L214" class="js-smell-location">1</a>                  <a href="sigaa_importer.html#L216" class="js-smell-location">2</a>                  </div>  </li></ol>
+    turma = Turma.find_by(
+      disciplina: disciplina,
+      numero_da_turma: class_info[&quot;classCode&quot;],<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Feature-Envy.md" target="_blank"><b>FeatureEnvy</b></a>        </span>      </div>      <span>SigaaImporter#update_classes_from refers to 'class_info' more than self (maybe move it to another class?)</span>              <span>Locations:</span>                  <a href="sigaa_importer.html#L219" class="js-smell-location">0</a>                  <a href="sigaa_importer.html#L220" class="js-smell-location">1</a>                  <a href="sigaa_importer.html#L222" class="js-smell-location">2</a>                  </div>  </li></ol>
+      semestre: class_info[&quot;semester&quot;]<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Feature-Envy.md" target="_blank"><b>FeatureEnvy</b></a>        </span>      </div>      <span>SigaaImporter#update_classes_from refers to 'class_info' more than self (maybe move it to another class?)</span>              <span>Locations:</span>                  <a href="sigaa_importer.html#L219" class="js-smell-location">0</a>                  <a href="sigaa_importer.html#L220" class="js-smell-location">1</a>                  <a href="sigaa_importer.html#L222" class="js-smell-location">2</a>                  </div>  </li></ol>
+    )
+    turma&amp;.update(horario: class_info[&quot;time&quot;])<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Feature-Envy.md" target="_blank"><b>FeatureEnvy</b></a>        </span>      </div>      <span>SigaaImporter#update_classes_from refers to 'class_info' more than self (maybe move it to another class?)</span>              <span>Locations:</span>                  <a href="sigaa_importer.html#L219" class="js-smell-location">0</a>                  <a href="sigaa_importer.html#L220" class="js-smell-location">1</a>                  <a href="sigaa_importer.html#L222" class="js-smell-location">2</a>                  </div>  </li></ol>
+  end
+end
+
+# Import members (docentes + discentes) ------------------------------------
+
+# Importa docentes e discentes a partir do arquivo JSON de membros.
+#
+# @param members_path [String] caminho para o arquivo JSON de membros
+# @param counters [Hash] hash com chaves +:created+ e +:ignored+ para contagem
+# @return [void]
+def import_members_into(members_path, counters)<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Too-Many-Statements.md" target="_blank"><b>TooManyStatements</b></a>        </span>      </div>      <span>SigaaImporter#import_members_into has approx 6 statements</span>          </div>  </li></ol>
+  parse_json(members_path).each do |member|
+    turma = lookup_turma(member)
+    next unless turma
+
+    entry = MemberEntry.new(member, turma)
+    import_docente(entry, counters)
+    import_discentes(entry, counters)
+  end
+end
+
+# Importa ou ignora o docente de uma entrada do JSON de membros.
+#
+# @param entry [MemberEntry] entrada com member_hash e turma
+# @param counters [Hash] hash de contagem +:created+/+:ignored+
+# @return [void]
+def import_docente(entry, counters)
+  docente_hash = entry.member_hash[&quot;docente&quot;]
+  return unless docente_hash.is_a?(Hash)
+
+  dep = find_or_create_departamento(docente_hash[&quot;departamento&quot;])
+  docente = find_or_create_docente(docente_hash, dep)
+  add_membro_to_turma(docente, entry.turma, counters)
+end
+
+# Localiza ou cria um docente pelo email.
+#
+# @param docente_hash [Hash] hash com dados do docente (email, nome, matricula, formacao)
+# @param departamento [Departamento] departamento ao qual o docente pertence
+# @return [Docente] docente encontrado ou recém-criado
+def find_or_create_docente(docente_hash, departamento)<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Utility-Function.md" target="_blank"><b>UtilityFunction</b></a>        </span>      </div>      <span>SigaaImporter#find_or_create_docente doesn't depend on instance state (maybe move it to another class?)</span>          </div>  </li></ol>
+  Docente.find_or_create_by!(email: docente_hash[&quot;email&quot;]) do |docente|
+    docente.nome = docente_hash[&quot;nome&quot;]
+    docente.matricula = docente_hash[&quot;matricula&quot;] || docente_hash[&quot;usuario&quot;]
+    docente.formacao = docente_hash[&quot;formacao&quot;] || &quot;docente&quot;
+    docente.departamento = departamento
+  end
+end
+
+# Importa ou ignora os discentes de uma entrada do JSON de membros.
+#
+# @param entry [MemberEntry] entrada com member_hash e turma
+# @param counters [Hash] hash de contagem +:created+/+:ignored+
+# @return [void]
+def import_discentes(entry, counters)
+  Array(entry.member_hash[&quot;dicente&quot;]).each do |aluno|
+    next unless aluno.is_a?(Hash)
+
+    curso = find_or_create_curso(aluno[&quot;curso&quot;])
+    discente = find_or_create_discente(aluno, curso)
+    add_membro_to_turma(discente, entry.turma, counters)
+  end
+end
+
+# Localiza ou cria um discente pela matrícula.
+#
+# @param aluno_hash [Hash] hash com dados do aluno (matricula, nome, email, formacao)
+# @param curso [Curso, nil] curso ao qual o discente pertence
+# @return [Discente] discente encontrado ou recém-criado
+def find_or_create_discente(aluno_hash, curso)<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Utility-Function.md" target="_blank"><b>UtilityFunction</b></a>        </span>      </div>      <span>SigaaImporter#find_or_create_discente doesn't depend on instance state (maybe move it to another class?)</span>          </div>  </li></ol>
+  Discente.find_or_create_by!(matricula: aluno_hash[&quot;matricula&quot;]) do |discente|
+    discente.nome = aluno_hash[&quot;nome&quot;]
+    discente.email = aluno_hash[&quot;email&quot;]
+    discente.formacao = aluno_hash[&quot;formacao&quot;] || &quot;graduando&quot;
+    discente.curso = curso if curso
+  end
+end
+
+# Update members -----------------------------------------------------------
+
+# Atualiza docentes e discentes existentes a partir do arquivo JSON de membros.
+#
+# @param members_path [String] caminho para o arquivo JSON de membros
+# @return [void]
+# @note Apenas registros já existentes são atualizados; nenhum novo é criado.
+def update_members_from(members_path)<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Too-Many-Statements.md" target="_blank"><b>TooManyStatements</b></a>        </span>      </div>      <span>SigaaImporter#update_members_from has approx 6 statements</span>          </div>  </li></ol>
+  parse_json(members_path).each do |member|
+    turma = lookup_turma(member)
+    next unless turma
+
+    entry = MemberEntry.new(member, turma)
+    update_docente(entry)
+    update_discentes(entry)
+  end
+end
+
+# Atualiza o docente de uma entrada do JSON de membros, se ele já existir.
+#
+# @param entry [MemberEntry] entrada com member_hash e turma
+# @return [void]
+def update_docente(entry)<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Too-Many-Statements.md" target="_blank"><b>TooManyStatements</b></a>        </span>      </div>      <span>SigaaImporter#update_docente has approx 7 statements</span>          </div>  </li></ol>
+  docente_hash = entry.member_hash[&quot;docente&quot;]
+  return unless docente_hash.is_a?(Hash)<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Feature-Envy.md" target="_blank"><b>FeatureEnvy</b></a>        </span>      </div>      <span>SigaaImporter#update_docente refers to 'docente_hash' more than self (maybe move it to another class?)</span>              <span>Locations:</span>                  <a href="sigaa_importer.html#L325" class="js-smell-location">0</a>                  <a href="sigaa_importer.html#L327" class="js-smell-location">1</a>                  <a href="sigaa_importer.html#L328" class="js-smell-location">2</a>                  <a href="sigaa_importer.html#L332" class="js-smell-location">3</a>                  </div>  </li></ol>
+
+  dep = find_or_create_departamento(docente_hash[&quot;departamento&quot;])<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Feature-Envy.md" target="_blank"><b>FeatureEnvy</b></a>        </span>      </div>      <span>SigaaImporter#update_docente refers to 'docente_hash' more than self (maybe move it to another class?)</span>              <span>Locations:</span>                  <a href="sigaa_importer.html#L325" class="js-smell-location">0</a>                  <a href="sigaa_importer.html#L327" class="js-smell-location">1</a>                  <a href="sigaa_importer.html#L328" class="js-smell-location">2</a>                  <a href="sigaa_importer.html#L332" class="js-smell-location">3</a>                  </div>  </li></ol>
+  docente = Docente.find_by(email: docente_hash[&quot;email&quot;])<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Feature-Envy.md" target="_blank"><b>FeatureEnvy</b></a>        </span>      </div>      <span>SigaaImporter#update_docente refers to 'docente_hash' more than self (maybe move it to another class?)</span>              <span>Locations:</span>                  <a href="sigaa_importer.html#L325" class="js-smell-location">0</a>                  <a href="sigaa_importer.html#L327" class="js-smell-location">1</a>                  <a href="sigaa_importer.html#L328" class="js-smell-location">2</a>                  <a href="sigaa_importer.html#L332" class="js-smell-location">3</a>                  </div>  </li></ol>
+  return unless docente
+
+  docente.update(<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Feature-Envy.md" target="_blank"><b>FeatureEnvy</b></a>        </span>      </div>      <span>SigaaImporter#update_docente refers to 'docente' more than self (maybe move it to another class?)</span>              <span>Locations:</span>                  <a href="sigaa_importer.html#L331" class="js-smell-location">0</a>                  <a href="sigaa_importer.html#L333" class="js-smell-location">1</a>                  <a href="sigaa_importer.html#L335" class="js-smell-location">2</a>                  </div>  </li></ol>
+    nome: docente_hash[&quot;nome&quot;],<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Feature-Envy.md" target="_blank"><b>FeatureEnvy</b></a>        </span>      </div>      <span>SigaaImporter#update_docente refers to 'docente_hash' more than self (maybe move it to another class?)</span>              <span>Locations:</span>                  <a href="sigaa_importer.html#L325" class="js-smell-location">0</a>                  <a href="sigaa_importer.html#L327" class="js-smell-location">1</a>                  <a href="sigaa_importer.html#L328" class="js-smell-location">2</a>                  <a href="sigaa_importer.html#L332" class="js-smell-location">3</a>                  </div>  </li></ol>
+    departamento: dep || docente.departamento<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Feature-Envy.md" target="_blank"><b>FeatureEnvy</b></a>        </span>      </div>      <span>SigaaImporter#update_docente refers to 'docente' more than self (maybe move it to another class?)</span>              <span>Locations:</span>                  <a href="sigaa_importer.html#L331" class="js-smell-location">0</a>                  <a href="sigaa_importer.html#L333" class="js-smell-location">1</a>                  <a href="sigaa_importer.html#L335" class="js-smell-location">2</a>                  </div>  </li></ol>
+  )
+  docente.turmas &lt;&lt; entry.turma unless docente.turmas.exists?(entry.turma.id)<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>SigaaImporter#update_docente calls 'docente.turmas' 2 times</span>          </div>  </li>  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>SigaaImporter#update_docente calls 'entry.turma' 2 times</span>          </div>  </li>  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Feature-Envy.md" target="_blank"><b>FeatureEnvy</b></a>        </span>      </div>      <span>SigaaImporter#update_docente refers to 'docente' more than self (maybe move it to another class?)</span>              <span>Locations:</span>                  <a href="sigaa_importer.html#L331" class="js-smell-location">0</a>                  <a href="sigaa_importer.html#L333" class="js-smell-location">1</a>                  <a href="sigaa_importer.html#L335" class="js-smell-location">2</a>                  </div>  </li></ol>
+end
+
+# Atualiza os discentes de uma entrada do JSON de membros, se eles já existirem.
+#
+# @param entry [MemberEntry] entrada com member_hash e turma
+# @return [void]
+def update_discentes(entry)<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="http://docs.seattlerb.org/flog/" target="_blank"><b>HighComplexity</b></a>        </span>      </div>      <span>SigaaImporter#update_discentes has a flog score of 28</span>          </div>  </li>  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Too-Many-Statements.md" target="_blank"><b>TooManyStatements</b></a>        </span>      </div>      <span>SigaaImporter#update_discentes has approx 7 statements</span>          </div>  </li></ol>
+  Array(entry.member_hash[&quot;dicente&quot;]).each do |aluno|
+    next unless aluno.is_a?(Hash)<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Feature-Envy.md" target="_blank"><b>FeatureEnvy</b></a>        </span>      </div>      <span>SigaaImporter#update_discentes refers to 'aluno' more than self (maybe move it to another class?)</span>              <span>Locations:</span>                  <a href="sigaa_importer.html#L344" class="js-smell-location">0</a>                  <a href="sigaa_importer.html#L346" class="js-smell-location">1</a>                  <a href="sigaa_importer.html#L347" class="js-smell-location">2</a>                  <a href="sigaa_importer.html#L351" class="js-smell-location">3</a>                  <a href="sigaa_importer.html#L352" class="js-smell-location">4</a>                  </div>  </li></ol>
+
+    curso = find_curso(aluno[&quot;curso&quot;])<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Feature-Envy.md" target="_blank"><b>FeatureEnvy</b></a>        </span>      </div>      <span>SigaaImporter#update_discentes refers to 'aluno' more than self (maybe move it to another class?)</span>              <span>Locations:</span>                  <a href="sigaa_importer.html#L344" class="js-smell-location">0</a>                  <a href="sigaa_importer.html#L346" class="js-smell-location">1</a>                  <a href="sigaa_importer.html#L347" class="js-smell-location">2</a>                  <a href="sigaa_importer.html#L351" class="js-smell-location">3</a>                  <a href="sigaa_importer.html#L352" class="js-smell-location">4</a>                  </div>  </li></ol>
+    discente = Discente.find_by(matricula: aluno[&quot;matricula&quot;])<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Feature-Envy.md" target="_blank"><b>FeatureEnvy</b></a>        </span>      </div>      <span>SigaaImporter#update_discentes refers to 'aluno' more than self (maybe move it to another class?)</span>              <span>Locations:</span>                  <a href="sigaa_importer.html#L344" class="js-smell-location">0</a>                  <a href="sigaa_importer.html#L346" class="js-smell-location">1</a>                  <a href="sigaa_importer.html#L347" class="js-smell-location">2</a>                  <a href="sigaa_importer.html#L351" class="js-smell-location">3</a>                  <a href="sigaa_importer.html#L352" class="js-smell-location">4</a>                  </div>  </li></ol>
+    next unless discente
+
+    discente.update(
+      nome: aluno[&quot;nome&quot;],<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Feature-Envy.md" target="_blank"><b>FeatureEnvy</b></a>        </span>      </div>      <span>SigaaImporter#update_discentes refers to 'aluno' more than self (maybe move it to another class?)</span>              <span>Locations:</span>                  <a href="sigaa_importer.html#L344" class="js-smell-location">0</a>                  <a href="sigaa_importer.html#L346" class="js-smell-location">1</a>                  <a href="sigaa_importer.html#L347" class="js-smell-location">2</a>                  <a href="sigaa_importer.html#L351" class="js-smell-location">3</a>                  <a href="sigaa_importer.html#L352" class="js-smell-location">4</a>                  </div>  </li></ol>
+      email: aluno[&quot;email&quot;],<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Feature-Envy.md" target="_blank"><b>FeatureEnvy</b></a>        </span>      </div>      <span>SigaaImporter#update_discentes refers to 'aluno' more than self (maybe move it to another class?)</span>              <span>Locations:</span>                  <a href="sigaa_importer.html#L344" class="js-smell-location">0</a>                  <a href="sigaa_importer.html#L346" class="js-smell-location">1</a>                  <a href="sigaa_importer.html#L347" class="js-smell-location">2</a>                  <a href="sigaa_importer.html#L351" class="js-smell-location">3</a>                  <a href="sigaa_importer.html#L352" class="js-smell-location">4</a>                  </div>  </li></ol>
+      curso: curso || discente.curso
+    )
+    discente.turmas &lt;&lt; entry.turma unless discente.turmas.exists?(entry.turma.id)<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>SigaaImporter#update_discentes calls 'discente.turmas' 2 times</span>          </div>  </li>  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>SigaaImporter#update_discentes calls 'entry.turma' 2 times</span>          </div>  </li></ol>
+  end
+end
+
+# Helpers ------------------------------------------------------------------
+
+# Adiciona um membro (docente ou discente) a uma turma, incrementando os contadores.
+#
+# @param membro [Docente, Discente] membro a ser adicionado
+# @param turma [Turma] turma alvo
+# @param counters [Hash] hash de contagem +:created+/+:ignored+
+# @return [void]
+def add_membro_to_turma(membro, turma, counters)<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Utility-Function.md" target="_blank"><b>UtilityFunction</b></a>        </span>      </div>      <span>SigaaImporter#add_membro_to_turma doesn't depend on instance state (maybe move it to another class?)</span>          </div>  </li></ol>
+  if membro.turmas.exists?(turma.id)<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>SigaaImporter#add_membro_to_turma calls 'membro.turmas' 2 times</span>              <span>Locations:</span>                  <a href="sigaa_importer.html#L368" class="js-smell-location">0</a>                  <a href="sigaa_importer.html#L371" class="js-smell-location">1</a>                  </div>  </li></ol>
+    counters[:ignored] += 1
+  else
+    membro.turmas &lt;&lt; turma<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>SigaaImporter#add_membro_to_turma calls 'membro.turmas' 2 times</span>              <span>Locations:</span>                  <a href="sigaa_importer.html#L368" class="js-smell-location">0</a>                  <a href="sigaa_importer.html#L371" class="js-smell-location">1</a>                  </div>  </li></ol>
+    counters[:created] += 1
+  end
+end
+
+# Deriva um código curto a partir de um nome por parametrização e truncamento.
+#
+# @param nome [String] nome a converter
+# @param max_length [Integer] número máximo de caracteres do código
+# @return [String] código em maiúsculas com separadores underline
+def codigo_de_nome(nome, max_length)<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Utility-Function.md" target="_blank"><b>UtilityFunction</b></a>        </span>      </div>      <span>SigaaImporter#codigo_de_nome doesn't depend on instance state (maybe move it to another class?)</span>          </div>  </li></ol>
+  nome.parameterize(separator: &quot;_&quot;).upcase.first(max_length)
+end
+
+# Constrói a mensagem de resultado da importação com base nos contadores.
+#
+# @param counters [Hash] hash com as chaves +:created+ e +:ignored+
+# @return [String] mensagem descritiva do resultado
+def build_import_result(counters)<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Utility-Function.md" target="_blank"><b>UtilityFunction</b></a>        </span>      </div>      <span>SigaaImporter#build_import_result doesn't depend on instance state (maybe move it to another class?)</span>          </div>  </li></ol>
+  created = counters[:created]
+  if created &gt; 0 &amp;&amp; counters[:ignored] &gt; 0
+    &quot;alguns dados já foram importados e não serão importados novamente, mas os dados restantes foram importados com sucesso&quot;
+  elsif created == 0
+    &quot;os dados já existem e não foram duplicados&quot;
+  else
+    &quot;importação realizada com sucesso&quot;
+  end
+end
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/assets/javascripts/application_js.html b/doc/tmp/rubycritic/assets/javascripts/application_js.html new file mode 100644 index 0000000000..fdd4d166fa --- /dev/null +++ b/doc/tmp/rubycritic/assets/javascripts/application_js.html @@ -0,0 +1,1965 @@ + + + + + + + +application.js - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

prettyPrint();

+ +

// sidebar navigation $(function() {

+ +
var loc = window.location.href; // returns the full URL
+if(/overview/.test(loc)) {
+  $('.overview-nav').addClass('active');
+}
+else if(/code_index/.test(loc)) {
+  $('.code-index-nav').addClass('active');
+}
+else if(/smells_index/.test(loc)) {
+  $('.smells-index-nav').addClass('active');
+}
+else if(/simple_cov_index/.test(loc)) {
+  $('.coverage-index-nav').addClass('active');
+}
+ +

});

+ +

var turbulenceData = turbulenceData || []; var COLOR = {

+ +
'A' : '#00B50E',
+'B': '#53D700',
+'C': '#FDF400',
+'D': '#FF6C00',
+'F': '#C40009'
+ +

}; $(“#churn-vs-complexity-graph-container”).highcharts({

+ +
chart: {
+  type: "scatter",
+  zoomType: "xy"
+},
+title: {
+  text: "Churn vs Complexity"
+},
+xAxis: {
+  title: {
+    enabled: true,
+    text: "Churn"
+  },
+  floor: 0,
+  startOnTick: true,
+  endOnTick: true
+},
+yAxis: {
+  title: {
+    text: "Complexity"
+  },
+  floor: 0,
+  startOnTick: true,
+  endOnTick: true
+},
+plotOptions: {
+  series: {
+    turboThreshold: 0
+  },
+  scatter: {
+    marker: {
+      radius: 5,
+      states: {
+        hover: {
+          enabled: true,
+          lineColor: "rgb(100,100,100)"
+        }
+      }
+    },
+    tooltip: {
+      headerFormat: "<b>{point.key}</b><br>",
+      pointFormat: "Committed {point.x} times, with Flog score of {point.y}"
+    }
+  }
+},
+series: [{
+  showInLegend: false,
+  color: "steelblue",
+  data: getMappedTurbulenceData()
+}]
+ +

});

+ +

function getMappedTurbulenceData(){

+ +
var dataWithColorInformation = turbulenceData.map(function(data){
+  data.color = COLOR[data.rating];
+  return data;
+});
+return dataWithColorInformation;
+
+ +

};

+ +

$(function() {

+ +
$("#gpa-chart").highcharts(
+  {
+    chart: {
+      type: 'pie',
+      events: {
+          load: addTitle,
+          redraw: addTitle,
+      },
+    },
+    title: {
+      text: "",
+      useHTML: true
+    },
+    plotOptions: {
+      pie: {
+        shadow: false
+      }
+    },
+    tooltip: {
+      formatter: function() {
+        return '<b>'+ this.point.name +'</b>: '+ this.y +' %';
+      }
+    },
+    series: [{
+      name: 'Browsers',
+      data: getGpaData(),
+      size: '90%',
+      innerSize: '65%',
+      showInLegend:true,
+      dataLabels: {
+        enabled: false
+      }
+    }]
+  });
+ +

});

+ +

function addTitle() {

+ +
if (this.title) {
+    this.title.destroy();
+}
+var r = this.renderer,
+    x = this.series[0].center[0] + this.plotLeft,
+    y = this.series[0].center[1] + this.plotTop;
+this.title = r.label('<span class="obtained-score">'+score.toFixed(2)+'</span><span class="total-score">/100</span>', 0, 0, "", 0, 0, true)
+    .css({
+    color: 'black'
+}).hide().add();
+var bbox = this.title.getBBox();
+this.title.attr({
+    x: x - (bbox.width / 2),
+    y: y
+}).show();
+this.title.useHTML = true;
+ +

};

+ +

function getGpaData(){

+ +
var ratingACount = getRatingWiseCount("A");
+var ratingBCount = getRatingWiseCount("B");
+var ratingCCount = getRatingWiseCount("C");
+var ratingDCount = getRatingWiseCount("D");
+var ratingFCount = getRatingWiseCount("F");
+var total = ratingACount + ratingBCount + ratingCCount + ratingDCount + ratingFCount;
+return [
+  {name: 'A', y: parseFloat(calculatePercentage(ratingACount, total).toFixed(2)), color: COLOR['A']},
+  {name: 'B', y: parseFloat(calculatePercentage(ratingBCount, total).toFixed(2)), color: COLOR['B']},
+  {name: 'C', y: parseFloat(calculatePercentage(ratingCCount, total).toFixed(2)), color: COLOR['C']},
+  {name: 'D', y: parseFloat(calculatePercentage(ratingDCount, total).toFixed(2)), color: COLOR['D']},
+  {name: 'F', y: parseFloat(calculatePercentage(ratingFCount, total).toFixed(2)), color: COLOR['F']},
+];
+
+ +

};

+ +

function calculatePercentage(gradeCount, total){

+ +
return (gradeCount/total)*100;
+
+ +

};

+ +

function getRatingWiseCount(rating){

+ +
var count = 0;
+turbulenceData.forEach(function(data, index){
+  if(data.rating === rating){
+    count++;
+  }
+});
+return count;
+ +

};

+ +

function emphasizeLineFromFragment() {

+ +
emphasizeLine(window.location.hash)
+
+ +

}

+ +

$(“.js-file-code”).on(“click”, “.js-smell-location”, emphasizeLineFromHref);

+ +

function emphasizeLineFromHref(event) {

+ +
if (hrefTargetIsOnCurrentPage(this) && !event.ctrlKey) {
+  $(".js-file-code li").removeClass("highlight");
+  var lineId = "#" + this.href.split("#")[1];
+  emphasizeLine(lineId);
+  return false;
+}
+ +

}

+ +

function hrefTargetIsOnCurrentPage(aTag) {

+ +
return (window.location.pathname === aTag.pathname);
+
+ +

}

+ +

function emphasizeLine(lineReference) {

+ +
scrollToTarget(lineReference);
+highlightLine(lineReference);
+
+ +

}

+ +

function scrollToTarget(lineReference) {

+ +
window.location.hash = lineReference;
+$.scrollTo(lineReference, {
+  duration: 300,
+  easing: "linear",
+  offset: {top: -87},
+  axis: 'y'
+});
+ +

}

+ +

function highlightLine(lineReference) {

+ +
$(lineReference).addClass("highlight");
+ +

}

+ +

$(“#toggle-code”).on(“click”, showCode); $(“#toggle-smells”).on(“click”, showSmells); $(“#toggle-coverage”).on(“click”, showCoverage);

+ +

function showCode() {

+ +
$('#toggle-code').parent('li').addClass('active');
+$('#toggle-smells').parent('li').removeClass('active');
+$('#toggle-coverage').parent('li').removeClass('active');
+$(".smells").hide();
+ +

}

+ +

function showSmells() {

+ +
$('#toggle-code').parent('li').removeClass('active');
+$('#toggle-coverage').parent('li').removeClass('active');
+$('#toggle-smells').parent('li').addClass('active');
+$(".smells").show();
+ +

}

+ +

function showCoverage() {

+ +
$('#toggle-code').parent('li').removeClass('active');
+$('#toggle-smells').parent('li').removeClass('active');
+$('#toggle-coverage').parent('li').addClass('active');
+$(".coverage").show();
+ +

}

+ +

$(“#codeTable”)

+ +
.tablesorter({          // Sort the table
+  sortList: [[0,1]]
+});
+ +

$(“#smellsTable”)

+ +
.tablesorter({          // Sort the table
+  sortList: [[0,0]]
+});
+ +

$(“#coverageTable”)

+ +
.tablesorter({          // Sort the table
+  sortList: [[0,1]]
+});
+ +

$(“.js-timeago”).timeago();

+ +

$(function(){

+ +
$('.table-header').click(function(){
+  $('.table-header').not(this).each(function(){
+    $(this).removeClass('active');
+    $(this).find('.sort-type').removeClass('table-header-asc');
+    $(this).find('.sort-type').removeClass('table-header-desc');
+  });
+  if($(this).hasClass('active')){
+    $(this).find('.sort-type').toggleClass('table-header-asc table-header-desc');
+  }
+  else{
+    $(this).addClass('active');
+    $(this).find('.sort-type').addClass('table-header-asc');
+  }
+});
+ +

});

+ +

function assignIdsToCodeLines(){

+ +
$($('.linenums')[1]).children().each(function(index){
+  $(this).attr('id', "L" + index)
+});
+ +

};

+ +

$(document).ready(function(){

+ +
assignIdsToCodeLines();
+emphasizeLineFromFragment();
+initTableFilters();
+
+ +

});

+ +

var initTableFilters = function() {

+ +
$("#codeTable").filterTable({ignoreColumns: [2], placeholder: 'Filter by Name'});
+$("#smellsTable").filterTable({ignoreColumns: [2, 3, 4, 5], placeholder: 'Filter by Smell or Location', inputSelector: 'form-control'});
+$("#coverageTable").filterTable({ignoreColumns: [0], placeholder: 'Filter by Smell or Location', inputSelector: 'form-control'});
+ +

}

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/assets/stylesheets/application_css.html b/doc/tmp/rubycritic/assets/stylesheets/application_css.html new file mode 100644 index 0000000000..1840c4376a --- /dev/null +++ b/doc/tmp/rubycritic/assets/stylesheets/application_css.html @@ -0,0 +1,2283 @@ + + + + + + + +application.css - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

/* Font Faces */ @font-face {

+ +
font-family: 'RobotoMedium';
+src: url('../fonts/Roboto-Medium.ttf') format('truetype');
+ +

} @font-face {

+ +
font-family: 'RobotoRegular';
+src: url('../fonts/Roboto-Regular.ttf') format('truetype');
+ +

}

+ +

/Helpers/ .marginTop20 { margin-top:20px; } /*End of Helpers*/ /*Layout Styles*/ body { overflow-x: hidden; }

+ +

header {

+ +
max-height: 85px;
+background: #fff!important;
+border:none!important;
+padding: 10px 20px;
+box-shadow: 0 1px 10px rgba(0,0,0,.15);
+ +

}

+ +

/* Toggle Styles */

+ +

wrapper {

+ +
padding-left: 0;
+-webkit-transition: all 0.5s ease;
+-moz-transition: all 0.5s ease;
+-o-transition: all 0.5s ease;
+transition: all 0.5s ease;
+margin-top: 60px;
+ +

}

+ +

wrapper.toggled {

+ +
padding-left: 120px;
+ +

}

+ +

sidebar-wrapper {

+ +
z-index: 1000;
+position: fixed;
+left: 120px;
+width: 0;
+height: 100%;
+margin-left: -120px;
+overflow-y: auto;
+background: #fff;
+-webkit-transition: all 0.5s ease;
+-moz-transition: all 0.5s ease;
+-o-transition: all 0.5s ease;
+transition: all 0.5s ease;
+font-family: "RobotoMedium";
+font-weight: normal;
+font-size: 16px;
+ +

} page-content-wrapper {

+ +
font-family: "RobotoRegular"
+ +

} wrapper.toggled sidebar-wrapper {

+ +
width: 120px;
+ +

}

+ +

page-content-wrapper {

+ +
width: 100%;
+position: absolute;
+background:#f3f3f3;
+/*height:100vh;*/
+ +

} .Summary_Wrapper_Main { min-height:inherit!important; } .Page_Title { background:#9B111D; padding: 10px 50px; } .Page_Title h3 { margin: 10px 0px;color: fff; } .Page_Title h3 small { color: fff;} .Content_Wrapper {

+ +
padding: 25px;
+display: inline-block;
+width: 100%;
+font-size: 17px;
+ +

}

+ +

.Graph_Cards {

+ +
padding:20px;
+background:#fff;
+border-radius:10px;
+box-shadow: 0 1px 1px rgba(0,0,0,.15);
+margin-bottom:20px;
+/*min-height:330px;*/
+ +

} .Graph_Cards img {margin-top:30px;} .Graph_Cards h4 {color:#A4A4A4;} .Summary_Wrapper {display:inline-block;width:100%;} .Summary_Title {padding-left:0;} .Summary_Title h3 {padding:10px;position:relative;color:#fff;} .Summary_Title h3:after {

+ +
content: "";
+width: 0;
+height: 0;
+border-top: 0px solid transparent;
+border-bottom: 46px solid transparent;
+border-left: 30px solid #fff;
+position: absolute;
+right: -30px;
+top: 0;
+ +

} .Green_DR h3 {background:#00A900;} .Green_DR h3:after{border-left-color:#00a900} .Green_DR .list-inline h4 {color:#00A900;} .Green_Light h3 {background:#7FCB00;} .Green_Light h3:after{border-left-color:#7FCB00} .Green_Light .list-inline h4 {color:#7FCB00;} .Yellow_Color h3 {background:#FFED00;} .Yellow_Color h3:after{border-left-color:#FFED00} .Yellow_Color .list-inline h4 {color:#FFED00;} .Orange_Color h3 {background:#F77700;} .Orange_Color h3:after{border-left-color:#F77700} .Orange_Color .list-inline h4 {color:#F77700;} .Red_Color h3 {background:#ED0000;} .Red_Color h3:after{border-left-color:#ED0000} .Red_Color .list-inline h4 {color:#ED0000;} .Maroon_Color h3 {background:#B31F27;} .Maroon_Color h3:after{border-left-color:#B31F27} .Maroon_Color .list-inline h4 {color:#B31F27;}

+ +

.Summary_Content .list-inline {

+ +
text-align:center;
+margin-top:10px;
+padding-right:0;
+ +

} .Summary_Content .list-inline span {color:#A4A4A4} wrapper.toggled page-content-wrapper {

+ +
position: absolute;
+margin-right: -250px;
+ +

}

+ +

/* Sidebar Styles */

+ +

.sidebar-nav {

+ +
position: absolute;
+top: 0;
+width: 120px;
+text-align:center;
+margin: 0;
+padding: 0;
+list-style: none;
+ +

}

+ +

.sidebar-nav li {

+ +
display:block;text-align:center;
+line-height: 40px;
+ +

}

+ +

.sidebar-nav li a {

+ +
display: block;
+text-decoration: none;
+color: #969696;padding:10px;
+ +

} .sidebar-nav li a.active {

+ +
border-left: 5px solid #9b111d;
+color: #9b111d;
+ +

} .sidebar-nav li a.active {

+ +
border-left: 2px solid #9b111d;
+color: #9b111d;
+ +

} .sidebar-nav li a:hover {

+ +
text-decoration: none;
+color: #fff;
+background: rgba(255,255,255,0.2);
+ +

}

+ +

.sidebar-nav li a:active, .sidebar-nav li a:focus {

+ +
text-decoration: none;
+ +

}

+ +

.sidebar-nav > .sidebar-brand {

+ +
height: 65px;
+font-size: 18px;
+line-height: 60px;
+ +

}

+ +

.sidebar-nav > .sidebar-brand a {

+ +
color: #999999;
+ +

}

+ +

.sidebar-nav > .sidebar-brand a:hover {

+ +
color: #fff;
+background: none;
+ +

}

+ +

.sidebar-nav .fa {

+ +
font-size: 24px;
+ +

}

+ +

@media(min-width:768px) {

+ +
#wrapper {
+  padding-left: 120px;
+}
+
+#wrapper.toggled {
+  padding-left: 0;
+}
+
+#sidebar-wrapper {
+  width: 120px;
+}
+
+#wrapper.toggled #sidebar-wrapper {
+  width: 0;
+}
+
+#page-content-wrapper {
+  padding:0px;
+  position: relative;
+}
+
+#wrapper.toggled #page-content-wrapper {
+  position: relative;
+  margin-right: 0;
+}
+ +

} .sidebar-nav li a:hover {color:#9B111D;} .sidebar-nav li a i,.sidebar-nav li a img {font-size:18px;display:block;margin:0 auto;} /*End of Layout Styles*/

+ +

.fadeIn {-webkit-animation: fadein 2s; /* Safari, Chrome and Opera > 12.1 */

+ +
-moz-animation: fadein 2s; /* Firefox < 16 */
+-ms-animation: fadein 2s; /* Internet Explorer */
+-o-animation: fadein 2s; /* Opera < 12.1 */
+animation: fadein 2s;}
+ +

.fadeIn-2 {-webkit-animation: fadein 2.5s; /* Safari, Chrome and Opera > 12.1 */

+ +
-moz-animation: fadein 2.5s; /* Firefox < 16 */
+-ms-animation: fadein 2.5s; /* Internet Explorer */
+-o-animation: fadein 2.5s; /* Opera < 12.1 */
+animation: fadein 2.5s;}
+ +

.fadeIn-3 {-webkit-animation: fadein 3s; /* Safari, Chrome and Opera > 12.1 */

+ +
-moz-animation: fadein 3s; /* Firefox < 16 */
+-ms-animation: fadein 3s; /* Internet Explorer */
+-o-animation: fadein 3s; /* Opera < 12.1 */
+animation: fadein 3s;}
+ +

@keyframes fadein {

+ +
from { opacity: 0; }
+to   { opacity: 1; }
+ +

}

+ +

/* Firefox < 16 */ @-moz-keyframes fadein {

+ +
from { opacity: 0; }
+to   { opacity: 1; }
+ +

} @-webkit-keyframes fadein {

+ +
from { opacity: 0; }
+to   { opacity: 1; }
+ +

}

+ +

/* Internet Explorer */ @-ms-keyframes fadein {

+ +
from { opacity: 0; }
+to   { opacity: 1; }
+ +

}

+ +

/* Opera < 12.1 */ @-o-keyframes fadein {

+ +
from { opacity: 0; }
+to   { opacity: 1; }
+ +

} /* SMELLS */ .table > tbody > tr > td {

+ +
vertical-align: middle;
+ +

} .table > thead > tr th:nth-child(2) {

+ +
padding-left: 20px;
+ +

}

+ +

/TH/ .table th {

+ +
color: #4e4d4d;
+font-weight: bold;
+ +

} .table.code th.center {

+ +
text-align: center;
+ +

} .table.code th.left {

+ +
text-align: left;
+ +

} .table.code th {

+ +
text-align: right;
+ +

}

+ +

/TD/ .table td {

+ +
color: #777575;
+ +

} .table.code td.center {

+ +
text-align: center;
+ +

} .table.code td.left {

+ +
text-align: left;
+ +

} .table.code td {

+ +
text-align: right;
+ +

}

+ +

.status, .rating {

+ +
width: 40px;
+height: 40px;
+border-radius: 50%;
+line-height: 40px;
+font-size: 11px;
+text-align: center;
+color: #fff;
+display: inline-block;
+cursor: pointer;
+ +

}

+ +

.rating.big {

+ +
width: 40px;
+height: 40px;
+line-height: 40px;
+font-size: 25px;
+ +

}

+ +

.status.new { background: #00aa00; } .status.old { background: cccccc; }

+ +

.rating { font-size: 25px; } .rating.a { background: #00aa00; } .rating.b { background: #80cc00; } .rating.c { background: ffed00; }

+ +

.rating.d { background: f77700; } .rating.e { background: ed0000; } .rating.f { background: b32028; }

+ +

.code-top-detail {

+ +
border-bottom: 1px solid #000;
+ +

}

+ +

.right-to-left li { float: right; } .right-to-left>li.active>a {

+ +
color: #9B111D;
+background: none;
+border-bottom: 2px solid #9B111D;
+border-radius: 0;
+ +

} .right-to-left>li.active>a:hover {

+ +
background: none;
+color: #9B111D;
+ +

} .right-to-left>li>a {

+ +
color: #a4a4a4;
+padding: 10px 20px 20px;
+border-bottom: 2px solid #f3f3f3;
+ +

}

+ +

.critic-num {

+ +
width: 1%;
+min-width: 50px;
+padding-right: 10px;
+padding-left: 10px;
+font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace;
+font-size: 12px;
+line-height: 20px;
+color: rgba(0,0,0,0.3);
+text-align: right;
+white-space: nowrap;
+vertical-align: top;
+cursor: pointer;
+-webkit-user-select: none;
+-moz-user-select: none;
+-ms-user-select: none;
+user-select: none;
+border: solid #eee;
+border-width: 0 1px 0 0;
+ +

} .critic-code-inner {

+ +
overflow: visible;
+font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace;
+font-size: 12px;
+color: #333;
+word-wrap: normal;
+white-space: pre;
+ +

} .critic-code {

+ +
position: relative;
+padding-right: 10px;
+padding-left: 10px;
+line-height: 20px;
+vertical-align: top;
+ +

} .critic-num::before {

+ +
content: attr(data-line-number);
+ +

}

+ +

.old td {

+ +
background-color: #f0dbdb;
+ +

} .old td:first-child, .red {

+ +
background-color: #feb9b9;
+ +

}

+ +

.line-code td {

+ +
background-color: #efefef;
+ +

}

+ +

.grey {

+ +
background-color: #ebebeb;
+ +

} .green {

+ +
background-color: green;
+ +

} .success {

+ +
background-color: #a3d39c;
+color: #598527;
+ +

} .success b {

+ +
color: #197b30;
+ +

}

+ +

ol.errors {

+ +
list-style: none;
+padding-left: 0px;
+ +

} .errors {

+ +
background-position: 10px 25px;
+background-repeat: no-repeat;
+margin-bottom: 5px;
+color: #8b8b8b;
+font-size: 14px;
+ +

} .errors b {

+ +
font-size: 16px;
+font-weight: 400;
+ +

} .rc-position {

+ +
position: absolute;
+right: 15px;
+top: 15px;
+ +

}

+ +

.index-table .centered-cell {

+ +
text-align: center;
+ +

}

+ +

.circle {

+ +
display: block;
+border-radius: 50%;
+width: 50px;
+height: 50px;
+ +

}

+ +

.circled-text {

+ +
text-align: center;
+color: white;
+font-family: Arial, "Helvetica Neue", Helvetica, sans-serif;
+font-weight: bold;
+-webkit-user-select: none;
+-moz-user-select: none;
+-ms-user-select: none;
+user-select: none;
+cursor: default;
+line-height: 50px;
+font-size: 32px;
+ +

}

+ +

.smells-index-table .circled-text {

+ +
font-size: 15px;
+float: left;
+ +

}

+ +

.status-old {

+ +
background-color: #FFDC00;
+ +

}

+ +

.status-new {

+ +
background-color: #FF4136;
+ +

}

+ +

.committed-at {

+ +
float: right;
+color: #fff;
+margin-top: 11px;
+ +

}

+ +

.smells {

+ +
position: relative;
+white-space: normal;
+ +

} .smells .heading { background-color: F8AE60; } .smells .description { background-color: FBE5BE; } .smells .fa-warning { color: f57e00; } .smells span { margin-left: 20px; } .smells a { color: white; } .smells a:hover { color: #337ab7; }

+ +

.table-header {

+ +
cursor: pointer;
+ +

} .table-header-asc:after {

+ +
content: '\00A0\2191';
+ +

} .table-header-desc:after {

+ +
content: '\00A0\2193';
+ +

} .container-fluid {

+ +
padding-left: 0px;
+padding-right: 0px;
+ +

}

+ +

span.metric {

+ +
font-size: 20px;
+ +

}

+ +

.sortable-table th {

+ +
cursor: pointer;
+ +

}

+ +

.obtained-score {

+ +
font-size: 1.5em;
+ +

}

+ +

.total-score {

+ +
font-size: 1em;
+ +

}

+ +

.logo {

+ +
font-size: 24px;
+color: black;
+font-weight: bold;
+display: inline-block;
+margin-left: 20px;
+ +

}

+ +

.filter-table {

+ +
text-align: right;
+ +

}

+ +

.filter-table input {

+ +
width: 200px;
+display: inline;
+height: 34px;
+padding: 6px 12px;
+font-size: 14px;
+line-height: 1.42857143;
+color: #555;
+background-color: #fff;
+background-image: none;
+border: 1px solid #ccc;
+border-radius: 4px;
+ +

}

+ +

.branch{

+ +
font-size: 15px;
+color: #9b111d;
+font-weight: bold;
+display: inline-block;
+padding: 13px;
+ +

}

+ +

.green-color {

+ +
color: #00A900;
+ +

} .red-color {

+ +
color: #ED0000;
+ +

} .empty-span{

+ +
height: 17px;
+width: 17px;
+ +

}

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/assets/vendor/javascripts/bootstrap_min_js.html b/doc/tmp/rubycritic/assets/vendor/javascripts/bootstrap_min_js.html new file mode 100644 index 0000000000..cdd1fc5519 --- /dev/null +++ b/doc/tmp/rubycritic/assets/vendor/javascripts/bootstrap_min_js.html @@ -0,0 +1,1637 @@ + + + + + + + +bootstrap.min.js - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

/*!

+ +
* Bootstrap v3.3.7 (http://getbootstrap.com)
+* Copyright 2011-2016 Twitter, Inc.
+* Licensed under the MIT license
+*/
+ +

if(“undefined”==typeof jQuery)throw new Error(“Bootstrap’s JavaScript requires jQuery”);+function(a){“use strict”;var b=a.fn.jquery.split(“ ”)[0].split(“.”);if(b<2&&b<9||1==b&&9==b&&b<1||b>3)throw new Error(“Bootstrap’s JavaScript requires jQuery version 1.9.1 or higher, but lower than version 4”)}(jQuery),+function(a){“use strict”;function b(){var a=document.createElement(“bootstrap”),b={WebkitTransition:“webkitTransitionEnd”,MozTransition:“transitionend”,OTransition:“oTransitionEnd otransitionend”,transition:“transitionend”};for(var c in b)if(void 0!==a.style[c])return{end:b};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one(“bsTransitionEnd”,function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){if(a(b.target).is(this))return b.handleObj.handler.apply(this,arguments)}})})}(jQuery),+function(a){“use strict”;function b(b){return this.each(function(){var c=a(this),e=c.data(“bs.alert”);e||c.data(“bs.alert”,e=new d(this)),“string”==typeof b&&e.call©})}var c=‘[data-dismiss=“alert”]’,d=function(b){a(b).on(“click”,c,this.close)};d.VERSION=“3.3.7”,d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger(“closed.bs.alert”).remove()}var e=a(this),f=e.attr(“data-target”);f||(f=e.attr(“href”),f=f&&f.replace(/.*(?=#[^\s]*$)/,“”));var g=a(“#”===f?[]:f);b&&b.preventDefault(),g.length||(g=e.closest(“.alert”)),g.trigger(b=a.Event(“close.bs.alert”)),b.isDefaultPrevented()||(g.removeClass(“in”),a.support.transition&&g.hasClass(“fade”)?g.one(“bsTransitionEnd”,c).emulateTransitionEnd(d.TRANSITION_DURATION):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on(“click.bs.alert.data-api”,c,d.prototype.close)}(jQuery),+function(a){“use strict”;function b(b){return this.each(function(){var d=a(this),e=d.data(“bs.button”),f=“object”==typeof b&&b;e||d.data(“bs.button”,e=new c(this,f)),“toggle”==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION=“3.3.7”,c.DEFAULTS={loadingText:“loading…”},c.prototype.setState=function(b){var c=“disabled”,d=this.$element,e=d.is(“input”)?“val”:“html”,f=d.data();b+=“Text”,null==f.resetText&&d.data(“resetText”,d()),setTimeout(a.proxy(function(){d(null==f?this.options[b]:f),“loadingText”==b?(this.isLoading=!0,d.addClass©.attr(c,c).prop(c,!0)):this.isLoading&&(this.isLoading=!1,d.removeClass©.removeAttr©.prop(c,!1))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest(‘[data-toggle=“buttons”]’);if(b.length){var c=this.$element.find(“input”);“radio”==c.prop(“type”)?(c.prop(“checked”)&&(a=!1),b.find(“.active”).removeClass(“active”),this.$element.addClass(“active”)):“checkbox”==c.prop(“type”)&&(c.prop(“checked”)!==this.$element.hasClass(“active”)&&(a=!1),this.$element.toggleClass(“active”)),c.prop(“checked”,this.$element.hasClass(“active”)),a&&c.trigger(“change”)}else this.$element.attr(“aria-pressed”,!this.$element.hasClass(“active”)),this.$element.toggleClass(“active”)};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on(“click.bs.button.data-api”,‘[data-toggle^=“button”]’,function©{var d=a(c.target).closest(“.btn”);b.call(d,“toggle”),a(c.target).is(‘input, input’)||(c.preventDefault(),d.is(“input,button”)?d.trigger(“focus”):d.find(“input:visible,button:visible”).first().trigger(“focus”))}).on(“focus.bs.button.data-api blur.bs.button.data-api”,‘[data-toggle^=“button”]’,function(b){a(b.target).closest(“.btn”).toggleClass(“focus”,/^focus(in)?$/.test(b.type))})}(jQuery),+function(a){“use strict”;function b(b){return this.each(function(){var d=a(this),e=d.data(“bs.carousel”),f=a.extend({},c.DEFAULTS,d.data(),“object”==typeof b&&b),g=“string”==typeof b?b:f.slide;e||d.data(“bs.carousel”,e=new c(this,f)),“number”==typeof b?e.to(b):g?e():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(“.carousel-indicators”),this.options=c,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on(“keydown.bs.carousel”,a.proxy(this.keydown,this)),“hover”==this.options.pause&&!(“ontouchstart”in document.documentElement)&&this.$element.on(“mouseenter.bs.carousel”,a.proxy(this.pause,this)).on(“mouseleave.bs.carousel”,a.proxy(this.cycle,this))};c.VERSION=“3.3.7”,c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:“hover”,wrap:!0,keyboard:!0},c.prototype.keydown=function(a){if(!/input|textarea/i.test(a.target.tagName)){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()}},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(“.item”),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c=this.getItemIndex(b),d=“prev”==a&&0===c||“next”==a&&c==this.$items.length-1;if(d&&!this.options.wrap)return b;var e=“prev”==a?-1:1,f=(c+e)%this.$items.length;return this.$items.eq(f)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(“.item.active”));if(!(a>this.$items.length-1||a<0))return this.sliding?this.$element.one(“slid.bs.carousel”,function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?“next”:“prev”,this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(“.next, .prev”).length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){if(!this.sliding)return this.slide(“next”)},c.prototype.prev=function(){if(!this.sliding)return this.slide(“prev”)},c.prototype.slide=function(b,d){var e=this.$element.find(“.item.active”),f=d||this.getItemForDirection(b,e),g=this.interval,h=“next”==b?“left”:“right”,i=this;if(f.hasClass(“active”))return this.sliding=!1;var j=f,k=a.Event(“slide.bs.carousel”,{relatedTarget:j,direction:h});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(“.active”).removeClass(“active”);var l=a(this.$indicators.children()[this.getItemIndex(f)]);l&&l.addClass(“active”)}var m=a.Event(“slid.bs.carousel”,{relatedTarget:j,direction:h});return a.support.transition&&this.$element.hasClass(“slide”)?(f.addClass(b),f.offsetWidth,e.addClass(h),f.addClass(h),e.one(“bsTransitionEnd”,function(){f.removeClass([b,h].join(“ ”)).addClass(“active”),e.removeClass([“active”,h].join(“ ”)),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass(“active”),f.addClass(“active”),this.sliding=!1,this.$element.trigger(m)),g&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this};var e=function©{var d,e=a(this),f=a(e.attr(“data-target”)||(d=e.attr(“href”))&&d.replace(/.*(?=#[^\s]+$)/,“”));if(f.hasClass(“carousel”)){var g=a.extend({},f.data(),e.data()),h=e.attr(“data-slide-to”);h&&(g.interval=!1),b.call(f,g),h&&f.data(“bs.carousel”).to(h),c.preventDefault()}};a(document).on(“click.bs.carousel.data-api”,“[data-slide]”,e).on(“click.bs.carousel.data-api”,“[data-slide-to]”,e),a(window).on(“load”,function(){a(‘[data-ride=“carousel”]’).each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){“use strict”;function b(b){var c,d=b.attr(“data-target”)||(c=b.attr(“href”))&&c.replace(/.*(?=#[^\s]+$)/,“”);return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data(“bs.collapse”),f=a.extend({},d.DEFAULTS,c.data(),“object”==typeof b&&b);!e&&f.toggle&&/show|hide/.test(b)&&(f.toggle=!1),e||c.data(“bs.collapse”,e=new d(this,f)),“string”==typeof b&&e()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a(‘[data-toggle=“collapse”][href=“#’b.id‘”],[data-toggle=“collapse”][data-target=“#’b.id‘”]’),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION=“3.3.7”,d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0},d.prototype.dimension=function(){var a=this.$element.hasClass(“width”);return a?“width”:“height”},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass(“in”)){var b,e=this.$parent&&this.$parent.children(“.panel”).children(“.in, .collapsing”);if(!(e&&e.length&&(b=e.data(“bs.collapse”),b&&b.transitioning))){var f=a.Event(“show.bs.collapse”);if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,“hide”),b||e.data(“bs.collapse”,null));var g=this.dimension();this.$element.removeClass(“collapse”).addClass(“collapsing”)[g](0).attr(“aria-expanded”,!0),this.$trigger.removeClass(“collapsed”).attr(“aria-expanded”,!0),this.transitioning=1;var h=function(){this.$element.removeClass(“collapsing”).addClass(“collapse in”)[g](“”),this.transitioning=0,this.$element.trigger(“shown.bs.collapse”)};if(!a.support.transition)return h.call(this);var i=a.camelCase([“scroll”,g].join(“-”));this.$element.one(“bsTransitionEnd”,a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass(“in”)){var b=a.Event(“hide.bs.collapse”);if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element(this.$element())[0].offsetHeight,this.$element.addClass(“collapsing”).removeClass(“collapse in”).attr(“aria-expanded”,!1),this.$trigger.addClass(“collapsed”).attr(“aria-expanded”,!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass(“collapsing”).addClass(“collapse”).trigger(“hidden.bs.collapse”)};return a.support.transition?void this.$element(0).one(“bsTransitionEnd”,a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this()},d.prototype.getParent=function(){return a(this.options.parent).find(‘[data-toggle=“collapse”][data-parent=“’this.options.parent‘”]’).each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass(“in”);a.attr(“aria-expanded”,c),b.toggleClass(“collapsed”,!c).attr(“aria-expanded”,c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Constructor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on(“click.bs.collapse.data-api”,‘[data-toggle=“collapse”]’,function(d){var e=a(this);e.attr(“data-target”)||d.preventDefault();var f=b(e),g=f.data(“bs.collapse”),h=g?“toggle”:e.data();c.call(f,h)})}(jQuery),+function(a){“use strict”;function b(b){var c=b.attr(“data-target”);c||(c=b.attr(“href”),c=c&&/#[A-Za-z]/.test©&&c.replace(/.*(?=#[^\s]*$)/,“”));var d=c&&a©;return d&&d.length?d:b.parent()}function c©{c&&3===c.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=b(d),f={relatedTarget:this};e.hasClass(“open”)&&(c&&“click”==c.type&&/input|textarea/i.test(c.target.tagName)&&a.contains(e,c.target)||(e.trigger(c=a.Event(“hide.bs.dropdown”,f)),c.isDefaultPrevented()||(d.attr(“aria-expanded”,“false”),e.removeClass(“open”).trigger(a.Event(“hidden.bs.dropdown”,f)))))}))}function d(b){return this.each(function(){var c=a(this),d=c.data(“bs.dropdown”);d||c.data(“bs.dropdown”,d=new g(this)),“string”==typeof b&&d.call©})}var e=“.dropdown-backdrop”,f=‘[data-toggle=“dropdown”]’,g=function(b){a(b).on(“click.bs.dropdown”,this.toggle)};g.VERSION=“3.3.7”,g.prototype.toggle=function(d){var e=a(this);if(!e.is(“.disabled, :disabled”)){var f=b(e),g=f.hasClass(“open”);if(c(),!g){“ontouchstart”in document.documentElement&&!f.closest(“.navbar-nav”).length&&a(document.createElement(“div”)).addClass(“dropdown-backdrop”).insertAfter(a(this)).on(“click”,c);var h={relatedTarget:this};if(f.trigger(d=a.Event(“show.bs.dropdown”,h)),d.isDefaultPrevented())return;e.trigger(“focus”).attr(“aria-expanded”,“true”),f.toggleClass(“open”).trigger(a.Event(“shown.bs.dropdown”,h))}return!1}},g.prototype.keydown=function©{if(/(38|40|27|32)/.test(c.which)&&!/input|textarea/i.test(c.target.tagName)){var d=a(this);if(c.preventDefault(),c.stopPropagation(),!d.is(“.disabled, :disabled”)){var e=b(d),g=e.hasClass(“open”);if(!g&&27!=c.which||g&&27==c.which)return 27==c.which&&e.find(f).trigger(“focus”),d.trigger(“click”);var h=“ li:not(.disabled):visible a”,i=e.find(“.dropdown-menu”+h);if(i.length){var j=i.index(c.target);38==c.which&&j>0&&j–,40==c.which&&j<i.length-1&&j++,~j||(j=0),i.eq(j).trigger(“focus”)}}}};var h=a.fn.dropdown;a.fn.dropdown=d,a.fn.dropdown.Constructor=g,a.fn.dropdown.noConflict=function(){return a.fn.dropdown=h,this},a(document).on(“click.bs.dropdown.data-api”,c).on(“click.bs.dropdown.data-api”,“.dropdown form”,function(a){a.stopPropagation()}).on(“click.bs.dropdown.data-api”,f,g.prototype.toggle).on(“keydown.bs.dropdown.data-api”,f,g.prototype.keydown).on(“keydown.bs.dropdown.data-api”,“.dropdown-menu”,g.prototype.keydown)}(jQuery),+function(a){“use strict”;function b(b,d){return this.each(function(){var e=a(this),f=e.data(“bs.modal”),g=a.extend({},c.DEFAULTS,e.data(),“object”==typeof b&&b);f||e.data(“bs.modal”,f=new c(this,g)),“string”==typeof b?f(d):g.show&&f.show(d)})}var c=function(b,c){this.options=c,this.$body=a(document.body),this.$element=a(b),this.$dialog=this.$element.find(“.modal-dialog”),this.$backdrop=null,this.isShown=null,this.originalBodyPad=null,this.scrollbarWidth=0,this.ignoreBackdropClick=!1,this.options.remote&&this.$element.find(“.modal-content”).load(this.options.remote,a.proxy(function(){this.$element.trigger(“loaded.bs.modal”)},this))};c.VERSION=“3.3.7”,c.TRANSITION_DURATION=300,c.BACKDROP_TRANSITION_DURATION=150,c.DEFAULTS={backdrop:!0,keyboard:!0,show:!0},c.prototype.toggle=function(a){return this.isShown?this.hide():this.show(a)},c.prototype.show=function(b){var d=this,e=a.Event(“show.bs.modal”,{relatedTarget:b});this.$element.trigger(e),this.isShown||e.isDefaultPrevented()||(this.isShown=!0,this.checkScrollbar(),this.setScrollbar(),this.$body.addClass(“modal-open”),this.escape(),this.resize(),this.$element.on(“click.dismiss.bs.modal”,‘[data-dismiss=“modal”]’,a.proxy(this.hide,this)),this.$dialog.on(“mousedown.dismiss.bs.modal”,function(){d.$element.one(“mouseup.dismiss.bs.modal”,function(b){a(b.target).is(d.$element)&&(d.ignoreBackdropClick=!0)})}),this.backdrop(function(){var e=a.support.transition&&d.$element.hasClass(“fade”);d.$element.parent().length||d.$element.appendTo(d.$body),d.$element.show().scrollTop(0),d.adjustDialog(),e&&d.$element.offsetWidth,d.$element.addClass(“in”),d.enforceFocus();var f=a.Event(“shown.bs.modal”,{relatedTarget:b});e?d.$dialog.one(“bsTransitionEnd”,function(){d.$element.trigger(“focus”).trigger(f)}).emulateTransitionEnd(c.TRANSITION_DURATION):d.$element.trigger(“focus”).trigger(f)}))},c.prototype.hide=function(b){b&&b.preventDefault(),b=a.Event(“hide.bs.modal”),this.$element.trigger(b),this.isShown&&!b.isDefaultPrevented()&&(this.isShown=!1,this.escape(),this.resize(),a(document).off(“focusin.bs.modal”),this.$element.removeClass(“in”).off(“click.dismiss.bs.modal”).off(“mouseup.dismiss.bs.modal”),this.$dialog.off(“mousedown.dismiss.bs.modal”),a.support.transition&&this.$element.hasClass(“fade”)?this.$element.one(“bsTransitionEnd”,a.proxy(this.hideModal,this)).emulateTransitionEnd(c.TRANSITION_DURATION):this.hideModal())},c.prototype.enforceFocus=function(){a(document).off(“focusin.bs.modal”).on(“focusin.bs.modal”,a.proxy(function(a){document===a.target||this.$element===a.target||this.$element.has(a.target).length||this.$element.trigger(“focus”)},this))},c.prototype.escape=function(){this.isShown&&this.options.keyboard?this.$element.on(“keydown.dismiss.bs.modal”,a.proxy(function(a){27==a.which&&this.hide()},this)):this.isShown||this.$element.off(“keydown.dismiss.bs.modal”)},c.prototype.resize=function(){this.isShown?a(window).on(“resize.bs.modal”,a.proxy(this.handleUpdate,this)):a(window).off(“resize.bs.modal”)},c.prototype.hideModal=function(){var a=this;this.$element.hide(),this.backdrop(function(){a.$body.removeClass(“modal-open”),a.resetAdjustments(),a.resetScrollbar(),a.$element.trigger(“hidden.bs.modal”)})},c.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},c.prototype.backdrop=function(b){var d=this,e=this.$element.hasClass(“fade”)?“fade”:“”;if(this.isShown&&this.options.backdrop){var f=a.support.transition&&e;if(this.$backdrop=a(document.createElement(“div”)).addClass(“modal-backdrop ”+e).appendTo(this.$body),this.$element.on(“click.dismiss.bs.modal”,a.proxy(function(a){return this.ignoreBackdropClick?void(this.ignoreBackdropClick=!1):void(a.target===a.currentTarget&&(“static”==this.options.backdrop?this.$element.focus():this.hide()))},this)),f&&this.$backdrop.offsetWidth,this.$backdrop.addClass(“in”),!b)return;f?this.$backdrop.one(“bsTransitionEnd”,b).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION):b()}else if(!this.isShown&&this.$backdrop){this.$backdrop.removeClass(“in”);var g=function(){d.removeBackdrop(),b&&b()};a.support.transition&&this.$element.hasClass(“fade”)?this.$backdrop.one(“bsTransitionEnd”,g).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION):g()}else b&&b()},c.prototype.handleUpdate=function(){this.adjustDialog()},c.prototype.adjustDialog=function(){var a=this.$element.scrollHeight>document.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&a?this.scrollbarWidth:“”,paddingRight:this.bodyIsOverflowing&&!a?this.scrollbarWidth:“”})},c.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:“”,paddingRight:“”})},c.prototype.checkScrollbar=function(){var a=window.innerWidth;if(!a){var b=document.documentElement.getBoundingClientRect();a=b.right-Math.abs(b.left)}this.bodyIsOverflowing=document.body.clientWidth<a,this.scrollbarWidth=this.measureScrollbar()},c.prototype.setScrollbar=function(){var a=parseInt(this.$body.css(“padding-right”)||0,10);this.originalBodyPad=document.body.style.paddingRight||“”,this.bodyIsOverflowing&&this.$body.css(“padding-right”,a+this.scrollbarWidth)},c.prototype.resetScrollbar=function(){this.$body.css(“padding-right”,this.originalBodyPad)},c.prototype.measureScrollbar=function(){var a=document.createElement(“div”);a.className=“modal-scrollbar-measure”,this.$body.append(a);var b=a.offsetWidth-a.clientWidth;return this.$body.removeChild(a),b};var d=a.fn.modal;a.fn.modal=b,a.fn.modal.Constructor=c,a.fn.modal.noConflict=function(){return a.fn.modal=d,this},a(document).on(“click.bs.modal.data-api”,‘[data-toggle=“modal”]’,function©{var d=a(this),e=d.attr(“href”),f=a(d.attr(“data-target”)||e&&e.replace(/.*(?=#[^\s]+$)/,“”)),g=f.data(“bs.modal”)?“toggle”:a.extend({remote:!/#/.test(e)&&e},f.data(),d.data());d.is(“a”)&&c.preventDefault(),f.one(“show.bs.modal”,function(a){a.isDefaultPrevented()||f.one(“hidden.bs.modal”,function(){d.is(“:visible”)&&d.trigger(“focus”)})}),b.call(f,g,this)})}(jQuery),+function(a){“use strict”;function b(b){return this.each(function(){var d=a(this),e=d.data(“bs.tooltip”),f=“object”==typeof b&&b;!e&&/destroy|hide/.test(b)||(e||d.data(“bs.tooltip”,e=new c(this,f)),“string”==typeof b&&e())})}var c=function(a,b){this.type=null,this.options=null,this.enabled=null,this.timeout=null,this.hoverState=null,this.$element=null,this.inState=null,this.init(“tooltip”,a,b)};c.VERSION=“3.3.7”,c.TRANSITION_DURATION=150,c.DEFAULTS={animation:!0,placement:“top”,selector:!1,template:‘<div class=“tooltip” role=“tooltip”><div class=“tooltip-arrow”></div><div class=“tooltip-inner”></div></div>’,trigger:“hover focus”,title:“”,delay:0,html:!1,container:!1,viewport:{selector:“body”,padding:0}},c.prototype.init=function(b,c,d){if(this.enabled=!0,this.type=b,this.$element=a©,this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(a.isFunction(this.options.viewport)?this.options.viewport.call(this,this.$element):this.options.viewport.selector||this.options.viewport),this.inState={click:!1,hover:!1,focus:!1},this.$elementinstanceof document.constructor&&!this.options.selector)throw new Error(“selector option must be specified when initializing ”this.type“ on the window.document object!”);for(var e=this.options.trigger.split(“ ”),f=e.length;f–;){var g=e;if(“click”==g)this.$element.on(“click.”+this.type,this.options.selector,a.proxy(this.toggle,this));else if(“manual”!=g){var h=“hover”==g?“mouseenter”:“focusin”,i=“hover”==g?“mouseleave”:“focusout”;this.$element.on(h+“.”+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+“.”+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:“manual”,selector:“”}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&“number”==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c!=d&&(b=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data(“bs.”+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data(“bs.”+this.type,c)),b instanceof a.Event&&(c.inState[“focusin”==b.type?“focus”:“hover”]=!0),c.tip().hasClass(“in”)||“in”==c.hoverState?void(c.hoverState=“in”):(clearTimeout(c.timeout),c.hoverState=“in”,c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){“in”==c.hoverState&&c.show()},c.options.delay.show)):c.show())},c.prototype.isInStateTrue=function(){for(var a in this.inState)if(this.inState[a])return!0;return!1},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data(“bs.”+this.type);if(c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data(“bs.”+this.type,c)),b instanceof a.Event&&(c.inState[“focusout”==b.type?“focus”:“hover”]=!1),!c.isInStateTrue())return clearTimeout(c.timeout),c.hoverState=“out”,c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){“out”==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide()},c.prototype.show=function(){var b=a.Event(“show.bs.”+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var d=a.contains(this.$element.ownerDocument.documentElement,this.$element);if(b.isDefaultPrevented()||!d)return;var e=this,f=this.tip(),g=this.getUID(this.type);this.setContent(),f.attr(“id”,g),this.$element.attr(“aria-describedby”,g),this.options.animation&&f.addClass(“fade”);var h=“function”==typeof this.options.placement?this.options.placement.call(this,f,this.$element):this.options.placement,i=/\s?auto?\s?/i,j=i.test(h);j&&(h=h.replace(i,“”)||“top”),f.detach().css({top:0,left:0,display:“block”}).addClass(h).data(“bs.”+this.type,this),this.options.container?f.appendTo(this.options.container):f.insertAfter(this.$element),this.$element.trigger(“inserted.bs.”+this.type);var k=this.getPosition(),l=f.offsetWidth,m=f.offsetHeight;if(j){var n=h,o=this.getPosition(this.$viewport);h=“bottom”==h&&k.bottom+m>o.bottom?“top”:“top”==h&&k.top-m<o.top?“bottom”:“right”==h&&k.right+l>o.width?“left”:“left”==h&&k.left-l<o.left?“right”:h,f.removeClass(n).addClass(h)}var p=this.getCalculatedOffset(h,k,l,m);this.applyPlacement(p,h);var q=function(){var a=e.hoverState;e.$element.trigger(“shown.bs.”+e.type),e.hoverState=null,“out”==a&&e.leave(e)};a.support.transition&&this.$tip.hasClass(“fade”)?f.one(“bsTransitionEnd”,q).emulateTransitionEnd(c.TRANSITION_DURATION):q()}},c.prototype.applyPlacement=function(b,c){var d=this.tip(),e=d.offsetWidth,f=d.offsetHeight,g=parseInt(d.css(“margin-top”),10),h=parseInt(d.css(“margin-left”),10);isNaN(g)&&(g=0),isNaN(h)&&(h=0),b.top+=g,b.left+=h,a.offset.setOffset(d,a.extend({using:function(a){d.css({top:Math.round(a.top),left:Math.round(a.left)})}},b),0),d.addClass(“in”);var i=d.offsetWidth,j=d.offsetHeight;“top”==c&&j!=f&&(b.top=b.top+f-j);var k=this.getViewportAdjustedDelta(c,b,i,j);k.left?b.left+=k.left:b.top+=k.top;var l=/top|bottom/.test©,m=l?2*k.left-e+i:2*k.top-f+j,n=l?“offsetWidth”:“offsetHeight”;d.offset(b),this.replaceArrow(m,d[n],l)},c.prototype.replaceArrow=function(a,b,c){this.arrow().css(c?“left”:“top”,50*(1-a/b)+“%”).css(c?“top”:“left”,“”)},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle();a.find(“.tooltip-inner”)[this.options.html?“html”:“text”](b),a.removeClass(“fade in top bottom left right”)},c.prototype.hide=function(b){function d(){“in”!=e.hoverState&&f.detach(),e.$element&&e.$element.removeAttr(“aria-describedby”).trigger(“hidden.bs.”+e.type),b&&b()}var e=this,f=a(this.$tip),g=a.Event(“hide.bs.”+this.type);if(this.$element.trigger(g),!g.isDefaultPrevented())return f.removeClass(“in”),a.support.transition&&f.hasClass(“fade”)?f.one(“bsTransitionEnd”,d).emulateTransitionEnd(c.TRANSITION_DURATION):d(),this.hoverState=null,this},c.prototype.fixTitle=function(){var a=this.$element;(a.attr(“title”)||“string”!=typeof a.attr(“data-original-title”))&&a.attr(“data-original-title”,a.attr(“title”)||“”).attr(“title”,“”)},c.prototype.hasContent=function(){return this.getTitle()},c.prototype.getPosition=function(b){b=b||this.$element;var c=b,d=“BODY”==c.tagName,e=c.getBoundingClientRect();null==e.width&&(e=a.extend({},e,{width:e.right-e.left,height:e.bottom-e.top}));var f=window.SVGElement&&c instanceof window.SVGElement,g=d?{top:0,left:0}:f?null:b.offset(),h={scroll:d?document.documentElement.scrollTop||document.body.scrollTop:b.scrollTop()},i=d?{width:a(window).width(),height:a(window).height()}:null;return a.extend({},e,h,i,g)},c.prototype.getCalculatedOffset=function(a,b,c,d){return“bottom”==a?{top:b.top+b.height,left:b.left+b.width/2-c/2}:“top”==a?{top:b.top-d,left:b.left+b.width/2-c/2}:“left”==a?{top:b.top+b.height/2-d/2,left:b.left-c}:{top:b.top+b.height/2-d/2,left:b.left+b.width}},c.prototype.getViewportAdjustedDelta=function(a,b,c,d){var e={top:0,left:0};if(!this.$viewport)return e;var f=this.options.viewport&&this.options.viewport.padding||0,g=this.getPosition(this.$viewport);if(/right|left/.test(a)){var h=b.top-f-g.scroll,i=b.top+f-g.scroll+d;h<g.top?e.top=g.top-h:i>g.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;j<g.left?e.left=g.left-j:k>g.right&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr(“data-original-title”)||(“function”==typeof c.title?c.title.call(b):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){if(!this.$tip&&(this.$tip=a(this.options.template),1!=this.$tip.length))throw new Error(this.type+“ template option must consist of exactly 1 top-level element!”);return this.$tip},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(“.tooltip-arrow”)},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data(“bs.”+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data(“bs.”+this.type,c))),b?(c.inState.click=!c.inState.click,c.isInStateTrue()?c.enter©:c.leave©):c.tip().hasClass(“in”)?c.leave©:c.enter©},c.prototype.destroy=function(){var a=this;clearTimeout(this.timeout),this.hide(function(){a.$element.off(“.”+a.type).removeData(“bs.”+a.type),a.$tip&&a.$tip.detach(),a.$tip=null,a.$arrow=null,a.$viewport=null,a.$element=null})};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){“use strict”;function b(b){return this.each(function(){var d=a(this),e=d.data(“bs.popover”),f=“object”==typeof b&&b;!e&&/destroy|hide/.test(b)||(e||d.data(“bs.popover”,e=new c(this,f)),“string”==typeof b&&e())})}var c=function(a,b){this.init(“popover”,a,b)};if(!a.fn.tooltip)throw new Error(“Popover requires tooltip.js”);c.VERSION=“3.3.7”,c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:“right”,trigger:“click”,content:“”,template:‘<div class=“popover” role=“tooltip”><div class=“arrow”></div><h3 class=“popover-title”></h3><div class=“popover-content”></div></div>’}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(“.popover-title”)[this.options.html?“html”:“text”](b),a.find(“.popover-content”).children().detach().end()[this.options.html?“string”==typeof c?“html”:“append”:“text”]©,a.removeClass(“fade top bottom left right in”),a.find(“.popover-title”).html()||a.find(“.popover-title”).hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr(“data-content”)||(“function”==typeof b.content?b.content.call(a):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(“.arrow”)};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){“use strict”;function b(c,d){this.$body=a(document.body),this.$scrollElement=a(a©.is(document.body)?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||“”)+“ .nav li > a”,this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on(“scroll.bs.scrollspy”,a.proxy(this.process,this)),this.refresh(),this.process()}function c©{return this.each(function(){var d=a(this),e=d.data(“bs.scrollspy”),f=“object”==typeof c&&c;e||d.data(“bs.scrollspy”,e=new b(this,f)),“string”==typeof c&&e()})}b.VERSION=“3.3.7”,b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement.scrollHeight||Math.max(this.$body.scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b=this,c=“offset”,d=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),a.isWindow(this.$scrollElement)||(c=“position”,d=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var b=a(this),e=b.data(“target”)||b.attr(“href”),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(“:visible”)&&[[f().top+d,e]]||null}).sort(function(a,b){return a-b}).each(function(){b.offsets.push(this),b.targets.push(this)})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f)&&this.activate(a);if(g&&b<e)return this.activeTarget=null,this.clear();for(a=e.length;a–;)g!=f&&b>=e&&(void 0===e||b<e)&&this.activate(f)},b.prototype.activate=function(b){ this.activeTarget=b,this.clear();var c=this.selector+‘[data-target=“’b‘”],’this.selector‘[href=“’b‘”]’,d=a©.parents(“li”).addClass(“active”);d.parent(“.dropdown-menu”).length&&(d=d.closest(“li.dropdown”).addClass(“active”)),d.trigger(“activate.bs.scrollspy”)},b.prototype.clear=function(){a(this.selector).parentsUntil(this.options.target,“.active”).removeClass(“active”)};var d=a.fn.scrollspy;a.fn.scrollspy=c,a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=d,this},a(window).on(“load.bs.scrollspy.data-api”,function(){a(‘[data-spy=“scroll”]’).each(function(){var b=a(this);c.call(b,b.data())})})}(jQuery),+function(a){“use strict”;function b(b){return this.each(function(){var d=a(this),e=d.data(“bs.tab”);e||d.data(“bs.tab”,e=new c(this)),“string”==typeof b&&e()})}var c=function(b){this.element=a(b)};c.VERSION=“3.3.7”,c.TRANSITION_DURATION=150,c.prototype.show=function(){var b=this.element,c=b.closest(“ul:not(.dropdown-menu)”),d=b.data(“target”);if(d||(d=b.attr(“href”),d=d&&d.replace(/.*(?=#[^\s]*$)/,“”)),!b.parent(“li”).hasClass(“active”)){var e=c.find(“.active:last a”),f=a.Event(“hide.bs.tab”,{relatedTarget:b}),g=a.Event(“show.bs.tab”,{relatedTarget:e});if(e.trigger(f),b.trigger(g),!g.isDefaultPrevented()&&!f.isDefaultPrevented()){var h=a(d);this.activate(b.closest(“li”),c),this.activate(h,h.parent(),function(){e.trigger({type:“hidden.bs.tab”,relatedTarget:b}),b.trigger({type:“shown.bs.tab”,relatedTarget:e})})}}},c.prototype.activate=function(b,d,e){function f(){g.removeClass(“active”).find(“> .dropdown-menu > .active”).removeClass(“active”).end().find(‘[data-toggle=“tab”]’).attr(“aria-expanded”,!1),b.addClass(“active”).find(‘[data-toggle=“tab”]’).attr(“aria-expanded”,!0),h?(b.offsetWidth,b.addClass(“in”)):b.removeClass(“fade”),b.parent(“.dropdown-menu”).length&&b.closest(“li.dropdown”).addClass(“active”).end().find(‘[data-toggle=“tab”]’).attr(“aria-expanded”,!0),e&&e()}var g=d.find(“> .active”),h=e&&a.support.transition&&(g.length&&g.hasClass(“fade”)||!!d.find(“> .fade”).length);g.length&&h?g.one(“bsTransitionEnd”,f).emulateTransitionEnd(c.TRANSITION_DURATION):f(),g.removeClass(“in”)};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this};var e=function©{c.preventDefault(),b.call(a(this),“show”)};a(document).on(“click.bs.tab.data-api”,‘[data-toggle=“tab”]’,e).on(“click.bs.tab.data-api”,‘[data-toggle=“pill”]’,e)}(jQuery),+function(a){“use strict”;function b(b){return this.each(function(){var d=a(this),e=d.data(“bs.affix”),f=“object”==typeof b&&b;e||d.data(“bs.affix”,e=new c(this,f)),“string”==typeof b&&e()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on(“scroll.bs.affix.data-api”,a.proxy(this.checkPosition,this)).on(“click.bs.affix.data-api”,a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};c.VERSION=“3.3.7”,c.RESET=“affix affix-top affix-bottom”,c.DEFAULTS={offset:0,target:window},c.prototype.getState=function(a,b,c,d){var e=this.$target.scrollTop(),f=this.$element.offset(),g=this.$target.height();if(null!=c&&“top”==this.affixed)return e<c&&“top”;if(“bottom”==this.affixed)return null!=c?!(e+this.unpin<=f.top)&&“bottom”:!(e+g<=a-d)&&“bottom”;var h=null==this.affixed,i=h?e:f.top,j=h?g:b;return null!=c&&e<=c?“top”:null!=d&&i+j>=a-d&&“bottom”},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass(“affix”);var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(“:visible”)){var b=this.$element.height(),d=this.options.offset,e=d.top,f=d.bottom,g=Math.max(a(document).height(),a(document.body).height());“object”!=typeof d&&(f=e=d),“function”==typeof e&&(e=d.top(this.$element)),“function”==typeof f&&(f=d.bottom(this.$element));var h=this.getState(g,b,e,f);if(this.affixed!=h){null!=this.unpin&&this.$element.css(“top”,“”);var i=“affix”+(h?“-”+h:“”),j=a.Event(i+“.bs.affix”);if(this.$element.trigger(j),j.isDefaultPrevented())return;this.affixed=h,this.unpin=“bottom”==h?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(i).trigger(i.replace(“affix”,“affixed”)+“.bs.affix”)}“bottom”==h&&this.$element.offset({top:g-b-f})}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on(“load”,function(){a(‘[data-spy=“affix”]’).each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},null!=d.offsetBottom&&(d.offset.bottom=d.offsetBottom),null!=d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery);

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/assets/vendor/javascripts/highcharts_src-4_0_1_js.html b/doc/tmp/rubycritic/assets/vendor/javascripts/highcharts_src-4_0_1_js.html new file mode 100644 index 0000000000..e2a9caf3bf --- /dev/null +++ b/doc/tmp/rubycritic/assets/vendor/javascripts/highcharts_src-4_0_1_js.html @@ -0,0 +1,19543 @@ + + + + + + + +highcharts.src-4.0.1.js - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

// ==ClosureCompiler== // @compilation_level SIMPLE_OPTIMIZATIONS

+ +

/**

+ +
* @license Highcharts JS v4.0.1 (2014-04-24)
+*
+* (c) 2009-2014 Torstein Honsi
+*
+* License: www.highcharts.com/license
+*/
+ +

// JSLint options: /*global Highcharts, document, window, navigator, setInterval, clearInterval, clearTimeout, setTimeout, location, jQuery, $, console, each, grep */

+ +

(function () { // encapsulated variables var UNDEFINED,

+ +
doc = document,
+win = window,
+math = Math,
+mathRound = math.round,
+mathFloor = math.floor,
+mathCeil = math.ceil,
+mathMax = math.max,
+mathMin = math.min,
+mathAbs = math.abs,
+mathCos = math.cos,
+mathSin = math.sin,
+mathPI = math.PI,
+deg2rad = mathPI * 2 / 360,
+
+// some variables
+userAgent = navigator.userAgent,
+isOpera = win.opera,
+isIE = /msie/i.test(userAgent) && !isOpera,
+docMode8 = doc.documentMode === 8,
+isWebKit = /AppleWebKit/.test(userAgent),
+isFirefox = /Firefox/.test(userAgent),
+isTouchDevice = /(Mobile|Android|Windows Phone)/.test(userAgent),
+SVG_NS = 'http://www.w3.org/2000/svg',
+hasSVG = !!doc.createElementNS && !!doc.createElementNS(SVG_NS, 'svg').createSVGRect,
+hasBidiBug = isFirefox && parseInt(userAgent.split('Firefox/')[1], 10) < 4, // issue #38
+useCanVG = !hasSVG && !isIE && !!doc.createElement('canvas').getContext,
+Renderer,
+hasTouch,
+symbolSizes = {},
+idCounter = 0,
+garbageBin,
+defaultOptions,
+dateFormat, // function
+globalAnimation,
+pathAnim,
+timeUnits,
+noop = function () {},
+charts = [],
+chartCount = 0,
+PRODUCT = 'Highcharts',
+VERSION = '4.0.1',
+
+// some constants for frequently used strings
+DIV = 'div',
+ABSOLUTE = 'absolute',
+RELATIVE = 'relative',
+HIDDEN = 'hidden',
+PREFIX = 'highcharts-',
+VISIBLE = 'visible',
+PX = 'px',
+NONE = 'none',
+M = 'M',
+L = 'L',
+numRegex = /^[0-9]+$/,
+NORMAL_STATE = '',
+HOVER_STATE = 'hover',
+SELECT_STATE = 'select',
+MILLISECOND = 'millisecond',
+SECOND = 'second',
+MINUTE = 'minute',
+HOUR = 'hour',
+DAY = 'day',
+WEEK = 'week',
+MONTH = 'month',
+YEAR = 'year',
+
+// Object for extending Axis
+AxisPlotLineOrBandExtension,
+
+// constants for attributes
+STROKE_WIDTH = 'stroke-width',
+
+// time methods, changed based on whether or not UTC is used
+makeTime,
+timezoneOffset,
+getMinutes,
+getHours,
+getDay,
+getDate,
+getMonth,
+getFullYear,
+setMinutes,
+setHours,
+setDate,
+setMonth,
+setFullYear,
+
+// lookup over the types and the associated classes
+seriesTypes = {};
+ +

// The Highcharts namespace var Highcharts = win.Highcharts = win.Highcharts ? error(16, true) : {};

+ +

/**

+ +
* Extend an object with the members of another
+* @param {Object} a The object to be extended
+* @param {Object} b The object to add to the first one
+*/
+ +

function extend(a, b) {

+ +
var n;
+if (!a) {
+        a = {};
+}
+for (n in b) {
+        a[n] = b[n];
+}
+return a;
+ +

}

+ +

/**

+ +
* Deep merge two or more objects and return a third object. If the first argument is
+* true, the contents of the second object is copied into the first object.
+* Previously this function redirected to jQuery.extend(true), but this had two limitations.
+* First, it deep merged arrays, which lead to workarounds in Highcharts. Second,
+* it copied properties from extended prototypes. 
+*/
+ +

function merge() {

+ +
var i,
+        args = arguments,
+        len,
+        ret = {},
+        doCopy = function (copy, original) {
+                var value, key;
+
+                // An object is replacing a primitive
+                if (typeof copy !== 'object') {
+                        copy = {};
+                }
+
+                for (key in original) {
+                        if (original.hasOwnProperty(key)) {
+                                value = original[key];
+
+                                // Copy the contents of objects, but not arrays or DOM nodes
+                                if (value && typeof value === 'object' && Object.prototype.toString.call(value) !== '[object Array]'
+                                                && key !== 'renderTo' && typeof value.nodeType !== 'number') {
+                                        copy[key] = doCopy(copy[key] || {}, value);
+
+                                // Primitives and arrays are copied over directly
+                                } else {
+                                        copy[key] = original[key];
+                                }
+                        }
+                }
+                return copy;
+        };
+
+// If first argument is true, copy into the existing object. Used in setOptions.
+if (args[0] === true) {
+        ret = args[1];
+        args = Array.prototype.slice.call(args, 2);
+}
+
+// For each argument, extend the return
+len = args.length;
+for (i = 0; i < len; i++) {
+        ret = doCopy(ret, args[i]);
+}
+
+return ret;
+ +

}

+ +

/**

+ +
* Take an array and turn into a hash with even number arguments as keys and odd numbers as
+* values. Allows creating constants for commonly used style properties, attributes etc.
+* Avoid it in performance critical situations like looping
+*/
+ +

function hash() {

+ +
var i = 0,
+        args = arguments,
+        length = args.length,
+        obj = {};
+for (; i < length; i++) {
+        obj[args[i++]] = args[i];
+}
+return obj;
+ +

}

+ +

/**

+ +
* Shortcut for parseInt
+* @param {Object} s
+* @param {Number} mag Magnitude
+*/
+ +

function pInt(s, mag) {

+ +
return parseInt(s, mag || 10);
+
+ +

}

+ +

/**

+ +
* Check for string
+* @param {Object} s
+*/
+ +

function isString(s) {

+ +
return typeof s === 'string';
+
+ +

}

+ +

/**

+ +
* Check for object
+* @param {Object} obj
+*/
+ +

function isObject(obj) {

+ +
return typeof obj === 'object';
+
+ +

}

+ +

/**

+ +
* Check for array
+* @param {Object} obj
+*/
+ +

function isArray(obj) {

+ +
return Object.prototype.toString.call(obj) === '[object Array]';
+
+ +

}

+ +

/**

+ +
* Check for number
+* @param {Object} n
+*/
+ +

function isNumber(n) {

+ +
return typeof n === 'number';
+
+ +

}

+ +

function log2lin(num) {

+ +
return math.log(num) / math.LN10;
+
+ +

} function lin2log(num) {

+ +
return math.pow(10, num);
+
+ +

}

+ +

/**

+ +
* Remove last occurence of an item from an array
+* @param {Array} arr
+* @param {Mixed} item
+*/
+ +

function erase(arr, item) {

+ +
var i = arr.length;
+while (i--) {
+        if (arr[i] === item) {
+                arr.splice(i, 1);
+                break;
+        }
+}
+//return arr;
+ +

}

+ +

/**

+ +
* Returns true if the object is not null or undefined. Like MooTools' $.defined.
+* @param {Object} obj
+*/
+ +

function defined(obj) {

+ +
return obj !== UNDEFINED && obj !== null;
+ +

}

+ +

/**

+ +
* Set or get an attribute or an object of attributes. Can't use jQuery attr because
+* it attempts to set expando properties on the SVG element, which is not allowed.
+*
+* @param {Object} elem The DOM element to receive the attribute(s)
+* @param {String|Object} prop The property or an abject of key-value pairs
+* @param {String} value The value if a single property is set
+*/
+ +

function attr(elem, prop, value) {

+ +
var key,
+        ret;
+
+// if the prop is a string
+if (isString(prop)) {
+        // set the value
+        if (defined(value)) {
+                elem.setAttribute(prop, value);
+
+        // get the value
+        } else if (elem && elem.getAttribute) { // elem not defined when printing pie demo...
+                ret = elem.getAttribute(prop);
+        }
+
+// else if prop is defined, it is a hash of key/value pairs
+} else if (defined(prop) && isObject(prop)) {
+        for (key in prop) {
+                elem.setAttribute(key, prop[key]);
+        }
+}
+return ret;
+ +

} /**

+ +
* Check if an element is an array, and if not, make it into an array. Like
+* MooTools' $.splat.
+*/
+ +

function splat(obj) {

+ +
return isArray(obj) ? obj : [obj];
+
+ +

}

+ +

/**

+ +
* Return the first value that is defined. Like MooTools' $.pick.
+*/
+ +

function pick() {

+ +
var args = arguments,
+        i,
+        arg,
+        length = args.length;
+for (i = 0; i < length; i++) {
+        arg = args[i];
+        if (typeof arg !== 'undefined' && arg !== null) {
+                return arg;
+        }
+}
+ +

}

+ +

/**

+ +
* Set CSS on a given element
+* @param {Object} el
+* @param {Object} styles Style object with camel case property names
+*/
+ +

function css(el, styles) {

+ +
if (isIE && !hasSVG) { // #2686
+        if (styles && styles.opacity !== UNDEFINED) {
+                styles.filter = 'alpha(opacity=' + (styles.opacity * 100) + ')';
+        }
+}
+extend(el.style, styles);
+ +

}

+ +

/**

+ +
* Utility function to create element with attributes and styles
+* @param {Object} tag
+* @param {Object} attribs
+* @param {Object} styles
+* @param {Object} parent
+* @param {Object} nopad
+*/
+ +

function createElement(tag, attribs, styles, parent, nopad) {

+ +
var el = doc.createElement(tag);
+if (attribs) {
+        extend(el, attribs);
+}
+if (nopad) {
+        css(el, {padding: 0, border: NONE, margin: 0});
+}
+if (styles) {
+        css(el, styles);
+}
+if (parent) {
+        parent.appendChild(el);
+}
+return el;
+ +

}

+ +

/**

+ +
* Extend a prototyped class by new members
+* @param {Object} parent
+* @param {Object} members
+*/
+ +

function extendClass(parent, members) {

+ +
var object = function () {};
+object.prototype = new parent();
+extend(object.prototype, members);
+return object;
+ +

}

+ +

/**

+ +
* Format a number and return a string based on input settings
+* @param {Number} number The input number to format
+* @param {Number} decimals The amount of decimals
+* @param {String} decPoint The decimal point, defaults to the one given in the lang options
+* @param {String} thousandsSep The thousands separator, defaults to the one given in the lang options
+*/
+ +

function numberFormat(number, decimals, decPoint, thousandsSep) {

+ +
var lang = defaultOptions.lang,
+        // http://kevin.vanzonneveld.net/techblog/article/javascript_equivalent_for_phps_number_format/
+        n = +number || 0,
+        c = decimals === -1 ?
+                (n.toString().split('.')[1] || '').length : // preserve decimals
+                (isNaN(decimals = mathAbs(decimals)) ? 2 : decimals),
+        d = decPoint === undefined ? lang.decimalPoint : decPoint,
+        t = thousandsSep === undefined ? lang.thousandsSep : thousandsSep,
+        s = n < 0 ? "-" : "",
+        i = String(pInt(n = mathAbs(n).toFixed(c))),
+        j = i.length > 3 ? i.length % 3 : 0;
+
+return s + (j ? i.substr(0, j) + t : "") + i.substr(j).replace(/(\d{3})(?=\d)/g, "$1" + t) +
+        (c ? d + mathAbs(n - i).toFixed(c).slice(2) : "");
+ +

}

+ +

/**

+ +
* Pad a string to a given length by adding 0 to the beginning
+* @param {Number} number
+* @param {Number} length
+*/
+ +

function pad(number, length) {

+ +
// Create an array of the remaining length +1 and join it with 0's
+return new Array((length || 2) + 1 - String(number).length).join(0) + number;
+ +

}

+ +

/**

+ +
* Wrap a method with extended functionality, preserving the original function
+* @param {Object} obj The context object that the method belongs to 
+* @param {String} method The name of the method to extend
+* @param {Function} func A wrapper function callback. This function is called with the same arguments
+* as the original function, except that the original function is unshifted and passed as the first 
+* argument. 
+*/
+ +

function wrap(obj, method, func) {

+ +
var proceed = obj[method];
+obj[method] = function () {
+        var args = Array.prototype.slice.call(arguments);
+        args.unshift(proceed);
+        return func.apply(this, args);
+};
+
+ +

}

+ +

/**

+ +
* Based on http://www.php.net/manual/en/function.strftime.php
+* @param {String} format
+* @param {Number} timestamp
+* @param {Boolean} capitalize
+*/
+ +

dateFormat = function (format, timestamp, capitalize) {

+ +
if (!defined(timestamp) || isNaN(timestamp)) {
+        return 'Invalid date';
+}
+format = pick(format, '%Y-%m-%d %H:%M:%S');
+
+var date = new Date(timestamp - timezoneOffset),
+        key, // used in for constuct below
+        // get the basic time values
+        hours = date[getHours](),
+        day = date[getDay](),
+        dayOfMonth = date[getDate](),
+        month = date[getMonth](),
+        fullYear = date[getFullYear](),
+        lang = defaultOptions.lang,
+        langWeekdays = lang.weekdays,
+
+        // List all format keys. Custom formats can be added from the outside. 
+        replacements = extend({
+
+                // Day
+                'a': langWeekdays[day].substr(0, 3), // Short weekday, like 'Mon'
+                'A': langWeekdays[day], // Long weekday, like 'Monday'
+                'd': pad(dayOfMonth), // Two digit day of the month, 01 to 31
+                'e': dayOfMonth, // Day of the month, 1 through 31
+
+                // Week (none implemented)
+                //'W': weekNumber(),
+
+                // Month
+                'b': lang.shortMonths[month], // Short month, like 'Jan'
+                'B': lang.months[month], // Long month, like 'January'
+                'm': pad(month + 1), // Two digit month number, 01 through 12
+
+                // Year
+                'y': fullYear.toString().substr(2, 2), // Two digits year, like 09 for 2009
+                'Y': fullYear, // Four digits year, like 2009
+
+                // Time
+                'H': pad(hours), // Two digits hours in 24h format, 00 through 23
+                'I': pad((hours % 12) || 12), // Two digits hours in 12h format, 00 through 11
+                'l': (hours % 12) || 12, // Hours in 12h format, 1 through 12
+                'M': pad(date[getMinutes]()), // Two digits minutes, 00 through 59
+                'p': hours < 12 ? 'AM' : 'PM', // Upper case AM or PM
+                'P': hours < 12 ? 'am' : 'pm', // Lower case AM or PM
+                'S': pad(date.getSeconds()), // Two digits seconds, 00 through  59
+                'L': pad(mathRound(timestamp % 1000), 3) // Milliseconds (naming from Ruby)
+        }, Highcharts.dateFormats);
+
+// do the replaces
+for (key in replacements) {
+        while (format.indexOf('%' + key) !== -1) { // regex would do it in one line, but this is faster
+                format = format.replace('%' + key, typeof replacements[key] === 'function' ? replacements[key](timestamp) : replacements[key]);
+        }
+}
+
+// Optionally capitalize the string and return
+return capitalize ? format.substr(0, 1).toUpperCase() + format.substr(1) : format;
+ +

};

+ +

/**

+ +
* Format a single variable. Similar to sprintf, without the % prefix.
+*/
+ +

function formatSingle(format, val) {

+ +
var floatRegex = /f$/,
+        decRegex = /\.([0-9])/,
+        lang = defaultOptions.lang,
+        decimals;
+
+if (floatRegex.test(format)) { // float
+        decimals = format.match(decRegex);
+        decimals = decimals ? decimals[1] : -1;
+        if (val !== null) {
+                val = numberFormat(
+                        val,
+                        decimals,
+                        lang.decimalPoint,
+                        format.indexOf(',') > -1 ? lang.thousandsSep : ''
+                );
+        }
+} else {
+        val = dateFormat(format, val);
+}
+return val;
+ +

}

+ +

/**

+ +
* Format a string according to a subset of the rules of Python's String.format method.
+*/
+ +

function format(str, ctx) {

+ +
var splitter = '{',
+        isInside = false,
+        segment,
+        valueAndFormat,
+        path,
+        i,
+        len,
+        ret = [],
+        val,
+        index;
+
+while ((index = str.indexOf(splitter)) !== -1) {
+
+        segment = str.slice(0, index);
+        if (isInside) { // we're on the closing bracket looking back
+
+                valueAndFormat = segment.split(':');
+                path = valueAndFormat.shift().split('.'); // get first and leave format
+                len = path.length;
+                val = ctx;
+
+                // Assign deeper paths
+                for (i = 0; i < len; i++) {
+                        val = val[path[i]];
+                }
+
+                // Format the replacement
+                if (valueAndFormat.length) {
+                        val = formatSingle(valueAndFormat.join(':'), val);
+                }
+
+                // Push the result and advance the cursor
+                ret.push(val);
+
+        } else {
+                ret.push(segment);
+
+        }
+        str = str.slice(index + 1); // the rest
+        isInside = !isInside; // toggle
+        splitter = isInside ? '}' : '{'; // now look for next matching bracket
+}
+ret.push(str);
+return ret.join('');
+ +

}

+ +

/**

+ +
* Get the magnitude of a number
+*/
+ +

function getMagnitude(num) {

+ +
return math.pow(10, mathFloor(math.log(num) / math.LN10));
+
+ +

}

+ +

/**

+ +
* Take an interval and normalize it to multiples of 1, 2, 2.5 and 5
+* @param {Number} interval
+* @param {Array} multiples
+* @param {Number} magnitude
+* @param {Object} options
+*/
+ +

function normalizeTickInterval(interval, multiples, magnitude, options) {

+ +
var normalized, i;
+
+// round to a tenfold of 1, 2, 2.5 or 5
+magnitude = pick(magnitude, 1);
+normalized = interval / magnitude;
+
+// multiples for a linear scale
+if (!multiples) {
+        multiples = [1, 2, 2.5, 5, 10];
+
+        // the allowDecimals option
+        if (options && options.allowDecimals === false) {
+                if (magnitude === 1) {
+                        multiples = [1, 2, 5, 10];
+                } else if (magnitude <= 0.1) {
+                        multiples = [1 / magnitude];
+                }
+        }
+}
+
+// normalize the interval to the nearest multiple
+for (i = 0; i < multiples.length; i++) {
+        interval = multiples[i];
+        if (normalized <= (multiples[i] + (multiples[i + 1] || multiples[i])) / 2) {
+                break;
+        }
+}
+
+// multiply back to the correct magnitude
+interval *= magnitude;
+
+return interval;
+ +

}

+ +

/**

+ +
* Helper class that contains variuos counters that are local to the chart.
+*/
+ +

function ChartCounters() {

+ +
this.color = 0;
+this.symbol = 0;
+
+ +

}

+ +

ChartCounters.prototype = {

+ +
/**
+ * Wraps the color counter if it reaches the specified length.
+ */
+wrapColor: function (length) {
+        if (this.color >= length) {
+                this.color = 0;
+        }
+},
+
+/**
+ * Wraps the symbol counter if it reaches the specified length.
+ */
+wrapSymbol: function (length) {
+        if (this.symbol >= length) {
+                this.symbol = 0;
+        }
+}
+ +

};

+ +

/**

+ +
* Utility method that sorts an object array and keeping the order of equal items.
+* ECMA script standard does not specify the behaviour when items are equal.
+*/
+ +

function stableSort(arr, sortFunction) {

+ +
var length = arr.length,
+        sortValue,
+        i;
+
+// Add index to each item
+for (i = 0; i < length; i++) {
+        arr[i].ss_i = i; // stable sort index
+}
+
+arr.sort(function (a, b) {
+        sortValue = sortFunction(a, b);
+        return sortValue === 0 ? a.ss_i - b.ss_i : sortValue;
+});
+
+// Remove index from items
+for (i = 0; i < length; i++) {
+        delete arr[i].ss_i; // stable sort index
+}
+ +

}

+ +

/**

+ +
* Non-recursive method to find the lowest member of an array. Math.min raises a maximum
+* call stack size exceeded error in Chrome when trying to apply more than 150.000 points. This
+* method is slightly slower, but safe.
+*/
+ +

function arrayMin(data) {

+ +
var i = data.length,
+        min = data[0];
+
+while (i--) {
+        if (data[i] < min) {
+                min = data[i];
+        }
+}
+return min;
+ +

}

+ +

/**

+ +
* Non-recursive method to find the lowest member of an array. Math.min raises a maximum
+* call stack size exceeded error in Chrome when trying to apply more than 150.000 points. This
+* method is slightly slower, but safe.
+*/
+ +

function arrayMax(data) {

+ +
var i = data.length,
+        max = data[0];
+
+while (i--) {
+        if (data[i] > max) {
+                max = data[i];
+        }
+}
+return max;
+ +

}

+ +

/**

+ +
* Utility method that destroys any SVGElement or VMLElement that are properties on the given object.
+* It loops all properties and invokes destroy if there is a destroy method. The property is
+* then delete'ed.
+* @param {Object} The object to destroy properties on
+* @param {Object} Exception, do not destroy this property, only delete it.
+*/
+ +

function destroyObjectProperties(obj, except) {

+ +
var n;
+for (n in obj) {
+        // If the object is non-null and destroy is defined
+        if (obj[n] && obj[n] !== except && obj[n].destroy) {
+                // Invoke the destroy
+                obj[n].destroy();
+        }
+
+        // Delete the property from the object.
+        delete obj[n];
+}
+ +

}

+ +

/**

+ +
* Discard an element by moving it to the bin and delete
+* @param {Object} The HTML node to discard
+*/
+ +

function discardElement(element) {

+ +
// create a garbage bin element, not part of the DOM
+if (!garbageBin) {
+        garbageBin = createElement(DIV);
+}
+
+// move the node and empty bin
+if (element) {
+        garbageBin.appendChild(element);
+}
+garbageBin.innerHTML = '';
+ +

}

+ +

/**

+ +
* Provide error messages for debugging, with links to online explanation 
+*/
+ +

function error(code, stop) {

+ +
var msg = 'Highcharts error #' + code + ': www.highcharts.com/errors/' + code;
+if (stop) {
+        throw msg;
+} else if (win.console) {
+        console.log(msg);
+}
+ +

}

+ +

/**

+ +
* Fix JS round off float errors
+* @param {Number} num
+*/
+ +

function correctFloat(num) {

+ +
return parseFloat(
+        num.toPrecision(14)
+);
+
+ +

}

+ +

/**

+ +
* Set the global animation to either a given value, or fall back to the
+* given chart's animation option
+* @param {Object} animation
+* @param {Object} chart
+*/
+ +

function setAnimation(animation, chart) {

+ +
globalAnimation = pick(animation, chart.animation);
+
+ +

}

+ +

/**

+ +
* The time unit lookup
+*/
+ +

/*jslint white: true*/ timeUnits = hash(

+ +
MILLISECOND, 1,
+SECOND, 1000,
+MINUTE, 60000,
+HOUR, 3600000,
+DAY, 24 * 3600000,
+WEEK, 7 * 24 * 3600000,
+MONTH, 31 * 24 * 3600000,
+YEAR, 31556952000
+ +

); /*jslint white: false*/ /**

+ +
* Path interpolation algorithm used across adapters
+*/
+ +

pathAnim = {

+ +
/**
+ * Prepare start and end values so that the path can be animated one to one
+ */
+init: function (elem, fromD, toD) {
+        fromD = fromD || '';
+        var shift = elem.shift,
+                bezier = fromD.indexOf('C') > -1,
+                numParams = bezier ? 7 : 3,
+                endLength,
+                slice,
+                i,
+                start = fromD.split(' '),
+                end = [].concat(toD), // copy
+                startBaseLine,
+                endBaseLine,
+                sixify = function (arr) { // in splines make move points have six parameters like bezier curves
+                        i = arr.length;
+                        while (i--) {
+                                if (arr[i] === M) {
+                                        arr.splice(i + 1, 0, arr[i + 1], arr[i + 2], arr[i + 1], arr[i + 2]);
+                                }
+                        }
+                };
+
+        if (bezier) {
+                sixify(start);
+                sixify(end);
+        }
+
+        // pull out the base lines before padding
+        if (elem.isArea) {
+                startBaseLine = start.splice(start.length - 6, 6);
+                endBaseLine = end.splice(end.length - 6, 6);
+        }
+
+        // if shifting points, prepend a dummy point to the end path
+        if (shift <= end.length / numParams && start.length === end.length) {
+                while (shift--) {
+                        end = [].concat(end).splice(0, numParams).concat(end);
+                }
+        }
+        elem.shift = 0; // reset for following animations
+
+        // copy and append last point until the length matches the end length
+        if (start.length) {
+                endLength = end.length;
+                while (start.length < endLength) {
+
+                        //bezier && sixify(start);
+                        slice = [].concat(start).splice(start.length - numParams, numParams);
+                        if (bezier) { // disable first control point
+                                slice[numParams - 6] = slice[numParams - 2];
+                                slice[numParams - 5] = slice[numParams - 1];
+                        }
+                        start = start.concat(slice);
+                }
+        }
+
+        if (startBaseLine) { // append the base lines for areas
+                start = start.concat(startBaseLine);
+                end = end.concat(endBaseLine);
+        }
+        return [start, end];
+},
+
+/**
+ * Interpolate each value of the path and return the array
+ */
+step: function (start, end, pos, complete) {
+        var ret = [],
+                i = start.length,
+                startVal;
+
+        if (pos === 1) { // land on the final path without adjustment points appended in the ends
+                ret = complete;
+
+        } else if (i === end.length && pos < 1) {
+                while (i--) {
+                        startVal = parseFloat(start[i]);
+                        ret[i] =
+                                isNaN(startVal) ? // a letter instruction like M or L
+                                        start[i] :
+                                        pos * (parseFloat(end[i] - startVal)) + startVal;
+
+                }
+        } else { // if animation is finished or length not matching, land on right value
+                ret = end;
+        }
+        return ret;
+}
+ +

};

+ +

(function ($) {

+ +
/**
+ * The default HighchartsAdapter for jQuery
+ */
+win.HighchartsAdapter = win.HighchartsAdapter || ($ && {
+
+        /**
+         * Initialize the adapter by applying some extensions to jQuery
+         */
+        init: function (pathAnim) {
+
+                // extend the animate function to allow SVG animations
+                var Fx = $.fx,
+                        Step = Fx.step,
+                        dSetter,
+                        Tween = $.Tween,
+                        propHooks = Tween && Tween.propHooks,
+                        opacityHook = $.cssHooks.opacity;
+
+                /*jslint unparam: true*//* allow unused param x in this function */
+                $.extend($.easing, {
+                        easeOutQuad: function (x, t, b, c, d) {
+                                return -c * (t /= d) * (t - 2) + b;
+                        }
+                });
+                /*jslint unparam: false*/
+
+                // extend some methods to check for elem.attr, which means it is a Highcharts SVG object
+                $.each(['cur', '_default', 'width', 'height', 'opacity'], function (i, fn) {
+                        var obj = Step,
+                                base;
+
+                        // Handle different parent objects
+                        if (fn === 'cur') {
+                                obj = Fx.prototype; // 'cur', the getter, relates to Fx.prototype
+
+                        } else if (fn === '_default' && Tween) { // jQuery 1.8 model
+                                obj = propHooks[fn];
+                                fn = 'set';
+                        }
+
+                        // Overwrite the method
+                        base = obj[fn];
+                        if (base) { // step.width and step.height don't exist in jQuery < 1.7
+
+                                // create the extended function replacement
+                                obj[fn] = function (fx) {
+
+                                        var elem;
+
+                                        // Fx.prototype.cur does not use fx argument
+                                        fx = i ? fx : this;
+
+                                        // Don't run animations on textual properties like align (#1821)
+                                        if (fx.prop === 'align') {
+                                                return;
+                                        }
+
+                                        // shortcut
+                                        elem = fx.elem;
+
+                                        // Fx.prototype.cur returns the current value. The other ones are setters
+                                        // and returning a value has no effect.
+                                        return elem.attr ? // is SVG element wrapper
+                                                elem.attr(fx.prop, fn === 'cur' ? UNDEFINED : fx.now) : // apply the SVG wrapper's method
+                                                base.apply(this, arguments); // use jQuery's built-in method
+                                };
+                        }
+                });
+
+                // Extend the opacity getter, needed for fading opacity with IE9 and jQuery 1.10+
+                wrap(opacityHook, 'get', function (proceed, elem, computed) {
+                        return elem.attr ? (elem.opacity || 0) : proceed.call(this, elem, computed);
+                });
+
+                // Define the setter function for d (path definitions)
+                dSetter = function (fx) {
+                        var elem = fx.elem,
+                                ends;
+
+                        // Normally start and end should be set in state == 0, but sometimes,
+                        // for reasons unknown, this doesn't happen. Perhaps state == 0 is skipped
+                        // in these cases
+                        if (!fx.started) {
+                                ends = pathAnim.init(elem, elem.d, elem.toD);
+                                fx.start = ends[0];
+                                fx.end = ends[1];
+                                fx.started = true;
+                        }
+
+                        // interpolate each value of the path
+                        elem.attr('d', pathAnim.step(fx.start, fx.end, fx.pos, elem.toD));
+                };
+
+                // jQuery 1.8 style
+                if (Tween) {
+                        propHooks.d = {
+                                set: dSetter
+                        };
+                // pre 1.8
+                } else {
+                        // animate paths
+                        Step.d = dSetter;
+                }
+
+                /**
+                 * Utility for iterating over an array. Parameters are reversed compared to jQuery.
+                 * @param {Array} arr
+                 * @param {Function} fn
+                 */
+                this.each = Array.prototype.forEach ?
+                        function (arr, fn) { // modern browsers
+                                return Array.prototype.forEach.call(arr, fn);
+
+                        } : 
+                        function (arr, fn) { // legacy
+                                var i = 0, 
+                                        len = arr.length;
+                                for (; i < len; i++) {
+                                        if (fn.call(arr[i], arr[i], i, arr) === false) {
+                                                return i;
+                                        }
+                                }
+                        };
+
+                /**
+                 * Register Highcharts as a plugin in the respective framework
+                 */
+                $.fn.highcharts = function () {
+                        var constr = 'Chart', // default constructor
+                                args = arguments,
+                                options,
+                                ret,
+                                chart;
+
+                        if (this[0]) {
+
+                                if (isString(args[0])) {
+                                        constr = args[0];
+                                        args = Array.prototype.slice.call(args, 1); 
+                                }
+                                options = args[0];
+
+                                // Create the chart
+                                if (options !== UNDEFINED) {
+                                        /*jslint unused:false*/
+                                        options.chart = options.chart || {};
+                                        options.chart.renderTo = this[0];
+                                        chart = new Highcharts[constr](options, args[1]);
+                                        ret = this;
+                                        /*jslint unused:true*/
+                                }
+
+                                // When called without parameters or with the return argument, get a predefined chart
+                                if (options === UNDEFINED) {
+                                        ret = charts[attr(this[0], 'data-highcharts-chart')];
+                                }
+                        }
+
+                        return ret;
+                };
+
+        },
+
+        /**
+         * Downloads a script and executes a callback when done.
+         * @param {String} scriptLocation
+         * @param {Function} callback
+         */
+        getScript: $.getScript,
+
+        /**
+         * Return the index of an item in an array, or -1 if not found
+         */
+        inArray: $.inArray,
+
+        /**
+         * A direct link to jQuery methods. MooTools and Prototype adapters must be implemented for each case of method.
+         * @param {Object} elem The HTML element
+         * @param {String} method Which method to run on the wrapped element
+         */
+        adapterRun: function (elem, method) {
+                return $(elem)[method]();
+        },
+
+        /**
+         * Filter an array
+         */
+        grep: $.grep,
+
+        /**
+         * Map an array
+         * @param {Array} arr
+         * @param {Function} fn
+         */
+        map: function (arr, fn) {
+                //return jQuery.map(arr, fn);
+                var results = [],
+                        i = 0,
+                        len = arr.length;
+                for (; i < len; i++) {
+                        results[i] = fn.call(arr[i], arr[i], i, arr);
+                }
+                return results;
+
+        },
+
+        /**
+         * Get the position of an element relative to the top left of the page
+         */
+        offset: function (el) {
+                return $(el).offset();
+        },
+
+        /**
+         * Add an event listener
+         * @param {Object} el A HTML element or custom object
+         * @param {String} event The event type
+         * @param {Function} fn The event handler
+         */
+        addEvent: function (el, event, fn) {
+                $(el).bind(event, fn);
+        },
+
+        /**
+         * Remove event added with addEvent
+         * @param {Object} el The object
+         * @param {String} eventType The event type. Leave blank to remove all events.
+         * @param {Function} handler The function to remove
+         */
+        removeEvent: function (el, eventType, handler) {
+                // workaround for jQuery issue with unbinding custom events:
+                // http://forum.jQuery.com/topic/javascript-error-when-unbinding-a-custom-event-using-jQuery-1-4-2
+                var func = doc.removeEventListener ? 'removeEventListener' : 'detachEvent';
+                if (doc[func] && el && !el[func]) {
+                        el[func] = function () {};
+                }
+
+                $(el).unbind(eventType, handler);
+        },
+
+        /**
+         * Fire an event on a custom object
+         * @param {Object} el
+         * @param {String} type
+         * @param {Object} eventArguments
+         * @param {Function} defaultFunction
+         */
+        fireEvent: function (el, type, eventArguments, defaultFunction) {
+                var event = $.Event(type),
+                        detachedType = 'detached' + type,
+                        defaultPrevented;
+
+                // Remove warnings in Chrome when accessing returnValue (#2790), layerX and layerY. Although Highcharts
+                // never uses these properties, Chrome includes them in the default click event and
+                // raises the warning when they are copied over in the extend statement below.
+                //
+                // To avoid problems in IE (see #1010) where we cannot delete the properties and avoid
+                // testing if they are there (warning in chrome) the only option is to test if running IE.
+                if (!isIE && eventArguments) {
+                        delete eventArguments.layerX;
+                        delete eventArguments.layerY;
+                        delete eventArguments.returnValue;
+                }
+
+                extend(event, eventArguments);
+
+                // Prevent jQuery from triggering the object method that is named the
+                // same as the event. For example, if the event is 'select', jQuery
+                // attempts calling el.select and it goes into a loop.
+                if (el[type]) {
+                        el[detachedType] = el[type];
+                        el[type] = null;
+                }
+
+                // Wrap preventDefault and stopPropagation in try/catch blocks in
+                // order to prevent JS errors when cancelling events on non-DOM
+                // objects. #615.
+                /*jslint unparam: true*/
+                $.each(['preventDefault', 'stopPropagation'], function (i, fn) {
+                        var base = event[fn];
+                        event[fn] = function () {
+                                try {
+                                        base.call(event);
+                                } catch (e) {
+                                        if (fn === 'preventDefault') {
+                                                defaultPrevented = true;
+                                        }
+                                }
+                        };
+                });
+                /*jslint unparam: false*/
+
+                // trigger it
+                $(el).trigger(event);
+
+                // attach the method
+                if (el[detachedType]) {
+                        el[type] = el[detachedType];
+                        el[detachedType] = null;
+                }
+
+                if (defaultFunction && !event.isDefaultPrevented() && !defaultPrevented) {
+                        defaultFunction(event);
+                }
+        },
+
+        /**
+         * Extension method needed for MooTools
+         */
+        washMouseEvent: function (e) {
+                var ret = e.originalEvent || e;
+
+                // computed by jQuery, needed by IE8
+                if (ret.pageX === UNDEFINED) { // #1236
+                        ret.pageX = e.pageX;
+                        ret.pageY = e.pageY;
+                }
+
+                return ret;
+        },
+
+        /**
+         * Animate a HTML element or SVG element wrapper
+         * @param {Object} el
+         * @param {Object} params
+         * @param {Object} options jQuery-like animation options: duration, easing, callback
+         */
+        animate: function (el, params, options) {
+                var $el = $(el);
+                if (!el.style) {
+                        el.style = {}; // #1881
+                }
+                if (params.d) {
+                        el.toD = params.d; // keep the array form for paths, used in $.fx.step.d
+                        params.d = 1; // because in jQuery, animating to an array has a different meaning
+                }
+
+                $el.stop();
+                if (params.opacity !== UNDEFINED && el.attr) {
+                        params.opacity += 'px'; // force jQuery to use same logic as width and height (#2161)
+                }
+                $el.animate(params, options);
+
+        },
+        /**
+         * Stop running animation
+         */
+        stop: function (el) {
+                $(el).stop();
+        }
+});
+ +

}(win.jQuery));

+ +

// check for a custom HighchartsAdapter defined prior to this file var globalAdapter = win.HighchartsAdapter,

+ +
adapter = globalAdapter || {};
+
+ +

// Initialize the adapter if (globalAdapter) {

+ +
globalAdapter.init.call(globalAdapter, pathAnim);
+
+ +

}

+ +

// Utility functions. If the HighchartsAdapter is not defined, adapter is an empty object // and all the utility functions will be null. In that case they are populated by the // default adapters below. var adapterRun = adapter.adapterRun,

+ +
getScript = adapter.getScript,
+inArray = adapter.inArray,
+each = adapter.each,
+grep = adapter.grep,
+offset = adapter.offset,
+map = adapter.map,
+addEvent = adapter.addEvent,
+removeEvent = adapter.removeEvent,
+fireEvent = adapter.fireEvent,
+washMouseEvent = adapter.washMouseEvent,
+animate = adapter.animate,
+stop = adapter.stop;
+
+ +

/* ****************************************************************************

+ +
* Handle the options                                                         *
+*****************************************************************************/
+ +

var

+ +

defaultLabelOptions = {

+ +
enabled: true,
+// rotation: 0,
+// align: 'center',
+x: 0,
+y: 15,
+/*formatter: function () {
+        return this.value;
+},*/
+style: {
+        color: '#606060',
+        cursor: 'default',
+        fontSize: '11px'
+}
+ +

};

+ +

defaultOptions = {

+ +
colors: ['#7cb5ec', '#434348', '#90ed7d', '#f7a35c', 
+            '#8085e9', '#f15c80', '#e4d354', '#8085e8', '#8d4653', '#91e8e1'], // docs
+symbols: ['circle', 'diamond', 'square', 'triangle', 'triangle-down'],
+lang: {
+        loading: 'Loading...',
+        months: ['January', 'February', 'March', 'April', 'May', 'June', 'July',
+                        'August', 'September', 'October', 'November', 'December'],
+        shortMonths: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
+        weekdays: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
+        decimalPoint: '.',
+        numericSymbols: ['k', 'M', 'G', 'T', 'P', 'E'], // SI prefixes used in axis labels
+        resetZoom: 'Reset zoom',
+        resetZoomTitle: 'Reset zoom level 1:1',
+        thousandsSep: ','
+},
+global: {
+        useUTC: true,
+        //timezoneOffset: 0,
+        canvasToolsURL: 'http://code.highcharts.com/4.0.1/modules/canvas-tools.js',
+        VMLRadialGradientURL: 'http://code.highcharts.com/4.0.1/gfx/vml-radial-gradient.png'
+},
+chart: {
+        //animation: true,
+        //alignTicks: false,
+        //reflow: true,
+        //className: null,
+        //events: { load, selection },
+        //margin: [null],
+        //marginTop: null,
+        //marginRight: null,
+        //marginBottom: null,
+        //marginLeft: null,
+        borderColor: '#4572A7',
+        //borderWidth: 0,
+        borderRadius: 0,
+        defaultSeriesType: 'line',
+        ignoreHiddenSeries: true,
+        //inverted: false,
+        //shadow: false,
+        spacing: [10, 10, 15, 10],
+        //spacingTop: 10,
+        //spacingRight: 10,
+        //spacingBottom: 15,
+        //spacingLeft: 10,
+        //style: {
+        //      fontFamily: '"Lucida Grande", "Lucida Sans Unicode", Verdana, Arial, Helvetica, sans-serif', // default font
+        //      fontSize: '12px'
+        //},
+        backgroundColor: '#FFFFFF',
+        //plotBackgroundColor: null,
+        plotBorderColor: '#C0C0C0',
+        //plotBorderWidth: 0,
+        //plotShadow: false,
+        //zoomType: ''
+        resetZoomButton: {
+                theme: {
+                        zIndex: 20
+                },
+                position: {
+                        align: 'right',
+                        x: -10,
+                        //verticalAlign: 'top',
+                        y: 10
+                }
+                // relativeTo: 'plot'
+        }
+},
+title: {
+        text: 'Chart title',
+        align: 'center',
+        // floating: false,
+        margin: 15,
+        // x: 0,
+        // verticalAlign: 'top',
+        // y: null,
+        style: {
+                color: '#333333', // docs
+                fontSize: '18px'
+        }
+
+},
+subtitle: {
+        text: '',
+        align: 'center',
+        // floating: false
+        // x: 0,
+        // verticalAlign: 'top',
+        // y: null,
+        style: {
+                color: '#555555' // docs
+        }
+},
+
+plotOptions: {
+        line: { // base series options
+                allowPointSelect: false,
+                showCheckbox: false,
+                animation: {
+                        duration: 1000
+                },
+                //connectNulls: false,
+                //cursor: 'default',
+                //clip: true,
+                //dashStyle: null,
+                //enableMouseTracking: true,
+                events: {},
+                //legendIndex: 0,
+                //linecap: 'round',
+                lineWidth: 2,
+                //shadow: false,
+                // stacking: null,
+                marker: {
+                        //enabled: true,
+                        //symbol: null,
+                        lineWidth: 0,
+                        radius: 4,
+                        lineColor: '#FFFFFF',
+                        //fillColor: null,
+                        states: { // states for a single point
+                                hover: {
+                                        enabled: true
+                                        //radius: base + 2
+                                },
+                                select: {
+                                        fillColor: '#FFFFFF',
+                                        lineColor: '#000000',
+                                        lineWidth: 2
+                                }
+                        }
+                },
+                point: {
+                        events: {}
+                },
+                dataLabels: merge(defaultLabelOptions, {
+                        align: 'center',
+                        //defer: true,
+                        enabled: false,
+                        formatter: function () {
+                                return this.y === null ? '' : numberFormat(this.y, -1);
+                        },
+                        verticalAlign: 'bottom', // above singular point
+                        y: 0
+                        // backgroundColor: undefined,
+                        // borderColor: undefined,
+                        // borderRadius: undefined,
+                        // borderWidth: undefined,
+                        // padding: 3,
+                        // shadow: false
+                }),
+                cropThreshold: 300, // draw points outside the plot area when the number of points is less than this
+                pointRange: 0,
+                //pointStart: 0,
+                //pointInterval: 1,
+                //showInLegend: null, // auto: true for standalone series, false for linked series
+                states: { // states for the entire series
+                        hover: {
+                                //enabled: false,
+                                //lineWidth: base + 1,
+                                marker: {
+                                        // lineWidth: base + 1,
+                                        // radius: base + 1
+                                },
+                                halo: {
+                                        size: 10,
+                                        opacity: 0.25
+                                }
+                        },
+                        select: {
+                                marker: {}
+                        }
+                },
+                stickyTracking: true,
+                //tooltip: {
+                        //pointFormat: '<span style="color:{series.color}">\u25CF</span> {series.name}: <b>{point.y}</b>'
+                        //valueDecimals: null,
+                        //xDateFormat: '%A, %b %e, %Y',
+                        //valuePrefix: '',
+                        //ySuffix: ''                           
+                //}
+                turboThreshold: 1000
+                // zIndex: null
+        }
+},
+labels: {
+        //items: [],
+        style: {
+                //font: defaultFont,
+                position: ABSOLUTE,
+                color: '#3E576F'
+        }
+},
+legend: {
+        enabled: true,
+        align: 'center',
+        //floating: false,
+        layout: 'horizontal',
+        labelFormatter: function () {
+                return this.name;
+        },
+        //borderWidth: 0,
+        borderColor: '#909090',
+        borderRadius: 0, // docs
+        navigation: {
+                // animation: true,
+                activeColor: '#274b6d',
+                // arrowSize: 12
+                inactiveColor: '#CCC'
+                // style: {} // text styles
+        },
+        // margin: 20,
+        // reversed: false,
+        shadow: false,
+        // backgroundColor: null,
+        /*style: {
+                padding: '5px'
+        },*/
+        itemStyle: {                    
+                color: '#333333', // docs
+                fontSize: '12px',
+                fontWeight: 'bold' // docs
+        },
+        itemHoverStyle: {
+                //cursor: 'pointer', removed as of #601
+                color: '#000'
+        },
+        itemHiddenStyle: {
+                color: '#CCC'
+        },
+        itemCheckboxStyle: {
+                position: ABSOLUTE,
+                width: '13px', // for IE precision
+                height: '13px'
+        },
+        // itemWidth: undefined,
+        // symbolRadius: 0,
+        // symbolWidth: 16,
+        symbolPadding: 5,
+        verticalAlign: 'bottom',
+        // width: undefined,
+        x: 0,
+        y: 0,
+        title: {
+                //text: null,
+                style: {
+                        fontWeight: 'bold'
+                }
+        }                       
+},
+
+loading: {
+        // hideDuration: 100,
+        labelStyle: {
+                fontWeight: 'bold',
+                position: RELATIVE,
+                top: '1em'
+        },
+        // showDuration: 0,
+        style: {
+                position: ABSOLUTE,
+                backgroundColor: 'white',
+                opacity: 0.5,
+                textAlign: 'center'
+        }
+},
+
+tooltip: {
+        enabled: true,
+        animation: hasSVG,
+        //crosshairs: null,
+        backgroundColor: 'rgba(249, 249, 249, .85)',
+        borderWidth: 1,
+        borderRadius: 3,
+        dateTimeLabelFormats: { 
+                millisecond: '%A, %b %e, %H:%M:%S.%L',
+                second: '%A, %b %e, %H:%M:%S',
+                minute: '%A, %b %e, %H:%M',
+                hour: '%A, %b %e, %H:%M',
+                day: '%A, %b %e, %Y',
+                week: 'Week from %A, %b %e, %Y',
+                month: '%B %Y',
+                year: '%Y'
+        },
+        //formatter: defaultFormatter,
+        headerFormat: '<span style="font-size: 10px">{point.key}</span><br/>',
+        pointFormat: '<span style="color:{series.color}">\u25CF</span> {series.name}: <b>{point.y}</b><br/>', // docs
+        shadow: true,
+        //shape: 'calout',
+        //shared: false,
+        snap: isTouchDevice ? 25 : 10,
+        style: {
+                color: '#333333',
+                cursor: 'default',
+                fontSize: '12px',
+                padding: '8px',
+                whiteSpace: 'nowrap'
+        }
+        //xDateFormat: '%A, %b %e, %Y',
+        //valueDecimals: null,
+        //valuePrefix: '',
+        //valueSuffix: ''
+},
+
+credits: {
+        enabled: true,
+        text: 'Highcharts.com',
+        href: 'http://www.highcharts.com',
+        position: {
+                align: 'right',
+                x: -10,
+                verticalAlign: 'bottom',
+                y: -5
+        },
+        style: {
+                cursor: 'pointer',
+                color: '#909090',
+                fontSize: '9px'
+        }
+}
+ +

};

+ +

// Series defaults var defaultPlotOptions = defaultOptions.plotOptions,

+ +
defaultSeriesOptions = defaultPlotOptions.line;
+
+ +

// set the default time methods setTimeMethods();

+ +

/**

+ +
* Set the time methods globally based on the useUTC option. Time method can be either
+* local time or UTC (default).
+*/
+ +

function setTimeMethods() {

+ +
var useUTC = defaultOptions.global.useUTC,
+        GET = useUTC ? 'getUTC' : 'get',
+        SET = useUTC ? 'setUTC' : 'set';
+
+timezoneOffset = ((useUTC && defaultOptions.global.timezoneOffset) || 0) * 60000;
+makeTime = useUTC ? Date.UTC : function (year, month, date, hours, minutes, seconds) {
+        return new Date(
+                year,
+                month,
+                pick(date, 1),
+                pick(hours, 0),
+                pick(minutes, 0),
+                pick(seconds, 0)
+        ).getTime();
+};
+getMinutes =  GET + 'Minutes';
+getHours =    GET + 'Hours';
+getDay =      GET + 'Day';
+getDate =     GET + 'Date';
+getMonth =    GET + 'Month';
+getFullYear = GET + 'FullYear';
+setMinutes =  SET + 'Minutes';
+setHours =    SET + 'Hours';
+setDate =     SET + 'Date';
+setMonth =    SET + 'Month';
+setFullYear = SET + 'FullYear';
+ +

}

+ +

/**

+ +
* Merge the default options with custom options and return the new options structure
+* @param {Object} options The new custom options
+*/
+ +

function setOptions(options) {

+ +
// Copy in the default options
+defaultOptions = merge(true, defaultOptions, options);
+
+// Apply UTC
+setTimeMethods();
+
+return defaultOptions;
+ +

}

+ +

/**

+ +
* Get the updated default options. Until 3.0.7, merely exposing defaultOptions for outside modules
+* wasn't enough because the setOptions method created a new object.
+*/
+ +

function getOptions() {

+ +
return defaultOptions;
+
+ +

}

+ +

/**

+ +
* Handle color operations. The object methods are chainable.
+* @param {String} input The input color in either rbga or hex format
+*/
+ +

var rgbaRegEx = /rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]?(?:\.[0-9]+)?)\s*\)/,

+ +
hexRegEx = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/,
+rgbRegEx = /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/;
+
+ +

var Color = function (input) {

+ +
// declare variables
+var rgba = [], result, stops;
+
+/**
+ * Parse the input color to rgba array
+ * @param {String} input
+ */
+function init(input) {
+
+        // Gradients
+        if (input && input.stops) {
+                stops = map(input.stops, function (stop) {
+                        return Color(stop[1]);
+                });
+
+        // Solid colors
+        } else {
+                // rgba
+                result = rgbaRegEx.exec(input);
+                if (result) {
+                        rgba = [pInt(result[1]), pInt(result[2]), pInt(result[3]), parseFloat(result[4], 10)];
+                } else { 
+                        // hex
+                        result = hexRegEx.exec(input);
+                        if (result) {
+                                rgba = [pInt(result[1], 16), pInt(result[2], 16), pInt(result[3], 16), 1];
+                        } else {
+                                // rgb
+                                result = rgbRegEx.exec(input);
+                                if (result) {
+                                        rgba = [pInt(result[1]), pInt(result[2]), pInt(result[3]), 1];
+                                }
+                        }
+                }
+        }               
+
+}
+/**
+ * Return the color a specified format
+ * @param {String} format
+ */
+function get(format) {
+        var ret;
+
+        if (stops) {
+                ret = merge(input);
+                ret.stops = [].concat(ret.stops);
+                each(stops, function (stop, i) {
+                        ret.stops[i] = [ret.stops[i][0], stop.get(format)];
+                });
+
+        // it's NaN if gradient colors on a column chart
+        } else if (rgba && !isNaN(rgba[0])) {
+                if (format === 'rgb') {
+                        ret = 'rgb(' + rgba[0] + ',' + rgba[1] + ',' + rgba[2] + ')';
+                } else if (format === 'a') {
+                        ret = rgba[3];
+                } else {
+                        ret = 'rgba(' + rgba.join(',') + ')';
+                }
+        } else {
+                ret = input;
+        }
+        return ret;
+}
+
+/**
+ * Brighten the color
+ * @param {Number} alpha
+ */
+function brighten(alpha) {
+        if (stops) {
+                each(stops, function (stop) {
+                        stop.brighten(alpha);
+                });
+
+        } else if (isNumber(alpha) && alpha !== 0) {
+                var i;
+                for (i = 0; i < 3; i++) {
+                        rgba[i] += pInt(alpha * 255);
+
+                        if (rgba[i] < 0) {
+                                rgba[i] = 0;
+                        }
+                        if (rgba[i] > 255) {
+                                rgba[i] = 255;
+                        }
+                }
+        }
+        return this;
+}
+/**
+ * Set the color's opacity to a given alpha value
+ * @param {Number} alpha
+ */
+function setOpacity(alpha) {
+        rgba[3] = alpha;
+        return this;
+}
+
+// initialize: parse the input
+init(input);
+
+// public methods
+return {
+        get: get,
+        brighten: brighten,
+        rgba: rgba,
+        setOpacity: setOpacity
+};
+ +

};

+ +

/**

+ +
* A wrapper object for SVG elements
+*/
+ +

function SVGElement() {}

+ +

SVGElement.prototype = {

+ +
/**
+ * Initialize the SVG renderer
+ * @param {Object} renderer
+ * @param {String} nodeName
+ */
+init: function (renderer, nodeName) {
+        var wrapper = this;
+        wrapper.element = nodeName === 'span' ?
+                createElement(nodeName) :
+                doc.createElementNS(SVG_NS, nodeName);
+        wrapper.renderer = renderer;
+},
+/**
+ * Default base for animation
+ */
+opacity: 1,
+/**
+ * Animate a given attribute
+ * @param {Object} params
+ * @param {Number} options The same options as in jQuery animation
+ * @param {Function} complete Function to perform at the end of animation
+ */
+animate: function (params, options, complete) {
+        var animOptions = pick(options, globalAnimation, true);
+        stop(this); // stop regardless of animation actually running, or reverting to .attr (#607)
+        if (animOptions) {
+                animOptions = merge(animOptions, {}); //#2625
+                if (complete) { // allows using a callback with the global animation without overwriting it
+                        animOptions.complete = complete;
+                }
+                animate(this, params, animOptions);
+        } else {
+                this.attr(params);
+                if (complete) {
+                        complete();
+                }
+        }
+},
+
+/**
+ * Build an SVG gradient out of a common JavaScript configuration object
+ */
+colorGradient: function (color, prop, elem) {
+        var renderer = this.renderer,
+                colorObject,
+                gradName,
+                gradAttr,
+                gradients,
+                gradientObject,
+                stops,
+                stopColor,
+                stopOpacity,
+                radialReference,
+                n,
+                id,
+                key = [];
+
+        // Apply linear or radial gradients
+        if (color.linearGradient) {
+                gradName = 'linearGradient';
+        } else if (color.radialGradient) {
+                gradName = 'radialGradient';
+        }
+
+        if (gradName) {
+                gradAttr = color[gradName];
+                gradients = renderer.gradients;
+                stops = color.stops;
+                radialReference = elem.radialReference;
+
+                // Keep < 2.2 kompatibility
+                if (isArray(gradAttr)) {
+                        color[gradName] = gradAttr = {
+                                x1: gradAttr[0],
+                                y1: gradAttr[1],
+                                x2: gradAttr[2],
+                                y2: gradAttr[3],
+                                gradientUnits: 'userSpaceOnUse'
+                        };
+                }
+
+                // Correct the radial gradient for the radial reference system
+                if (gradName === 'radialGradient' && radialReference && !defined(gradAttr.gradientUnits)) {
+                        gradAttr = merge(gradAttr, {
+                                cx: (radialReference[0] - radialReference[2] / 2) + gradAttr.cx * radialReference[2],
+                                cy: (radialReference[1] - radialReference[2] / 2) + gradAttr.cy * radialReference[2],
+                                r: gradAttr.r * radialReference[2],
+                                gradientUnits: 'userSpaceOnUse'
+                        });
+                }
+
+                // Build the unique key to detect whether we need to create a new element (#1282)
+                for (n in gradAttr) {
+                        if (n !== 'id') {
+                                key.push(n, gradAttr[n]);
+                        }
+                }
+                for (n in stops) {
+                        key.push(stops[n]);
+                }
+                key = key.join(',');
+
+                // Check if a gradient object with the same config object is created within this renderer
+                if (gradients[key]) {
+                        id = gradients[key].attr('id');
+
+                } else {
+
+                        // Set the id and create the element
+                        gradAttr.id = id = PREFIX + idCounter++;
+                        gradients[key] = gradientObject = renderer.createElement(gradName)
+                                .attr(gradAttr)
+                                .add(renderer.defs);
+
+                        // The gradient needs to keep a list of stops to be able to destroy them
+                        gradientObject.stops = [];
+                        each(stops, function (stop) {
+                                var stopObject;
+                                if (stop[1].indexOf('rgba') === 0) {
+                                        colorObject = Color(stop[1]);
+                                        stopColor = colorObject.get('rgb');
+                                        stopOpacity = colorObject.get('a');
+                                } else {
+                                        stopColor = stop[1];
+                                        stopOpacity = 1;
+                                }
+                                stopObject = renderer.createElement('stop').attr({
+                                        offset: stop[0],
+                                        'stop-color': stopColor,
+                                        'stop-opacity': stopOpacity
+                                }).add(gradientObject);
+
+                                // Add the stop element to the gradient
+                                gradientObject.stops.push(stopObject);
+                        });
+                }
+
+                // Set the reference to the gradient object
+                elem.setAttribute(prop, 'url(' + renderer.url + '#' + id + ')');
+        } 
+},
+
+/**
+ * Set or get a given attribute
+ * @param {Object|String} hash
+ * @param {Mixed|Undefined} val
+ */
+attr: function (hash, val) {
+        var key,
+                value,
+                element = this.element,
+                hasSetSymbolSize,
+                ret = this,
+                skipAttr;
+
+        // single key-value pair
+        if (typeof hash === 'string' && val !== UNDEFINED) {
+                key = hash;
+                hash = {};
+                hash[key] = val;
+        }
+
+        // used as a getter: first argument is a string, second is undefined
+        if (typeof hash === 'string') {
+                ret = (this[hash + 'Getter'] || this._defaultGetter).call(this, hash, element);
+
+        // setter
+        } else {
+
+                for (key in hash) {
+                        value = hash[key];
+                        skipAttr = false;
+
+                        if (this.symbolName && /^(x|y|width|height|r|start|end|innerR|anchorX|anchorY)/.test(key)) {
+                                if (!hasSetSymbolSize) {
+                                        this.symbolAttr(hash);
+                                        hasSetSymbolSize = true;
+                                }
+                                skipAttr = true;
+                        }
+
+                        if (this.rotation && (key === 'x' || key === 'y')) {
+                                this.doTransform = true;
+                        }
+
+                        if (!skipAttr) {
+                                (this[key + 'Setter'] || this._defaultSetter).call(this, value, key, element);
+                        }
+
+                        // Let the shadow follow the main element
+                        if (this.shadows && /^(width|height|visibility|x|y|d|transform|cx|cy|r)$/.test(key)) {
+                                this.updateShadows(key, value);
+                        }
+                }
+
+                // Update transform. Do this outside the loop to prevent redundant updating for batch setting
+                // of attributes.
+                if (this.doTransform) {
+                        this.updateTransform();
+                        this.doTransform = false;
+                }
+
+        }
+
+        return ret;
+},
+
+updateShadows: function (key, value) {
+        var shadows = this.shadows,
+                i = shadows.length;
+        while (i--) {
+                shadows[i].setAttribute(
+                        key,
+                        key === 'height' ?
+                                mathMax(value - (shadows[i].cutHeight || 0), 0) :
+                                key === 'd' ? this.d : value
+                );
+        }
+},
+
+/**
+ * Add a class name to an element
+ */
+addClass: function (className) {
+        var element = this.element,
+                currentClassName = attr(element, 'class') || '';
+
+        if (currentClassName.indexOf(className) === -1) {
+                attr(element, 'class', currentClassName + ' ' + className);
+        }
+        return this;
+},
+/* hasClass and removeClass are not (yet) needed
+hasClass: function (className) {
+        return attr(this.element, 'class').indexOf(className) !== -1;
+},
+removeClass: function (className) {
+        attr(this.element, 'class', attr(this.element, 'class').replace(className, ''));
+        return this;
+},
+*/
+
+/**
+ * If one of the symbol size affecting parameters are changed,
+ * check all the others only once for each call to an element's
+ * .attr() method
+ * @param {Object} hash
+ */
+symbolAttr: function (hash) {
+        var wrapper = this;
+
+        each(['x', 'y', 'r', 'start', 'end', 'width', 'height', 'innerR', 'anchorX', 'anchorY'], function (key) {
+                wrapper[key] = pick(hash[key], wrapper[key]);
+        });
+
+        wrapper.attr({
+                d: wrapper.renderer.symbols[wrapper.symbolName](
+                        wrapper.x,
+                        wrapper.y,
+                        wrapper.width,
+                        wrapper.height,
+                        wrapper
+                )
+        });
+},
+
+/**
+ * Apply a clipping path to this object
+ * @param {String} id
+ */
+clip: function (clipRect) {
+        return this.attr('clip-path', clipRect ? 'url(' + this.renderer.url + '#' + clipRect.id + ')' : NONE);
+},
+
+/**
+ * Calculate the coordinates needed for drawing a rectangle crisply and return the
+ * calculated attributes
+ * @param {Number} strokeWidth
+ * @param {Number} x
+ * @param {Number} y
+ * @param {Number} width
+ * @param {Number} height
+ */
+crisp: function (rect) {
+
+        var wrapper = this,
+                key,
+                attribs = {},
+                normalizer,
+                strokeWidth = rect.strokeWidth || wrapper.strokeWidth || (wrapper.attr && wrapper.attr('stroke-width')) || 0;
+
+        normalizer = mathRound(strokeWidth) % 2 / 2; // mathRound because strokeWidth can sometimes have roundoff errors
+
+        // normalize for crisp edges
+        rect.x = mathFloor(rect.x || wrapper.x || 0) + normalizer;
+        rect.y = mathFloor(rect.y || wrapper.y || 0) + normalizer;
+        rect.width = mathFloor((rect.width || wrapper.width || 0) - 2 * normalizer);
+        rect.height = mathFloor((rect.height || wrapper.height || 0) - 2 * normalizer);
+        rect.strokeWidth = strokeWidth;
+
+        for (key in rect) {
+                if (wrapper[key] !== rect[key]) { // only set attribute if changed
+                        wrapper[key] = attribs[key] = rect[key];
+                }
+        }
+
+        return attribs;
+},
+
+/**
+ * Set styles for the element
+ * @param {Object} styles
+ */
+css: function (styles) {
+        var elemWrapper = this,
+                oldStyles = elemWrapper.styles,
+                newStyles = {},
+                elem = elemWrapper.element,
+                textWidth,
+                n,
+                serializedCss = '',
+                hyphenate,
+                hasNew = !oldStyles;
+
+        // convert legacy
+        if (styles && styles.color) {
+                styles.fill = styles.color;
+        }
+
+        // Filter out existing styles to increase performance (#2640)
+        if (oldStyles) {
+                for (n in styles) {
+                        if (styles[n] !== oldStyles[n]) {
+                                newStyles[n] = styles[n];
+                                hasNew = true;
+                        }
+                }
+        }
+        if (hasNew) {
+                textWidth = elemWrapper.textWidth = styles && styles.width && elem.nodeName.toLowerCase() === 'text' && pInt(styles.width);
+
+                // Merge the new styles with the old ones
+                if (oldStyles) {
+                        styles = extend(
+                                oldStyles,
+                                newStyles
+                        );
+                }               
+
+                // store object
+                elemWrapper.styles = styles;
+
+                if (textWidth && (useCanVG || (!hasSVG && elemWrapper.renderer.forExport))) {
+                        delete styles.width;
+                }
+
+                // serialize and set style attribute
+                if (isIE && !hasSVG) {
+                        css(elemWrapper.element, styles);
+                } else {
+                        /*jslint unparam: true*/
+                        hyphenate = function (a, b) { return '-' + b.toLowerCase(); };
+                        /*jslint unparam: false*/
+                        for (n in styles) {
+                                serializedCss += n.replace(/([A-Z])/g, hyphenate) + ':' + styles[n] + ';';
+                        }
+                        attr(elem, 'style', serializedCss); // #1881
+                }
+
+                // re-build text
+                if (textWidth && elemWrapper.added) {
+                        elemWrapper.renderer.buildText(elemWrapper);
+                }
+        }
+
+        return elemWrapper;
+},
+
+/**
+ * Add an event listener
+ * @param {String} eventType
+ * @param {Function} handler
+ */
+on: function (eventType, handler) {
+        var svgElement = this,
+                element = svgElement.element;
+
+        // touch
+        if (hasTouch && eventType === 'click') {
+                element.ontouchstart = function (e) {                   
+                        svgElement.touchEventFired = Date.now();                                
+                        e.preventDefault();
+                        handler.call(element, e);
+                };
+                element.onclick = function (e) {                                                                                                
+                        if (userAgent.indexOf('Android') === -1 || Date.now() - (svgElement.touchEventFired || 0) > 1100) { // #2269
+                                handler.call(element, e);
+                        }
+                };                      
+        } else {
+                // simplest possible event model for internal use
+                element['on' + eventType] = handler;
+        }
+        return this;
+},
+
+/**
+ * Set the coordinates needed to draw a consistent radial gradient across
+ * pie slices regardless of positioning inside the chart. The format is
+ * [centerX, centerY, diameter] in pixels.
+ */
+setRadialReference: function (coordinates) {
+        this.element.radialReference = coordinates;
+        return this;
+},
+
+/**
+ * Move an object and its children by x and y values
+ * @param {Number} x
+ * @param {Number} y
+ */
+translate: function (x, y) {
+        return this.attr({
+                translateX: x,
+                translateY: y
+        });
+},
+
+/**
+ * Invert a group, rotate and flip
+ */
+invert: function () {
+        var wrapper = this;
+        wrapper.inverted = true;
+        wrapper.updateTransform();
+        return wrapper;
+},
+
+/**
+ * Private method to update the transform attribute based on internal
+ * properties
+ */
+updateTransform: function () {
+        var wrapper = this,
+                translateX = wrapper.translateX || 0,
+                translateY = wrapper.translateY || 0,
+                scaleX = wrapper.scaleX,
+                scaleY = wrapper.scaleY,
+                inverted = wrapper.inverted,
+                rotation = wrapper.rotation,
+                element = wrapper.element,
+                transform;
+
+        // flipping affects translate as adjustment for flipping around the group's axis
+        if (inverted) {
+                translateX += wrapper.attr('width');
+                translateY += wrapper.attr('height');
+        }
+
+        // Apply translate. Nearly all transformed elements have translation, so instead
+        // of checking for translate = 0, do it always (#1767, #1846).
+        transform = ['translate(' + translateX + ',' + translateY + ')'];
+
+        // apply rotation
+        if (inverted) {
+                transform.push('rotate(90) scale(-1,1)');
+        } else if (rotation) { // text rotation
+                transform.push('rotate(' + rotation + ' ' + (element.getAttribute('x') || 0) + ' ' + (element.getAttribute('y') || 0) + ')');
+        }
+
+        // apply scale
+        if (defined(scaleX) || defined(scaleY)) {
+                transform.push('scale(' + pick(scaleX, 1) + ' ' + pick(scaleY, 1) + ')');
+        }
+
+        if (transform.length) {
+                element.setAttribute('transform', transform.join(' '));
+        }
+},
+/**
+ * Bring the element to the front
+ */
+toFront: function () {
+        var element = this.element;
+        element.parentNode.appendChild(element);
+        return this;
+},
+
+/**
+ * Break down alignment options like align, verticalAlign, x and y
+ * to x and y relative to the chart.
+ *
+ * @param {Object} alignOptions
+ * @param {Boolean} alignByTranslate
+ * @param {String[Object} box The box to align to, needs a width and height. When the
+ *        box is a string, it refers to an object in the Renderer. For example, when
+ *        box is 'spacingBox', it refers to Renderer.spacingBox which holds width, height
+ *        x and y properties.
+ *
+ */
+align: function (alignOptions, alignByTranslate, box) {
+        var align,
+                vAlign,
+                x,
+                y,
+                attribs = {},
+                alignTo,
+                renderer = this.renderer,
+                alignedObjects = renderer.alignedObjects;
+
+        // First call on instanciate
+        if (alignOptions) {
+                this.alignOptions = alignOptions;
+                this.alignByTranslate = alignByTranslate;
+                if (!box || isString(box)) { // boxes other than renderer handle this internally
+                        this.alignTo = alignTo = box || 'renderer';
+                        erase(alignedObjects, this); // prevent duplicates, like legendGroup after resize
+                        alignedObjects.push(this);
+                        box = null; // reassign it below
+                }
+
+        // When called on resize, no arguments are supplied
+        } else {
+                alignOptions = this.alignOptions;
+                alignByTranslate = this.alignByTranslate;
+                alignTo = this.alignTo;
+        }
+
+        box = pick(box, renderer[alignTo], renderer);
+
+        // Assign variables
+        align = alignOptions.align;
+        vAlign = alignOptions.verticalAlign;
+        x = (box.x || 0) + (alignOptions.x || 0); // default: left align
+        y = (box.y || 0) + (alignOptions.y || 0); // default: top align
+
+        // Align
+        if (align === 'right' || align === 'center') {
+                x += (box.width - (alignOptions.width || 0)) /
+                                { right: 1, center: 2 }[align];
+        }
+        attribs[alignByTranslate ? 'translateX' : 'x'] = mathRound(x);
+
+        // Vertical align
+        if (vAlign === 'bottom' || vAlign === 'middle') {
+                y += (box.height - (alignOptions.height || 0)) /
+                                ({ bottom: 1, middle: 2 }[vAlign] || 1);
+
+        }
+        attribs[alignByTranslate ? 'translateY' : 'y'] = mathRound(y);
+
+        // Animate only if already placed
+        this[this.placed ? 'animate' : 'attr'](attribs);
+        this.placed = true;
+        this.alignAttr = attribs;
+
+        return this;
+},
+
+/**
+ * Get the bounding box (width, height, x and y) for the element
+ */
+getBBox: function () {
+        var wrapper = this,
+                bBox = wrapper.bBox,
+                renderer = wrapper.renderer,
+                width,
+                height,
+                rotation = wrapper.rotation,
+                element = wrapper.element,
+                styles = wrapper.styles,
+                rad = rotation * deg2rad,
+                textStr = wrapper.textStr,
+                cacheKey;
+
+        // Since numbers are monospaced, and numerical labels appear a lot in a chart,
+        // we assume that a label of n characters has the same bounding box as others 
+        // of the same length.
+        if (textStr === '' || numRegex.test(textStr)) {
+                cacheKey = 'num.' + textStr.toString().length + (styles ? ('|' + styles.fontSize + '|' + styles.fontFamily) : '');
+
+        } //else { // This code block made demo/waterfall fail, related to buildText
+                // Caching all strings reduces rendering time by 4-5%. 
+                // TODO: Check how this affects places where bBox is found on the element
+                //cacheKey = textStr + (styles ? ('|' + styles.fontSize + '|' + styles.fontFamily) : '');
+        //}
+        if (cacheKey) {
+                bBox = renderer.cache[cacheKey];
+        }
+
+        // No cache found
+        if (!bBox) {
+
+                // SVG elements
+                if (element.namespaceURI === SVG_NS || renderer.forExport) {
+                        try { // Fails in Firefox if the container has display: none.
+
+                                bBox = element.getBBox ?
+                                        // SVG: use extend because IE9 is not allowed to change width and height in case
+                                        // of rotation (below)
+                                        extend({}, element.getBBox()) :
+                                        // Canvas renderer and legacy IE in export mode
+                                        {
+                                                width: element.offsetWidth,
+                                                height: element.offsetHeight
+                                        };
+                        } catch (e) {}
+
+                        // If the bBox is not set, the try-catch block above failed. The other condition
+                        // is for Opera that returns a width of -Infinity on hidden elements.
+                        if (!bBox || bBox.width < 0) {
+                                bBox = { width: 0, height: 0 };
+                        }
+
+                // VML Renderer or useHTML within SVG
+                } else {
+
+                        bBox = wrapper.htmlGetBBox();
+
+                }
+
+                // True SVG elements as well as HTML elements in modern browsers using the .useHTML option
+                // need to compensated for rotation
+                if (renderer.isSVG) {
+                        width = bBox.width;
+                        height = bBox.height;
+
+                        // Workaround for wrong bounding box in IE9 and IE10 (#1101, #1505, #1669, #2568)
+                        if (isIE && styles && styles.fontSize === '11px' && height.toPrecision(3) === '16.9') {
+                                bBox.height = height = 14;
+                        }
+
+                        // Adjust for rotated text
+                        if (rotation) {
+                                bBox.width = mathAbs(height * mathSin(rad)) + mathAbs(width * mathCos(rad));
+                                bBox.height = mathAbs(height * mathCos(rad)) + mathAbs(width * mathSin(rad));
+                        }
+                }
+
+                // Cache it
+                wrapper.bBox = bBox;
+                if (cacheKey) {
+                        renderer.cache[cacheKey] = bBox;
+                }
+        }
+        return bBox;
+},
+
+/**
+ * Show the element
+ */
+show: function (inherit) {
+        // IE9-11 doesn't handle visibilty:inherit well, so we remove the attribute instead (#2881)
+        if (inherit && this.element.namespaceURI === SVG_NS) {
+                this.element.removeAttribute('visibility');
+                return this;
+        } else {
+                return this.attr({ visibility: inherit ? 'inherit' : VISIBLE });
+        }
+},
+
+/**
+ * Hide the element
+ */
+hide: function () {
+        return this.attr({ visibility: HIDDEN });
+},
+
+fadeOut: function (duration) {
+        var elemWrapper = this;
+        elemWrapper.animate({
+                opacity: 0
+        }, {
+                duration: duration || 150,
+                complete: function () {
+                        elemWrapper.hide();
+                }
+        });
+},
+
+/**
+ * Add the element
+ * @param {Object|Undefined} parent Can be an element, an element wrapper or undefined
+ *    to append the element to the renderer.box.
+ */
+add: function (parent) {
+
+        var renderer = this.renderer,
+                parentWrapper = parent || renderer,
+                parentNode = parentWrapper.element || renderer.box,
+                childNodes,
+                element = this.element,
+                zIndex = this.zIndex,
+                otherElement,
+                otherZIndex,
+                i,
+                inserted;
+
+        if (parent) {
+                this.parentGroup = parent;
+        }
+
+        // mark as inverted
+        this.parentInverted = parent && parent.inverted;
+
+        // build formatted text
+        if (this.textStr !== undefined) {
+                renderer.buildText(this);
+        }
+
+        // mark the container as having z indexed children
+        if (zIndex) {
+                parentWrapper.handleZ = true;
+                zIndex = pInt(zIndex);
+        }
+
+        // insert according to this and other elements' zIndex
+        if (parentWrapper.handleZ) { // this element or any of its siblings has a z index
+                childNodes = parentNode.childNodes;
+                for (i = 0; i < childNodes.length; i++) {
+                        otherElement = childNodes[i];
+                        otherZIndex = attr(otherElement, 'zIndex');
+                        if (otherElement !== element && (
+                                        // insert before the first element with a higher zIndex
+                                        pInt(otherZIndex) > zIndex ||
+                                        // if no zIndex given, insert before the first element with a zIndex
+                                        (!defined(zIndex) && defined(otherZIndex))
+
+                                        )) {
+                                parentNode.insertBefore(element, otherElement);
+                                inserted = true;
+                                break;
+                        }
+                }
+        }
+
+        // default: append at the end
+        if (!inserted) {
+                parentNode.appendChild(element);
+        }
+
+        // mark as added
+        this.added = true;
+
+        // fire an event for internal hooks
+        if (this.onAdd) {
+                this.onAdd();
+        }
+
+        return this;
+},
+
+/**
+ * Removes a child either by removeChild or move to garbageBin.
+ * Issue 490; in VML removeChild results in Orphaned nodes according to sIEve, discardElement does not.
+ */
+safeRemoveChild: function (element) {
+        var parentNode = element.parentNode;
+        if (parentNode) {
+                parentNode.removeChild(element);
+        }
+},
+
+/**
+ * Destroy the element and element wrapper
+ */
+destroy: function () {
+        var wrapper = this,
+                element = wrapper.element || {},
+                shadows = wrapper.shadows,
+                parentToClean = wrapper.renderer.isSVG && element.nodeName === 'SPAN' && wrapper.parentGroup,
+                grandParent,
+                key,
+                i;
+
+        // remove events
+        element.onclick = element.onmouseout = element.onmouseover = element.onmousemove = element.point = null;
+        stop(wrapper); // stop running animations
+
+        if (wrapper.clipPath) {
+                wrapper.clipPath = wrapper.clipPath.destroy();
+        }
+
+        // Destroy stops in case this is a gradient object
+        if (wrapper.stops) {
+                for (i = 0; i < wrapper.stops.length; i++) {
+                        wrapper.stops[i] = wrapper.stops[i].destroy();
+                }
+                wrapper.stops = null;
+        }
+
+        // remove element
+        wrapper.safeRemoveChild(element);
+
+        // destroy shadows
+        if (shadows) {
+                each(shadows, function (shadow) {
+                        wrapper.safeRemoveChild(shadow);
+                });
+        }
+
+        // In case of useHTML, clean up empty containers emulating SVG groups (#1960, #2393).
+        while (parentToClean && parentToClean.div.childNodes.length === 0) {
+                grandParent = parentToClean.parentGroup;
+                wrapper.safeRemoveChild(parentToClean.div);
+                delete parentToClean.div;
+                parentToClean = grandParent;
+        }
+
+        // remove from alignObjects
+        if (wrapper.alignTo) {
+                erase(wrapper.renderer.alignedObjects, wrapper);
+        }
+
+        for (key in wrapper) {
+                delete wrapper[key];
+        }
+
+        return null;
+},
+
+/**
+ * Add a shadow to the element. Must be done after the element is added to the DOM
+ * @param {Boolean|Object} shadowOptions
+ */
+shadow: function (shadowOptions, group, cutOff) {
+        var shadows = [],
+                i,
+                shadow,
+                element = this.element,
+                strokeWidth,
+                shadowWidth,
+                shadowElementOpacity,
+
+                // compensate for inverted plot area
+                transform;
+
+        if (shadowOptions) {
+                shadowWidth = pick(shadowOptions.width, 3);
+                shadowElementOpacity = (shadowOptions.opacity || 0.15) / shadowWidth;
+                transform = this.parentInverted ?
+                        '(-1,-1)' :
+                        '(' + pick(shadowOptions.offsetX, 1) + ', ' + pick(shadowOptions.offsetY, 1) + ')';
+                for (i = 1; i <= shadowWidth; i++) {
+                        shadow = element.cloneNode(0);
+                        strokeWidth = (shadowWidth * 2) + 1 - (2 * i);
+                        attr(shadow, {
+                                'isShadow': 'true',
+                                'stroke': shadowOptions.color || 'black',
+                                'stroke-opacity': shadowElementOpacity * i,
+                                'stroke-width': strokeWidth,
+                                'transform': 'translate' + transform,
+                                'fill': NONE
+                        });
+                        if (cutOff) {
+                                attr(shadow, 'height', mathMax(attr(shadow, 'height') - strokeWidth, 0));
+                                shadow.cutHeight = strokeWidth;
+                        }
+
+                        if (group) {
+                                group.element.appendChild(shadow);
+                        } else {
+                                element.parentNode.insertBefore(shadow, element);
+                        }
+
+                        shadows.push(shadow);
+                }
+
+                this.shadows = shadows;
+        }
+        return this;
+
+},
+
+xGetter: function (key) {
+        if (this.element.nodeName === 'circle') {
+                key = { x: 'cx', y: 'cy' }[key] || key;
+        }
+        return this._defaultGetter(key);
+},
+
+/** 
+ * Get the current value of an attribute or pseudo attribute, used mainly
+ * for animation.
+ */
+_defaultGetter: function (key) {
+        var ret = pick(this[key], this.element ? this.element.getAttribute(key) : null, 0);
+
+        if (/^[0-9\.]+$/.test(ret)) { // is numerical
+                ret = parseFloat(ret);
+        }
+        return ret;
+},
+
+dSetter: function (value, key, element) {
+        if (value && value.join) { // join path
+                value = value.join(' ');
+        }
+        if (/(NaN| {2}|^$)/.test(value)) {
+                value = 'M 0 0';
+        }
+        element.setAttribute(key, value);
+
+        this[key] = value;
+},
+dashstyleSetter: function (value) {
+        var i;
+        value = value && value.toLowerCase();
+        if (value) {
+                value = value
+                        .replace('shortdashdotdot', '3,1,1,1,1,1,')
+                        .replace('shortdashdot', '3,1,1,1')
+                        .replace('shortdot', '1,1,')
+                        .replace('shortdash', '3,1,')
+                        .replace('longdash', '8,3,')
+                        .replace(/dot/g, '1,3,')
+                        .replace('dash', '4,3,')
+                        .replace(/,$/, '')
+                        .split(','); // ending comma
+
+                i = value.length;
+                while (i--) {
+                        value[i] = pInt(value[i]) * this.element.getAttribute('stroke-width');
+                }
+                value = value.join(',');
+                this.element.setAttribute('stroke-dasharray', value);
+        }
+},
+alignSetter: function (value) {
+        this.element.setAttribute('text-anchor', { left: 'start', center: 'middle', right: 'end' }[value]);
+},
+opacitySetter: function (value, key, element) {
+        this[key] = value;
+        element.setAttribute(key, value);
+},
+// In Chrome/Win < 6 as well as Batik and PhantomJS as of 1.9.7, the stroke attribute can't be set when the stroke-
+// width is 0. #1369
+'stroke-widthSetter': function (value, key, element) {
+        if (value === 0) {
+                value = 0.00001;
+        }
+        this.strokeWidth = value; // read in symbol paths like 'callout'
+        element.setAttribute(key, value);
+},
+titleSetter: function (value) {
+        var titleNode = this.element.getElementsByTagName('title')[0];
+        if (!titleNode) {
+                titleNode = doc.createElementNS(SVG_NS, 'title');
+                this.element.appendChild(titleNode);
+        }
+        titleNode.textContent = value;
+},
+textSetter: function (value) {
+        if (value !== this.textStr) {
+                // Delete bBox memo when the text changes
+                delete this.bBox;
+
+                this.textStr = value;
+                if (this.added) {
+                        this.renderer.buildText(this);
+                }
+        }
+},
+fillSetter: function (value, key, element) {
+
+        if (typeof value === 'string') {
+                element.setAttribute(key, value);
+        } else if (value) {
+                this.colorGradient(value, key, element);
+        }
+},
+zIndexSetter: function (value, key, element) {
+        element.setAttribute(key, value);
+        this[key] = value;
+},
+_defaultSetter: function (value, key, element) {
+        element.setAttribute(key, value);
+}
+ +

};

+ +

// Some shared setters and getters SVGElement.prototype.yGetter = SVGElement.prototype.xGetter; SVGElement.prototype.translateXSetter = SVGElement.prototype.translateYSetter =

+ +
        SVGElement.prototype.rotationSetter = SVGElement.prototype.verticalAlignSetter = 
+        SVGElement.prototype.scaleXSetter = SVGElement.prototype.scaleYSetter = function (value, key) {
+this[key] = value;
+this.doTransform = true;
+ +

}; SVGElement.prototype.strokeSetter = SVGElement.prototype.fillSetter;

+ +

// In Chrome/Win < 6 as well as Batik, the stroke attribute can’t be set when the stroke- // width is 0. #1369 /*SVGElement.prototype[‘stroke-widthSetter’] = SVGElement.prototype.strokeSetter = function (value, key) {

+ +
this[key] = value;
+// Only apply the stroke attribute if the stroke width is defined and larger than 0
+if (this.stroke && this['stroke-width']) {
+        this.element.setAttribute('stroke', this.stroke);
+        this.element.setAttribute('stroke-width', this['stroke-width']);
+        this.hasStroke = true;
+} else if (key === 'stroke-width' && value === 0 && this.hasStroke) {
+        this.element.removeAttribute('stroke');
+        this.hasStroke = false;
+}
+ +

};*/

+ +

/**

+ +
* The default SVG renderer
+*/
+ +

var SVGRenderer = function () {

+ +
this.init.apply(this, arguments);
+
+ +

}; SVGRenderer.prototype = {

+ +
Element: SVGElement,
+
+/**
+ * Initialize the SVGRenderer
+ * @param {Object} container
+ * @param {Number} width
+ * @param {Number} height
+ * @param {Boolean} forExport
+ */
+init: function (container, width, height, style, forExport) {
+        var renderer = this,
+                loc = location,
+                boxWrapper,
+                element,
+                desc;
+
+        boxWrapper = renderer.createElement('svg')
+                .attr({
+                        version: '1.1'
+                })
+                .css(this.getStyle(style));
+        element = boxWrapper.element;
+        container.appendChild(element);
+
+        // For browsers other than IE, add the namespace attribute (#1978)
+        if (container.innerHTML.indexOf('xmlns') === -1) {
+                attr(element, 'xmlns', SVG_NS);
+        }
+
+        // object properties
+        renderer.isSVG = true;
+        renderer.box = element;
+        renderer.boxWrapper = boxWrapper;
+        renderer.alignedObjects = [];
+
+        // Page url used for internal references. #24, #672, #1070
+        renderer.url = (isFirefox || isWebKit) && doc.getElementsByTagName('base').length ?
+                loc.href
+                        .replace(/#.*?$/, '') // remove the hash
+                        .replace(/([\('\)])/g, '\\$1') // escape parantheses and quotes
+                        .replace(/ /g, '%20') : // replace spaces (needed for Safari only)
+                '';
+
+        // Add description
+        desc = this.createElement('desc').add();
+        desc.element.appendChild(doc.createTextNode('Created with ' + PRODUCT + ' ' + VERSION));
+
+        renderer.defs = this.createElement('defs').add();
+        renderer.forExport = forExport;
+        renderer.gradients = {}; // Object where gradient SvgElements are stored
+        renderer.cache = {}; // Cache for numerical bounding boxes
+
+        renderer.setSize(width, height, false);
+
+        // Issue 110 workaround:
+        // In Firefox, if a div is positioned by percentage, its pixel position may land
+        // between pixels. The container itself doesn't display this, but an SVG element
+        // inside this container will be drawn at subpixel precision. In order to draw
+        // sharp lines, this must be compensated for. This doesn't seem to work inside
+        // iframes though (like in jsFiddle).
+        var subPixelFix, rect;
+        if (isFirefox && container.getBoundingClientRect) {
+                renderer.subPixelFix = subPixelFix = function () {
+                        css(container, { left: 0, top: 0 });
+                        rect = container.getBoundingClientRect();
+                        css(container, {
+                                left: (mathCeil(rect.left) - rect.left) + PX,
+                                top: (mathCeil(rect.top) - rect.top) + PX
+                        });
+                };
+
+                // run the fix now
+                subPixelFix();
+
+                // run it on resize
+                addEvent(win, 'resize', subPixelFix);
+        }
+},
+
+getStyle: function (style) {
+        return (this.style = extend({
+                fontFamily: '"Lucida Grande", "Lucida Sans Unicode", Arial, Helvetica, sans-serif', // default font
+                fontSize: '12px'
+        }, style));
+},
+
+/**
+ * Detect whether the renderer is hidden. This happens when one of the parent elements
+ * has display: none. #608.
+ */
+isHidden: function () {
+        return !this.boxWrapper.getBBox().width;
+},
+
+/**
+ * Destroys the renderer and its allocated members.
+ */
+destroy: function () {
+        var renderer = this,
+                rendererDefs = renderer.defs;
+        renderer.box = null;
+        renderer.boxWrapper = renderer.boxWrapper.destroy();
+
+        // Call destroy on all gradient elements
+        destroyObjectProperties(renderer.gradients || {});
+        renderer.gradients = null;
+
+        // Defs are null in VMLRenderer
+        // Otherwise, destroy them here.
+        if (rendererDefs) {
+                renderer.defs = rendererDefs.destroy();
+        }
+
+        // Remove sub pixel fix handler
+        // We need to check that there is a handler, otherwise all functions that are registered for event 'resize' are removed
+        // See issue #982
+        if (renderer.subPixelFix) {
+                removeEvent(win, 'resize', renderer.subPixelFix);
+        }
+
+        renderer.alignedObjects = null;
+
+        return null;
+},
+
+/**
+ * Create a wrapper for an SVG element
+ * @param {Object} nodeName
+ */
+createElement: function (nodeName) {
+        var wrapper = new this.Element();
+        wrapper.init(this, nodeName);
+        return wrapper;
+},
+
+/**
+ * Dummy function for use in canvas renderer
+ */
+draw: function () {},
+
+/**
+ * Parse a simple HTML string into SVG tspans
+ *
+ * @param {Object} textNode The parent text SVG node
+ */
+buildText: function (wrapper) {
+        var textNode = wrapper.element,
+                renderer = this,
+                forExport = renderer.forExport,
+                textStr = pick(wrapper.textStr, '').toString(),
+                hasMarkup = textStr.indexOf('<') !== -1,
+                lines,
+                childNodes = textNode.childNodes,
+                styleRegex,
+                hrefRegex,
+                parentX = attr(textNode, 'x'),
+                textStyles = wrapper.styles,
+                width = wrapper.textWidth,
+                textLineHeight = textStyles && textStyles.lineHeight,
+                i = childNodes.length,
+                getLineHeight = function (tspan) {
+                        return textLineHeight ? 
+                                pInt(textLineHeight) :
+                                renderer.fontMetrics(
+                                        /(px|em)$/.test(tspan && tspan.style.fontSize) ?
+                                                tspan.style.fontSize :
+                                                ((textStyles && textStyles.fontSize) || renderer.style.fontSize || 12)
+                                ).h;
+                };
+
+        /// remove old text
+        while (i--) {
+                textNode.removeChild(childNodes[i]);
+        }
+
+        // Skip tspans, add text directly to text node
+        if (!hasMarkup && textStr.indexOf(' ') === -1) {
+                textNode.appendChild(doc.createTextNode(textStr));
+                return;
+
+        // Complex strings, add more logic
+        } else {
+
+                styleRegex = /<.*style="([^"]+)".*>/;
+                hrefRegex = /<.*href="(http[^"]+)".*>/;
+
+                if (width && !wrapper.added) {
+                        this.box.appendChild(textNode); // attach it to the DOM to read offset width
+                }
+
+                if (hasMarkup) {
+                        lines = textStr
+                                .replace(/<(b|strong)>/g, '<span style="font-weight:bold">')
+                                .replace(/<(i|em)>/g, '<span style="font-style:italic">')
+                                .replace(/<a/g, '<span')
+                                .replace(/<\/(b|strong|i|em|a)>/g, '</span>')
+                                .split(/<br.*?>/g);
+
+                } else {
+                        lines = [textStr];
+                }
+
+                // remove empty line at end
+                if (lines[lines.length - 1] === '') {
+                        lines.pop();
+                }
+
+                // build the lines
+                each(lines, function (line, lineNo) {
+                        var spans, spanNo = 0;
+
+                        line = line.replace(/<span/g, '|||<span').replace(/<\/span>/g, '</span>|||');
+                        spans = line.split('|||');
+
+                        each(spans, function (span) {
+                                if (span !== '' || spans.length === 1) {
+                                        var attributes = {},
+                                                tspan = doc.createElementNS(SVG_NS, 'tspan'),
+                                                spanStyle; // #390
+                                        if (styleRegex.test(span)) {
+                                                spanStyle = span.match(styleRegex)[1].replace(/(;| |^)color([ :])/, '$1fill$2');
+                                                attr(tspan, 'style', spanStyle);
+                                        }
+                                        if (hrefRegex.test(span) && !forExport) { // Not for export - #1529
+                                                attr(tspan, 'onclick', 'location.href=\"' + span.match(hrefRegex)[1] + '\"');
+                                                css(tspan, { cursor: 'pointer' });
+                                        }
+
+                                        span = (span.replace(/<(.|\n)*?>/g, '') || ' ')
+                                                .replace(/&lt;/g, '<')
+                                                .replace(/&gt;/g, '>');
+
+                                        // Nested tags aren't supported, and cause crash in Safari (#1596)
+                                        if (span !== ' ') {
+
+                                                // add the text node
+                                                tspan.appendChild(doc.createTextNode(span));
+
+                                                if (!spanNo) { // first span in a line, align it to the left
+                                                        if (lineNo && parentX !== null) {
+                                                                attributes.x = parentX;
+                                                        }
+                                                } else {
+                                                        attributes.dx = 0; // #16
+                                                }
+
+                                                // add attributes
+                                                attr(tspan, attributes);
+
+                                                // first span on subsequent line, add the line height
+                                                if (!spanNo && lineNo) {
+
+                                                        // allow getting the right offset height in exporting in IE
+                                                        if (!hasSVG && forExport) {
+                                                                css(tspan, { display: 'block' });
+                                                        }
+
+                                                        // Set the line height based on the font size of either
+                                                        // the text element or the tspan element
+                                                        attr(
+                                                                tspan,
+                                                                'dy',
+                                                                getLineHeight(tspan),
+                                                                // Safari 6.0.2 - too optimized for its own good (#1539)
+                                                                // TODO: revisit this with future versions of Safari
+                                                                isWebKit && tspan.offsetHeight
+                                                        );
+                                                }
+
+                                                // Append it
+                                                textNode.appendChild(tspan);
+
+                                                spanNo++;
+
+                                                // check width and apply soft breaks
+                                                if (width) {
+                                                        var words = span.replace(/([^\^])-/g, '$1- ').split(' '), // #1273
+                                                                hasWhiteSpace = words.length > 1 && textStyles.whiteSpace !== 'nowrap',
+                                                                tooLong,
+                                                                actualWidth,
+                                                                clipHeight = wrapper._clipHeight,
+                                                                rest = [],
+                                                                dy = getLineHeight(),
+                                                                softLineNo = 1,
+                                                                bBox;
+
+                                                        while (hasWhiteSpace && (words.length || rest.length)) {
+                                                                delete wrapper.bBox; // delete cache
+                                                                bBox = wrapper.getBBox();
+                                                                actualWidth = bBox.width;
+
+                                                                // Old IE cannot measure the actualWidth for SVG elements (#2314)
+                                                                if (!hasSVG && renderer.forExport) {
+                                                                        actualWidth = renderer.measureSpanWidth(tspan.firstChild.data, wrapper.styles);
+                                                                }
+
+                                                                tooLong = actualWidth > width;
+                                                                if (!tooLong || words.length === 1) { // new line needed
+                                                                        words = rest;
+                                                                        rest = [];
+                                                                        if (words.length) {
+                                                                                softLineNo++;
+
+                                                                                if (clipHeight && softLineNo * dy > clipHeight) {
+                                                                                        words = ['...'];
+                                                                                        wrapper.attr('title', wrapper.textStr);
+                                                                                } else {
+
+                                                                                        tspan = doc.createElementNS(SVG_NS, 'tspan');
+                                                                                        attr(tspan, {
+                                                                                                dy: dy,
+                                                                                                x: parentX
+                                                                                        });
+                                                                                        if (spanStyle) { // #390
+                                                                                                attr(tspan, 'style', spanStyle);
+                                                                                        }
+                                                                                        textNode.appendChild(tspan);
+
+                                                                                        if (actualWidth > width) { // a single word is pressing it out
+                                                                                                width = actualWidth;
+                                                                                        }
+                                                                                }
+                                                                        }
+                                                                } else { // append to existing line tspan
+                                                                        tspan.removeChild(tspan.firstChild);
+                                                                        rest.unshift(words.pop());
+                                                                }
+                                                                if (words.length) {
+                                                                        tspan.appendChild(doc.createTextNode(words.join(' ').replace(/- /g, '-')));
+                                                                }
+                                                        }
+                                                }
+                                        }
+                                }
+                        });
+                });
+        }
+},
+
+/**
+ * Create a button with preset states
+ * @param {String} text
+ * @param {Number} x
+ * @param {Number} y
+ * @param {Function} callback
+ * @param {Object} normalState
+ * @param {Object} hoverState
+ * @param {Object} pressedState
+ */
+button: function (text, x, y, callback, normalState, hoverState, pressedState, disabledState, shape) {
+        var label = this.label(text, x, y, shape, null, null, null, null, 'button'),
+                curState = 0,
+                stateOptions,
+                stateStyle,
+                normalStyle,
+                hoverStyle,
+                pressedStyle,
+                disabledStyle,
+                verticalGradient = { x1: 0, y1: 0, x2: 0, y2: 1 };
+
+        // Normal state - prepare the attributes
+        normalState = merge({
+                'stroke-width': 1,
+                stroke: '#CCCCCC',
+                fill: {
+                        linearGradient: verticalGradient,
+                        stops: [
+                                [0, '#FEFEFE'],
+                                [1, '#F6F6F6']
+                        ]
+                },
+                r: 2,
+                padding: 5,
+                style: {
+                        color: 'black'
+                }
+        }, normalState);
+        normalStyle = normalState.style;
+        delete normalState.style;
+
+        // Hover state
+        hoverState = merge(normalState, {
+                stroke: '#68A',
+                fill: {
+                        linearGradient: verticalGradient,
+                        stops: [
+                                [0, '#FFF'],
+                                [1, '#ACF']
+                        ]
+                }
+        }, hoverState);
+        hoverStyle = hoverState.style;
+        delete hoverState.style;
+
+        // Pressed state
+        pressedState = merge(normalState, {
+                stroke: '#68A',
+                fill: {
+                        linearGradient: verticalGradient,
+                        stops: [
+                                [0, '#9BD'],
+                                [1, '#CDF']
+                        ]
+                }
+        }, pressedState);
+        pressedStyle = pressedState.style;
+        delete pressedState.style;
+
+        // Disabled state
+        disabledState = merge(normalState, {
+                style: {
+                        color: '#CCC'
+                }
+        }, disabledState);
+        disabledStyle = disabledState.style;
+        delete disabledState.style;
+
+        // Add the events. IE9 and IE10 need mouseover and mouseout to funciton (#667).
+        addEvent(label.element, isIE ? 'mouseover' : 'mouseenter', function () {
+                if (curState !== 3) {
+                        label.attr(hoverState)
+                                .css(hoverStyle);
+                }
+        });
+        addEvent(label.element, isIE ? 'mouseout' : 'mouseleave', function () {
+                if (curState !== 3) {
+                        stateOptions = [normalState, hoverState, pressedState][curState];
+                        stateStyle = [normalStyle, hoverStyle, pressedStyle][curState];
+                        label.attr(stateOptions)
+                                .css(stateStyle);
+                }
+        });
+
+        label.setState = function (state) {
+                label.state = curState = state;
+                if (!state) {
+                        label.attr(normalState)
+                                .css(normalStyle);
+                } else if (state === 2) {
+                        label.attr(pressedState)
+                                .css(pressedStyle);
+                } else if (state === 3) {
+                        label.attr(disabledState)
+                                .css(disabledStyle);
+                }
+        };
+
+        return label
+                .on('click', function () {
+                        if (curState !== 3) {
+                                callback.call(label);
+                        }
+                })
+                .attr(normalState)
+                .css(extend({ cursor: 'default' }, normalStyle));
+},
+
+/**
+ * Make a straight line crisper by not spilling out to neighbour pixels
+ * @param {Array} points
+ * @param {Number} width
+ */
+crispLine: function (points, width) {
+        // points format: [M, 0, 0, L, 100, 0]
+        // normalize to a crisp line
+        if (points[1] === points[4]) {
+                // Substract due to #1129. Now bottom and left axis gridlines behave the same.
+                points[1] = points[4] = mathRound(points[1]) - (width % 2 / 2);
+        }
+        if (points[2] === points[5]) {
+                points[2] = points[5] = mathRound(points[2]) + (width % 2 / 2);
+        }
+        return points;
+},
+
+/**
+ * Draw a path
+ * @param {Array} path An SVG path in array form
+ */
+path: function (path) {
+        var attr = {
+                fill: NONE
+        };
+        if (isArray(path)) {
+                attr.d = path;
+        } else if (isObject(path)) { // attributes
+                extend(attr, path);
+        }
+        return this.createElement('path').attr(attr);
+},
+
+/**
+ * Draw and return an SVG circle
+ * @param {Number} x The x position
+ * @param {Number} y The y position
+ * @param {Number} r The radius
+ */
+circle: function (x, y, r) {
+        var attr = isObject(x) ?
+                x :
+                {
+                        x: x,
+                        y: y,
+                        r: r
+                },
+                wrapper = this.createElement('circle');
+
+        wrapper.xSetter = function (value) {
+                this.element.setAttribute('cx', value);
+        };
+        wrapper.ySetter = function (value) {
+                this.element.setAttribute('cy', value);
+        };
+        return wrapper.attr(attr);
+},
+
+/**
+ * Draw and return an arc
+ * @param {Number} x X position
+ * @param {Number} y Y position
+ * @param {Number} r Radius
+ * @param {Number} innerR Inner radius like used in donut charts
+ * @param {Number} start Starting angle
+ * @param {Number} end Ending angle
+ */
+arc: function (x, y, r, innerR, start, end) {
+        var arc;
+
+        if (isObject(x)) {
+                y = x.y;
+                r = x.r;
+                innerR = x.innerR;
+                start = x.start;
+                end = x.end;
+                x = x.x;
+        }
+
+        // Arcs are defined as symbols for the ability to set
+        // attributes in attr and animate
+        arc = this.symbol('arc', x || 0, y || 0, r || 0, r || 0, {
+                innerR: innerR || 0,
+                start: start || 0,
+                end: end || 0
+        });
+        arc.r = r; // #959
+        return arc;
+},
+
+/**
+ * Draw and return a rectangle
+ * @param {Number} x Left position
+ * @param {Number} y Top position
+ * @param {Number} width
+ * @param {Number} height
+ * @param {Number} r Border corner radius
+ * @param {Number} strokeWidth A stroke width can be supplied to allow crisp drawing
+ */
+rect: function (x, y, width, height, r, strokeWidth) {
+
+        r = isObject(x) ? x.r : r;
+
+        var wrapper = this.createElement('rect'),
+                attribs = isObject(x) ? x : x === UNDEFINED ? {} : {
+                        x: x,
+                        y: y,
+                        width: mathMax(width, 0),
+                        height: mathMax(height, 0)
+                };
+
+        if (strokeWidth !== UNDEFINED) {
+                attribs.strokeWidth = strokeWidth;
+                attribs = wrapper.crisp(attribs);
+        }
+
+        if (r) {
+                attribs.r = r;
+        }
+
+        wrapper.rSetter = function (value) {
+                attr(this.element, {
+                        rx: value,
+                        ry: value
+                });
+        };
+
+        return wrapper.attr(attribs);
+},
+
+/**
+ * Resize the box and re-align all aligned elements
+ * @param {Object} width
+ * @param {Object} height
+ * @param {Boolean} animate
+ *
+ */
+setSize: function (width, height, animate) {
+        var renderer = this,
+                alignedObjects = renderer.alignedObjects,
+                i = alignedObjects.length;
+
+        renderer.width = width;
+        renderer.height = height;
+
+        renderer.boxWrapper[pick(animate, true) ? 'animate' : 'attr']({
+                width: width,
+                height: height
+        });
+
+        while (i--) {
+                alignedObjects[i].align();
+        }
+},
+
+/**
+ * Create a group
+ * @param {String} name The group will be given a class name of 'highcharts-{name}'.
+ *     This can be used for styling and scripting.
+ */
+g: function (name) {
+        var elem = this.createElement('g');
+        return defined(name) ? elem.attr({ 'class': PREFIX + name }) : elem;
+},
+
+/**
+ * Display an image
+ * @param {String} src
+ * @param {Number} x
+ * @param {Number} y
+ * @param {Number} width
+ * @param {Number} height
+ */
+image: function (src, x, y, width, height) {
+        var attribs = {
+                        preserveAspectRatio: NONE
+                },
+                elemWrapper;
+
+        // optional properties
+        if (arguments.length > 1) {
+                extend(attribs, {
+                        x: x,
+                        y: y,
+                        width: width,
+                        height: height
+                });
+        }
+
+        elemWrapper = this.createElement('image').attr(attribs);
+
+        // set the href in the xlink namespace
+        if (elemWrapper.element.setAttributeNS) {
+                elemWrapper.element.setAttributeNS('http://www.w3.org/1999/xlink',
+                        'href', src);
+        } else {
+                // could be exporting in IE
+                // using href throws "not supported" in ie7 and under, requries regex shim to fix later
+                elemWrapper.element.setAttribute('hc-svg-href', src);
+}
+
+        return elemWrapper;
+},
+
+/**
+ * Draw a symbol out of pre-defined shape paths from the namespace 'symbol' object.
+ *
+ * @param {Object} symbol
+ * @param {Object} x
+ * @param {Object} y
+ * @param {Object} radius
+ * @param {Object} options
+ */
+symbol: function (symbol, x, y, width, height, options) {
+
+        var obj,
+
+                // get the symbol definition function
+                symbolFn = this.symbols[symbol],
+
+                // check if there's a path defined for this symbol
+                path = symbolFn && symbolFn(
+                        mathRound(x),
+                        mathRound(y),
+                        width,
+                        height,
+                        options
+                ),
+
+                imageElement,
+                imageRegex = /^url\((.*?)\)$/,
+                imageSrc,
+                imageSize,
+                centerImage;
+
+        if (path) {
+
+                obj = this.path(path);
+                // expando properties for use in animate and attr
+                extend(obj, {
+                        symbolName: symbol,
+                        x: x,
+                        y: y,
+                        width: width,
+                        height: height
+                });
+                if (options) {
+                        extend(obj, options);
+                }
+
+        // image symbols
+        } else if (imageRegex.test(symbol)) {
+
+                // On image load, set the size and position
+                centerImage = function (img, size) {
+                        if (img.element) { // it may be destroyed in the meantime (#1390)
+                                img.attr({
+                                        width: size[0],
+                                        height: size[1]
+                                });
+
+                                if (!img.alignByTranslate) { // #185
+                                        img.translate(
+                                                mathRound((width - size[0]) / 2), // #1378
+                                                mathRound((height - size[1]) / 2)
+                                        );
+                                }
+                        }
+                };
+
+                imageSrc = symbol.match(imageRegex)[1];
+                imageSize = symbolSizes[imageSrc];
+
+                // Ireate the image synchronously, add attribs async
+                obj = this.image(imageSrc)
+                        .attr({
+                                x: x,
+                                y: y
+                        });
+                obj.isImg = true;
+
+                if (imageSize) {
+                        centerImage(obj, imageSize);
+                } else {
+                        // Initialize image to be 0 size so export will still function if there's no cached sizes.
+                        //
+                        obj.attr({ width: 0, height: 0 });
+
+                        // Create a dummy JavaScript image to get the width and height. Due to a bug in IE < 8,
+                        // the created element must be assigned to a variable in order to load (#292).
+                        imageElement = createElement('img', {
+                                onload: function () {
+                                        centerImage(obj, symbolSizes[imageSrc] = [this.width, this.height]);
+                                },
+                                src: imageSrc
+                        });
+                }
+        }
+
+        return obj;
+},
+
+/**
+ * An extendable collection of functions for defining symbol paths.
+ */
+symbols: {
+        'circle': function (x, y, w, h) {
+                var cpw = 0.166 * w;
+                return [
+                        M, x + w / 2, y,
+                        'C', x + w + cpw, y, x + w + cpw, y + h, x + w / 2, y + h,
+                        'C', x - cpw, y + h, x - cpw, y, x + w / 2, y,
+                        'Z'
+                ];
+        },
+
+        'square': function (x, y, w, h) {
+                return [
+                        M, x, y,
+                        L, x + w, y,
+                        x + w, y + h,
+                        x, y + h,
+                        'Z'
+                ];
+        },
+
+        'triangle': function (x, y, w, h) {
+                return [
+                        M, x + w / 2, y,
+                        L, x + w, y + h,
+                        x, y + h,
+                        'Z'
+                ];
+        },
+
+        'triangle-down': function (x, y, w, h) {
+                return [
+                        M, x, y,
+                        L, x + w, y,
+                        x + w / 2, y + h,
+                        'Z'
+                ];
+        },
+        'diamond': function (x, y, w, h) {
+                return [
+                        M, x + w / 2, y,
+                        L, x + w, y + h / 2,
+                        x + w / 2, y + h,
+                        x, y + h / 2,
+                        'Z'
+                ];
+        },
+        'arc': function (x, y, w, h, options) {
+                var start = options.start,
+                        radius = options.r || w || h,
+                        end = options.end - 0.001, // to prevent cos and sin of start and end from becoming equal on 360 arcs (related: #1561)
+                        innerRadius = options.innerR,
+                        open = options.open,
+                        cosStart = mathCos(start),
+                        sinStart = mathSin(start),
+                        cosEnd = mathCos(end),
+                        sinEnd = mathSin(end),
+                        longArc = options.end - start < mathPI ? 0 : 1;
+
+                return [
+                        M,
+                        x + radius * cosStart,
+                        y + radius * sinStart,
+                        'A', // arcTo
+                        radius, // x radius
+                        radius, // y radius
+                        0, // slanting
+                        longArc, // long or short arc
+                        1, // clockwise
+                        x + radius * cosEnd,
+                        y + radius * sinEnd,
+                        open ? M : L,
+                        x + innerRadius * cosEnd,
+                        y + innerRadius * sinEnd,
+                        'A', // arcTo
+                        innerRadius, // x radius
+                        innerRadius, // y radius
+                        0, // slanting
+                        longArc, // long or short arc
+                        0, // clockwise
+                        x + innerRadius * cosStart,
+                        y + innerRadius * sinStart,
+
+                        open ? '' : 'Z' // close
+                ];
+        },
+
+        /**
+         * Callout shape used for default tooltips, also used for rounded rectangles in VML
+         */
+        callout: function (x, y, w, h, options) {
+                var arrowLength = 6,
+                        halfDistance = 6,
+                        r = mathMin((options && options.r) || 0, w, h),
+                        safeDistance = r + halfDistance,
+                        anchorX = options && options.anchorX,
+                        anchorY = options && options.anchorY,
+                        path,
+                        normalizer = mathRound(options.strokeWidth || 0) % 2 / 2; // mathRound because strokeWidth can sometimes have roundoff errors;
+
+                x += normalizer;
+                y += normalizer;
+                path = [
+                        'M', x + r, y, 
+                        'L', x + w - r, y, // top side
+                        'C', x + w, y, x + w, y, x + w, y + r, // top-right corner
+                        'L', x + w, y + h - r, // right side
+                        'C', x + w, y + h, x + w, y + h, x + w - r, y + h, // bottom-right corner
+                        'L', x + r, y + h, // bottom side
+                        'C', x, y + h, x, y + h, x, y + h - r, // bottom-left corner
+                        'L', x, y + r, // left side
+                        'C', x, y, x, y, x + r, y // top-right corner
+                ];
+
+                if (anchorX && anchorX > w && anchorY > y + safeDistance && anchorY < y + h - safeDistance) { // replace right side
+                        path.splice(13, 3,
+                                'L', x + w, anchorY - halfDistance, 
+                                x + w + arrowLength, anchorY,
+                                x + w, anchorY + halfDistance,
+                                x + w, y + h - r
+                        );
+                } else if (anchorX && anchorX < 0 && anchorY > y + safeDistance && anchorY < y + h - safeDistance) { // replace left side
+                        path.splice(33, 3, 
+                                'L', x, anchorY + halfDistance, 
+                                x - arrowLength, anchorY,
+                                x, anchorY - halfDistance,
+                                x, y + r
+                        );
+                } else if (anchorY && anchorY > h && anchorX > x + safeDistance && anchorX < x + w - safeDistance) { // replace bottom
+                        path.splice(23, 3,
+                                'L', anchorX + halfDistance, y + h,
+                                anchorX, y + h + arrowLength,
+                                anchorX - halfDistance, y + h,
+                                x + r, y + h
+                        );
+                } else if (anchorY && anchorY < 0 && anchorX > x + safeDistance && anchorX < x + w - safeDistance) { // replace top
+                        path.splice(3, 3,
+                                'L', anchorX - halfDistance, y,
+                                anchorX, y - arrowLength,
+                                anchorX + halfDistance, y,
+                                w - r, y
+                        );
+                }
+                return path;
+        }
+},
+
+/**
+ * Define a clipping rectangle
+ * @param {String} id
+ * @param {Number} x
+ * @param {Number} y
+ * @param {Number} width
+ * @param {Number} height
+ */
+clipRect: function (x, y, width, height) {
+        var wrapper,
+                id = PREFIX + idCounter++,
+
+                clipPath = this.createElement('clipPath').attr({
+                        id: id
+                }).add(this.defs);
+
+        wrapper = this.rect(x, y, width, height, 0).add(clipPath);
+        wrapper.id = id;
+        wrapper.clipPath = clipPath;
+
+        return wrapper;
+},
+
+/**
+ * Add text to the SVG object
+ * @param {String} str
+ * @param {Number} x Left position
+ * @param {Number} y Top position
+ * @param {Boolean} useHTML Use HTML to render the text
+ */
+text: function (str, x, y, useHTML) {
+
+        // declare variables
+        var renderer = this,
+                fakeSVG = useCanVG || (!hasSVG && renderer.forExport),
+                wrapper,
+                attr = {};
+
+        if (useHTML && !renderer.forExport) {
+                return renderer.html(str, x, y);
+        }
+
+        attr.x = Math.round(x || 0); // X is always needed for line-wrap logic
+        if (y) {
+                attr.y = Math.round(y);
+        }
+        if (str || str === 0) {
+                attr.text = str;
+        }
+
+        wrapper = renderer.createElement('text')
+                .attr(attr);
+
+        // Prevent wrapping from creating false offsetWidths in export in legacy IE (#1079, #1063)
+        if (fakeSVG) {
+                wrapper.css({
+                        position: ABSOLUTE
+                });
+        }
+
+        if (!useHTML) {
+                wrapper.xSetter = function (value, key, element) {
+                        var childNodes = element.childNodes,
+                                child,
+                                i;
+                        for (i = 1; i < childNodes.length; i++) {
+                                child = childNodes[i];
+                                // if the x values are equal, the tspan represents a linebreak
+                                if (child.getAttribute('x') === element.getAttribute('x')) {
+                                        child.setAttribute('x', value);
+                                }
+                        }
+                        element.setAttribute(key, value);
+                };
+        }
+
+        return wrapper;
+},
+
+/**
+ * Utility to return the baseline offset and total line height from the font size
+ */
+fontMetrics: function (fontSize) {
+        fontSize = fontSize || this.style.fontSize;
+        fontSize = /px/.test(fontSize) ? pInt(fontSize) : /em/.test(fontSize) ? parseFloat(fontSize) * 12 : 12;
+
+        // Empirical values found by comparing font size and bounding box height.
+        // Applies to the default font family. http://jsfiddle.net/highcharts/7xvn7/
+        var lineHeight = fontSize < 24 ? fontSize + 4 : mathRound(fontSize * 1.2),
+                baseline = mathRound(lineHeight * 0.8);
+
+        return {
+                h: lineHeight,
+                b: baseline
+        };
+},
+
+/**
+ * Add a label, a text item that can hold a colored or gradient background
+ * as well as a border and shadow.
+ * @param {string} str
+ * @param {Number} x
+ * @param {Number} y
+ * @param {String} shape
+ * @param {Number} anchorX In case the shape has a pointer, like a flag, this is the
+ *    coordinates it should be pinned to
+ * @param {Number} anchorY
+ * @param {Boolean} baseline Whether to position the label relative to the text baseline,
+ *    like renderer.text, or to the upper border of the rectangle.
+ * @param {String} className Class name for the group
+ */
+label: function (str, x, y, shape, anchorX, anchorY, useHTML, baseline, className) {
+
+        var renderer = this,
+                wrapper = renderer.g(className),
+                text = renderer.text('', 0, 0, useHTML)
+                        .attr({
+                                zIndex: 1
+                        }),
+                        //.add(wrapper),
+                box,
+                bBox,
+                alignFactor = 0,
+                padding = 3,
+                paddingLeft = 0,
+                width,
+                height,
+                wrapperX,
+                wrapperY,
+                crispAdjust = 0,
+                deferredAttr = {},
+                baselineOffset,
+                needsBox;
+
+        /**
+         * This function runs after the label is added to the DOM (when the bounding box is
+         * available), and after the text of the label is updated to detect the new bounding
+         * box and reflect it in the border box.
+         */
+        function updateBoxSize() {
+                var boxX,
+                        boxY,
+                        style = text.element.style;
+
+                bBox = (width === undefined || height === undefined || wrapper.styles.textAlign) && text.textStr && 
+                        text.getBBox();
+                wrapper.width = (width || bBox.width || 0) + 2 * padding + paddingLeft;
+                wrapper.height = (height || bBox.height || 0) + 2 * padding;
+
+                // update the label-scoped y offset
+                baselineOffset = padding + renderer.fontMetrics(style && style.fontSize).b;
+
+                if (needsBox) {
+
+                        // create the border box if it is not already present
+                        if (!box) {
+                                boxX = mathRound(-alignFactor * padding);
+                                boxY = baseline ? -baselineOffset : 0;
+
+                                wrapper.box = box = shape ?
+                                        renderer.symbol(shape, boxX, boxY, wrapper.width, wrapper.height, deferredAttr) :
+                                        renderer.rect(boxX, boxY, wrapper.width, wrapper.height, 0, deferredAttr[STROKE_WIDTH]);
+                                box.attr('fill', NONE).add(wrapper);
+                        }
+
+                        // apply the box attributes
+                        if (!box.isImg) { // #1630
+                                box.attr(extend({
+                                        width: mathRound(wrapper.width),
+                                        height: mathRound(wrapper.height)
+                                }, deferredAttr));
+                        }
+                        deferredAttr = null;
+                }
+        }
+
+        /**
+         * This function runs after setting text or padding, but only if padding is changed
+         */
+        function updateTextPadding() {
+                var styles = wrapper.styles,
+                        textAlign = styles && styles.textAlign,
+                        x = paddingLeft + padding * (1 - alignFactor),
+                        y;
+
+                // determin y based on the baseline
+                y = baseline ? 0 : baselineOffset;
+
+                // compensate for alignment
+                if (defined(width) && bBox && (textAlign === 'center' || textAlign === 'right')) {
+                        x += { center: 0.5, right: 1 }[textAlign] * (width - bBox.width);
+                }
+
+                // update if anything changed
+                if (x !== text.x || y !== text.y) {
+                        text.attr('x', x);
+                        if (y !== UNDEFINED) {
+                                text.attr('y', y);
+                        }
+                }
+
+                // record current values
+                text.x = x;
+                text.y = y;
+        }
+
+        /**
+         * Set a box attribute, or defer it if the box is not yet created
+         * @param {Object} key
+         * @param {Object} value
+         */
+        function boxAttr(key, value) {
+                if (box) {
+                        box.attr(key, value);
+                } else {
+                        deferredAttr[key] = value;
+                }
+        }
+
+        /**
+         * After the text element is added, get the desired size of the border box
+         * and add it before the text in the DOM.
+         */
+        wrapper.onAdd = function () {
+                text.add(wrapper);
+                wrapper.attr({
+                        text: str || '', // alignment is available now
+                        x: x,
+                        y: y
+                });
+
+                if (box && defined(anchorX)) {
+                        wrapper.attr({
+                                anchorX: anchorX,
+                                anchorY: anchorY
+                        });
+                }
+        };
+
+        /*
+         * Add specific attribute setters.
+         */
+
+        // only change local variables
+        wrapper.widthSetter = function (value) {
+                width = value;
+        };
+        wrapper.heightSetter = function (value) {
+                height = value;
+        };
+        wrapper.paddingSetter =  function (value) {
+                if (defined(value) && value !== padding) {
+                        padding = value;
+                        updateTextPadding();
+                }
+        };
+        wrapper.paddingLeftSetter =  function (value) {
+                if (defined(value) && value !== paddingLeft) {
+                        paddingLeft = value;
+                        updateTextPadding();
+                }
+        };
+
+        // change local variable and prevent setting attribute on the group
+        wrapper.alignSetter = function (value) {
+                alignFactor = { left: 0, center: 0.5, right: 1 }[value];
+        };
+
+        // apply these to the box and the text alike
+        wrapper.textSetter = function (value) {
+                if (value !== UNDEFINED) {
+                        text.textSetter(value);
+                }
+                updateBoxSize();
+                updateTextPadding();
+        };
+
+        // apply these to the box but not to the text
+        wrapper['stroke-widthSetter'] = function (value, key) {
+                if (value) {
+                        needsBox = true;
+                }
+                crispAdjust = value % 2 / 2;
+                boxAttr(key, value);
+        };
+        wrapper.strokeSetter = wrapper.fillSetter = wrapper.rSetter = function (value, key) {
+                if (key === 'fill' && value) {
+                        needsBox = true;
+                }
+                boxAttr(key, value);
+        };
+        wrapper.anchorXSetter = function (value, key) {
+                anchorX = value;
+                boxAttr(key, value + crispAdjust - wrapperX);
+        };
+        wrapper.anchorYSetter = function (value, key) {
+                anchorY = value;
+                boxAttr(key, value - wrapperY);
+        };
+
+        // rename attributes
+        wrapper.xSetter = function (value) {
+                wrapper.x = value; // for animation getter
+                if (alignFactor) {
+                        value -= alignFactor * ((width || bBox.width) + padding);
+                }
+                wrapperX = mathRound(value);
+                wrapper.attr('translateX', wrapperX);
+        };
+        wrapper.ySetter = function (value) {
+                wrapperY = wrapper.y = mathRound(value);
+                wrapper.attr('translateY', wrapperY);
+        };
+
+        // Redirect certain methods to either the box or the text
+        var baseCss = wrapper.css;
+        return extend(wrapper, {
+                /**
+                 * Pick up some properties and apply them to the text instead of the wrapper
+                 */
+                css: function (styles) {
+                        if (styles) {
+                                var textStyles = {};
+                                styles = merge(styles); // create a copy to avoid altering the original object (#537)
+                                each(['fontSize', 'fontWeight', 'fontFamily', 'color', 'lineHeight', 'width', 'textDecoration', 'textShadow'], function (prop) {
+                                        if (styles[prop] !== UNDEFINED) {
+                                                textStyles[prop] = styles[prop];
+                                                delete styles[prop];
+                                        }
+                                });
+                                text.css(textStyles);
+                        }
+                        return baseCss.call(wrapper, styles);
+                },
+                /**
+                 * Return the bounding box of the box, not the group
+                 */
+                getBBox: function () {
+                        return {
+                                width: bBox.width + 2 * padding,
+                                height: bBox.height + 2 * padding,
+                                x: bBox.x - padding,
+                                y: bBox.y - padding
+                        };
+                },
+                /**
+                 * Apply the shadow to the box
+                 */
+                shadow: function (b) {
+                        if (box) {
+                                box.shadow(b);
+                        }
+                        return wrapper;
+                },
+                /**
+                 * Destroy and release memory.
+                 */
+                destroy: function () {
+
+                        // Added by button implementation
+                        removeEvent(wrapper.element, 'mouseenter');
+                        removeEvent(wrapper.element, 'mouseleave');
+
+                        if (text) {
+                                text = text.destroy();
+                        }
+                        if (box) {
+                                box = box.destroy();
+                        }
+                        // Call base implementation to destroy the rest
+                        SVGElement.prototype.destroy.call(wrapper);
+
+                        // Release local pointers (#1298)
+                        wrapper = renderer = updateBoxSize = updateTextPadding = boxAttr = null;
+                }
+        });
+}
+ +

}; // end SVGRenderer

+ +

// general renderer Renderer = SVGRenderer; // extend SvgElement for useHTML option extend(SVGElement.prototype, {

+ +
/**
+ * Apply CSS to HTML elements. This is used in text within SVG rendering and
+ * by the VML renderer
+ */
+htmlCss: function (styles) {
+        var wrapper = this,
+                element = wrapper.element,
+                textWidth = styles && element.tagName === 'SPAN' && styles.width;
+
+        if (textWidth) {
+                delete styles.width;
+                wrapper.textWidth = textWidth;
+                wrapper.updateTransform();
+        }
+
+        wrapper.styles = extend(wrapper.styles, styles);
+        css(wrapper.element, styles);
+
+        return wrapper;
+},
+
+/**
+ * VML and useHTML method for calculating the bounding box based on offsets
+ * @param {Boolean} refresh Whether to force a fresh value from the DOM or to
+ * use the cached value
+ *
+ * @return {Object} A hash containing values for x, y, width and height
+ */
+
+htmlGetBBox: function () {
+        var wrapper = this,
+                element = wrapper.element,
+                bBox = wrapper.bBox;
+
+        // faking getBBox in exported SVG in legacy IE
+        if (!bBox) {
+                // faking getBBox in exported SVG in legacy IE (is this a duplicate of the fix for #1079?)
+                if (element.nodeName === 'text') {
+                        element.style.position = ABSOLUTE;
+                }
+
+                bBox = wrapper.bBox = {
+                        x: element.offsetLeft,
+                        y: element.offsetTop,
+                        width: element.offsetWidth,
+                        height: element.offsetHeight
+                };
+        }
+
+        return bBox;
+},
+
+/**
+ * VML override private method to update elements based on internal
+ * properties based on SVG transform
+ */
+htmlUpdateTransform: function () {
+        // aligning non added elements is expensive
+        if (!this.added) {
+                this.alignOnAdd = true;
+                return;
+        }
+
+        var wrapper = this,
+                renderer = wrapper.renderer,
+                elem = wrapper.element,
+                translateX = wrapper.translateX || 0,
+                translateY = wrapper.translateY || 0,
+                x = wrapper.x || 0,
+                y = wrapper.y || 0,
+                align = wrapper.textAlign || 'left',
+                alignCorrection = { left: 0, center: 0.5, right: 1 }[align],
+                shadows = wrapper.shadows;
+
+        // apply translate
+        css(elem, {
+                marginLeft: translateX,
+                marginTop: translateY
+        });
+        if (shadows) { // used in labels/tooltip
+                each(shadows, function (shadow) {
+                        css(shadow, {
+                                marginLeft: translateX + 1,
+                                marginTop: translateY + 1
+                        });
+                });
+        }
+
+        // apply inversion
+        if (wrapper.inverted) { // wrapper is a group
+                each(elem.childNodes, function (child) {
+                        renderer.invertChild(child, elem);
+                });
+        }
+
+        if (elem.tagName === 'SPAN') {
+
+                var width,
+                        rotation = wrapper.rotation,
+                        baseline,
+                        textWidth = pInt(wrapper.textWidth),
+                        currentTextTransform = [rotation, align, elem.innerHTML, wrapper.textWidth].join(',');
+
+                if (currentTextTransform !== wrapper.cTT) { // do the calculations and DOM access only if properties changed
+
+                        baseline = renderer.fontMetrics(elem.style.fontSize).b;
+
+                        // Renderer specific handling of span rotation
+                        if (defined(rotation)) {
+                                wrapper.setSpanRotation(rotation, alignCorrection, baseline);
+                        }
+
+                        width = pick(wrapper.elemWidth, elem.offsetWidth);
+
+                        // Update textWidth
+                        if (width > textWidth && /[ \-]/.test(elem.textContent || elem.innerText)) { // #983, #1254
+                                css(elem, {
+                                        width: textWidth + PX,
+                                        display: 'block',
+                                        whiteSpace: 'normal'
+                                });
+                                width = textWidth;
+                        }
+
+                        wrapper.getSpanCorrection(width, baseline, alignCorrection, rotation, align);
+                }
+
+                // apply position with correction
+                css(elem, {
+                        left: (x + (wrapper.xCorr || 0)) + PX,
+                        top: (y + (wrapper.yCorr || 0)) + PX
+                });
+
+                // force reflow in webkit to apply the left and top on useHTML element (#1249)
+                if (isWebKit) {
+                        baseline = elem.offsetHeight; // assigned to baseline for JSLint purpose
+                }
+
+                // record current text transform
+                wrapper.cTT = currentTextTransform;
+        }
+},
+
+/**
+ * Set the rotation of an individual HTML span
+ */
+setSpanRotation: function (rotation, alignCorrection, baseline) {
+        var rotationStyle = {},
+                cssTransformKey = isIE ? '-ms-transform' : isWebKit ? '-webkit-transform' : isFirefox ? 'MozTransform' : isOpera ? '-o-transform' : '';
+
+        rotationStyle[cssTransformKey] = rotationStyle.transform = 'rotate(' + rotation + 'deg)';
+        rotationStyle[cssTransformKey + (isFirefox ? 'Origin' : '-origin')] = rotationStyle.transformOrigin = (alignCorrection * 100) + '% ' + baseline + 'px';
+        css(this.element, rotationStyle);
+},
+
+/**
+ * Get the correction in X and Y positioning as the element is rotated.
+ */
+getSpanCorrection: function (width, baseline, alignCorrection) {
+        this.xCorr = -width * alignCorrection;
+        this.yCorr = -baseline;
+}
+ +

});

+ +

// Extend SvgRenderer for useHTML option. extend(SVGRenderer.prototype, {

+ +
/**
+ * Create HTML text node. This is used by the VML renderer as well as the SVG
+ * renderer through the useHTML option.
+ *
+ * @param {String} str
+ * @param {Number} x
+ * @param {Number} y
+ */
+html: function (str, x, y) {
+        var wrapper = this.createElement('span'),
+                element = wrapper.element,
+                renderer = wrapper.renderer;
+
+        // Text setter
+        wrapper.textSetter = function (value) {
+                if (value !== element.innerHTML) {
+                        delete this.bBox;
+                }
+                element.innerHTML = this.textStr = value;
+        };
+
+        // Various setters which rely on update transform
+        wrapper.xSetter = wrapper.ySetter = wrapper.alignSetter = wrapper.rotationSetter = function (value, key) {
+                if (key === 'align') {
+                        key = 'textAlign'; // Do not overwrite the SVGElement.align method. Same as VML.
+                }
+                wrapper[key] = value;
+                wrapper.htmlUpdateTransform();
+        };
+
+        // Set the default attributes
+        wrapper.attr({
+                        text: str,
+                        x: mathRound(x),
+                        y: mathRound(y)
+                })
+                .css({
+                        position: ABSOLUTE,
+                        whiteSpace: 'nowrap',
+                        fontFamily: this.style.fontFamily,
+                        fontSize: this.style.fontSize
+                });
+
+        // Use the HTML specific .css method
+        wrapper.css = wrapper.htmlCss;
+
+        // This is specific for HTML within SVG
+        if (renderer.isSVG) {
+                wrapper.add = function (svgGroupWrapper) {
+
+                        var htmlGroup,
+                                container = renderer.box.parentNode,
+                                parentGroup,
+                                parents = [];
+
+                        this.parentGroup = svgGroupWrapper;
+
+                        // Create a mock group to hold the HTML elements
+                        if (svgGroupWrapper) {
+                                htmlGroup = svgGroupWrapper.div;
+                                if (!htmlGroup) {
+
+                                        // Read the parent chain into an array and read from top down
+                                        parentGroup = svgGroupWrapper;
+                                        while (parentGroup) {
+
+                                                parents.push(parentGroup);
+
+                                                // Move up to the next parent group
+                                                parentGroup = parentGroup.parentGroup;
+                                        }
+
+                                        // Ensure dynamically updating position when any parent is translated
+                                        each(parents.reverse(), function (parentGroup) {
+                                                var htmlGroupStyle;
+
+                                                // Create a HTML div and append it to the parent div to emulate
+                                                // the SVG group structure
+                                                htmlGroup = parentGroup.div = parentGroup.div || createElement(DIV, {
+                                                        className: attr(parentGroup.element, 'class')
+                                                }, {
+                                                        position: ABSOLUTE,
+                                                        left: (parentGroup.translateX || 0) + PX,
+                                                        top: (parentGroup.translateY || 0) + PX
+                                                }, htmlGroup || container); // the top group is appended to container
+
+                                                // Shortcut
+                                                htmlGroupStyle = htmlGroup.style;
+
+                                                // Set listeners to update the HTML div's position whenever the SVG group
+                                                // position is changed
+                                                extend(parentGroup, {
+                                                        translateXSetter: function (value, key) {
+                                                                htmlGroupStyle.left = value + PX;
+                                                                parentGroup[key] = value;
+                                                                parentGroup.doTransform = true;
+                                                        },
+                                                        translateYSetter: function (value, key) {
+                                                                htmlGroupStyle.top = value + PX;
+                                                                parentGroup[key] = value;
+                                                                parentGroup.doTransform = true;
+                                                        },
+                                                        visibilitySetter: function (value, key) {
+                                                                htmlGroupStyle[key] = value;
+                                                        }
+                                                });
+                                        });
+
+                                }
+                        } else {
+                                htmlGroup = container;
+                        }
+
+                        htmlGroup.appendChild(element);
+
+                        // Shared with VML:
+                        wrapper.added = true;
+                        if (wrapper.alignOnAdd) {
+                                wrapper.htmlUpdateTransform();
+                        }
+
+                        return wrapper;
+                };
+        }
+        return wrapper;
+}
+ +

});

+ +

/* ****************************************************************************

+ +
*                                                                            *
+* START OF INTERNET EXPLORER <= 8 SPECIFIC CODE                              *
+*                                                                            *
+* For applications and websites that don't need IE support, like platform    *
+* targeted mobile apps and web apps, this code can be removed.               *
+*                                                                            *
+*****************************************************************************/
+ +

/**

+ +
* @constructor
+*/
+ +

var VMLRenderer, VMLElement; if (!hasSVG && !useCanVG) {

+ +

/**

+ +
* The VML element wrapper.
+*/
+ +

Highcharts.VMLElement = VMLElement = {

+ +
/**
+ * Initialize a new VML element wrapper. It builds the markup as a string
+ * to minimize DOM traffic.
+ * @param {Object} renderer
+ * @param {Object} nodeName
+ */
+init: function (renderer, nodeName) {
+        var wrapper = this,
+                markup =  ['<', nodeName, ' filled="f" stroked="f"'],
+                style = ['position: ', ABSOLUTE, ';'],
+                isDiv = nodeName === DIV;
+
+        // divs and shapes need size
+        if (nodeName === 'shape' || isDiv) {
+                style.push('left:0;top:0;width:1px;height:1px;');
+        }
+        style.push('visibility: ', isDiv ? HIDDEN : VISIBLE);
+
+        markup.push(' style="', style.join(''), '"/>');
+
+        // create element with default attributes and style
+        if (nodeName) {
+                markup = isDiv || nodeName === 'span' || nodeName === 'img' ?
+                        markup.join('')
+                        : renderer.prepVML(markup);
+                wrapper.element = createElement(markup);
+        }
+
+        wrapper.renderer = renderer;
+},
+
+/**
+ * Add the node to the given parent
+ * @param {Object} parent
+ */
+add: function (parent) {
+        var wrapper = this,
+                renderer = wrapper.renderer,
+                element = wrapper.element,
+                box = renderer.box,
+                inverted = parent && parent.inverted,
+
+                // get the parent node
+                parentNode = parent ?
+                        parent.element || parent :
+                        box;
+
+        // if the parent group is inverted, apply inversion on all children
+        if (inverted) { // only on groups
+                renderer.invertChild(element, parentNode);
+        }
+
+        // append it
+        parentNode.appendChild(element);
+
+        // align text after adding to be able to read offset
+        wrapper.added = true;
+        if (wrapper.alignOnAdd && !wrapper.deferUpdateTransform) {
+                wrapper.updateTransform();
+        }
+
+        // fire an event for internal hooks
+        if (wrapper.onAdd) {
+                wrapper.onAdd();
+        }
+
+        return wrapper;
+},
+
+/**
+ * VML always uses htmlUpdateTransform
+ */
+updateTransform: SVGElement.prototype.htmlUpdateTransform,
+
+/**
+ * Set the rotation of a span with oldIE's filter
+ */
+setSpanRotation: function () {
+        // Adjust for alignment and rotation. Rotation of useHTML content is not yet implemented
+        // but it can probably be implemented for Firefox 3.5+ on user request. FF3.5+
+        // has support for CSS3 transform. The getBBox method also needs to be updated
+        // to compensate for the rotation, like it currently does for SVG.
+        // Test case: http://jsfiddle.net/highcharts/Ybt44/
+
+        var rotation = this.rotation,
+                costheta = mathCos(rotation * deg2rad),
+                sintheta = mathSin(rotation * deg2rad);
+
+        css(this.element, {
+                filter: rotation ? ['progid:DXImageTransform.Microsoft.Matrix(M11=', costheta,
+                        ', M12=', -sintheta, ', M21=', sintheta, ', M22=', costheta,
+                        ', sizingMethod=\'auto expand\')'].join('') : NONE
+        });
+},
+
+/**
+ * Get the positioning correction for the span after rotating. 
+ */
+getSpanCorrection: function (width, baseline, alignCorrection, rotation, align) {
+
+        var costheta = rotation ? mathCos(rotation * deg2rad) : 1,
+                sintheta = rotation ? mathSin(rotation * deg2rad) : 0,
+                height = pick(this.elemHeight, this.element.offsetHeight),
+                quad,
+                nonLeft = align && align !== 'left';
+
+        // correct x and y
+        this.xCorr = costheta < 0 && -width;
+        this.yCorr = sintheta < 0 && -height;
+
+        // correct for baseline and corners spilling out after rotation
+        quad = costheta * sintheta < 0;
+        this.xCorr += sintheta * baseline * (quad ? 1 - alignCorrection : alignCorrection);
+        this.yCorr -= costheta * baseline * (rotation ? (quad ? alignCorrection : 1 - alignCorrection) : 1);
+        // correct for the length/height of the text
+        if (nonLeft) {
+                this.xCorr -= width * alignCorrection * (costheta < 0 ? -1 : 1);
+                if (rotation) {
+                        this.yCorr -= height * alignCorrection * (sintheta < 0 ? -1 : 1);
+                }
+                css(this.element, {
+                        textAlign: align
+                });
+        }
+},
+
+/**
+ * Converts a subset of an SVG path definition to its VML counterpart. Takes an array
+ * as the parameter and returns a string.
+ */
+pathToVML: function (value) {
+        // convert paths
+        var i = value.length,
+                path = [];
+
+        while (i--) {
+
+                // Multiply by 10 to allow subpixel precision.
+                // Substracting half a pixel seems to make the coordinates
+                // align with SVG, but this hasn't been tested thoroughly
+                if (isNumber(value[i])) {
+                        path[i] = mathRound(value[i] * 10) - 5;
+                } else if (value[i] === 'Z') { // close the path
+                        path[i] = 'x';
+                } else {
+                        path[i] = value[i];
+
+                        // When the start X and end X coordinates of an arc are too close,
+                        // they are rounded to the same value above. In this case, substract or 
+                        // add 1 from the end X and Y positions. #186, #760, #1371, #1410.
+                        if (value.isArc && (value[i] === 'wa' || value[i] === 'at')) {
+                                // Start and end X
+                                if (path[i + 5] === path[i + 7]) {
+                                        path[i + 7] += value[i + 7] > value[i + 5] ? 1 : -1;
+                                }
+                                // Start and end Y
+                                if (path[i + 6] === path[i + 8]) {
+                                        path[i + 8] += value[i + 8] > value[i + 6] ? 1 : -1;
+                                }
+                        }
+                }
+        }
+
+        // Loop up again to handle path shortcuts (#2132)
+        /*while (i++ < path.length) {
+                if (path[i] === 'H') { // horizontal line to
+                        path[i] = 'L';
+                        path.splice(i + 2, 0, path[i - 1]);
+                } else if (path[i] === 'V') { // vertical line to
+                        path[i] = 'L';
+                        path.splice(i + 1, 0, path[i - 2]);
+                }
+        }*/
+        return path.join(' ') || 'x';
+},
+
+/**
+ * Set the element's clipping to a predefined rectangle
+ *
+ * @param {String} id The id of the clip rectangle
+ */
+clip: function (clipRect) {
+        var wrapper = this,
+                clipMembers,
+                cssRet;
+
+        if (clipRect) {
+                clipMembers = clipRect.members;
+                erase(clipMembers, wrapper); // Ensure unique list of elements (#1258)
+                clipMembers.push(wrapper);
+                wrapper.destroyClip = function () {
+                        erase(clipMembers, wrapper);
+                };
+                cssRet = clipRect.getCSS(wrapper);
+
+        } else {
+                if (wrapper.destroyClip) {
+                        wrapper.destroyClip();
+                }
+                cssRet = { clip: docMode8 ? 'inherit' : 'rect(auto)' }; // #1214
+        }
+
+        return wrapper.css(cssRet);
+
+},
+
+/**
+ * Set styles for the element
+ * @param {Object} styles
+ */
+css: SVGElement.prototype.htmlCss,
+
+/**
+ * Removes a child either by removeChild or move to garbageBin.
+ * Issue 490; in VML removeChild results in Orphaned nodes according to sIEve, discardElement does not.
+ */
+safeRemoveChild: function (element) {
+        // discardElement will detach the node from its parent before attaching it
+        // to the garbage bin. Therefore it is important that the node is attached and have parent.
+        if (element.parentNode) {
+                discardElement(element);
+        }
+},
+
+/**
+ * Extend element.destroy by removing it from the clip members array
+ */
+destroy: function () {
+        if (this.destroyClip) {
+                this.destroyClip();
+        }
+
+        return SVGElement.prototype.destroy.apply(this);
+},
+
+/**
+ * Add an event listener. VML override for normalizing event parameters.
+ * @param {String} eventType
+ * @param {Function} handler
+ */
+on: function (eventType, handler) {
+        // simplest possible event model for internal use
+        this.element['on' + eventType] = function () {
+                var evt = win.event;
+                evt.target = evt.srcElement;
+                handler(evt);
+        };
+        return this;
+},
+
+/**
+ * In stacked columns, cut off the shadows so that they don't overlap
+ */
+cutOffPath: function (path, length) {
+
+        var len;
+
+        path = path.split(/[ ,]/);
+        len = path.length;
+
+        if (len === 9 || len === 11) {
+                path[len - 4] = path[len - 2] = pInt(path[len - 2]) - 10 * length;
+        }
+        return path.join(' ');
+},
+
+/**
+ * Apply a drop shadow by copying elements and giving them different strokes
+ * @param {Boolean|Object} shadowOptions
+ */
+shadow: function (shadowOptions, group, cutOff) {
+        var shadows = [],
+                i,
+                element = this.element,
+                renderer = this.renderer,
+                shadow,
+                elemStyle = element.style,
+                markup,
+                path = element.path,
+                strokeWidth,
+                modifiedPath,
+                shadowWidth,
+                shadowElementOpacity;
+
+        // some times empty paths are not strings
+        if (path && typeof path.value !== 'string') {
+                path = 'x';
+        }
+        modifiedPath = path;
+
+        if (shadowOptions) {
+                shadowWidth = pick(shadowOptions.width, 3);
+                shadowElementOpacity = (shadowOptions.opacity || 0.15) / shadowWidth;
+                for (i = 1; i <= 3; i++) {
+
+                        strokeWidth = (shadowWidth * 2) + 1 - (2 * i);
+
+                        // Cut off shadows for stacked column items
+                        if (cutOff) {
+                                modifiedPath = this.cutOffPath(path.value, strokeWidth + 0.5);
+                        }
+
+                        markup = ['<shape isShadow="true" strokeweight="', strokeWidth,
+                                '" filled="false" path="', modifiedPath,
+                                '" coordsize="10 10" style="', element.style.cssText, '" />'];
+
+                        shadow = createElement(renderer.prepVML(markup),
+                                null, {
+                                        left: pInt(elemStyle.left) + pick(shadowOptions.offsetX, 1),
+                                        top: pInt(elemStyle.top) + pick(shadowOptions.offsetY, 1)
+                                }
+                        );
+                        if (cutOff) {
+                                shadow.cutOff = strokeWidth + 1;
+                        }
+
+                        // apply the opacity
+                        markup = ['<stroke color="', shadowOptions.color || 'black', '" opacity="', shadowElementOpacity * i, '"/>'];
+                        createElement(renderer.prepVML(markup), null, null, shadow);
+
+                        // insert it
+                        if (group) {
+                                group.element.appendChild(shadow);
+                        } else {
+                                element.parentNode.insertBefore(shadow, element);
+                        }
+
+                        // record it
+                        shadows.push(shadow);
+
+                }
+
+                this.shadows = shadows;
+        }
+        return this;
+},
+updateShadows: noop, // Used in SVG only
+
+setAttr: function (key, value) {
+        if (docMode8) { // IE8 setAttribute bug
+                this.element[key] = value;
+        } else {
+                this.element.setAttribute(key, value);
+        }
+},
+classSetter: function (value) {
+        // IE8 Standards mode has problems retrieving the className unless set like this
+        this.element.className = value;
+},
+dashstyleSetter: function (value, key, element) {
+        var strokeElem = element.getElementsByTagName('stroke')[0] ||
+                createElement(this.renderer.prepVML(['<stroke/>']), null, null, element);
+        strokeElem[key] = value || 'solid';
+        this[key] = value; /* because changing stroke-width will change the dash length
+                and cause an epileptic effect */
+},
+dSetter: function (value, key, element) {
+        var i,
+                shadows = this.shadows;
+        value = value || [];
+        this.d = value.join(' '); // used in getter for animation
+
+        element.path = value = this.pathToVML(value);
+
+        // update shadows
+        if (shadows) {
+                i = shadows.length;
+                while (i--) {
+                        shadows[i].path = shadows[i].cutOff ? this.cutOffPath(value, shadows[i].cutOff) : value;
+                }
+        }
+        this.setAttr(key, value);
+},
+fillSetter: function (value, key, element) {
+        var nodeName = element.nodeName;
+        if (nodeName === 'SPAN') { // text color
+                element.style.color = value;
+        } else if (nodeName !== 'IMG') { // #1336
+                element.filled = value !== NONE;
+                this.setAttr('fillcolor', this.renderer.color(value, element, key, this));
+        }
+},
+opacitySetter: noop, // Don't bother - animation is too slow and filters introduce artifacts
+rotationSetter: function (value, key, element) {
+        var style = element.style;
+        this[key] = style[key] = value; // style is for #1873
+
+        // Correction for the 1x1 size of the shape container. Used in gauge needles.
+        style.left = -mathRound(mathSin(value * deg2rad) + 1) + PX;
+        style.top = mathRound(mathCos(value * deg2rad)) + PX;
+},
+strokeSetter: function (value, key, element) {
+        this.setAttr('strokecolor', this.renderer.color(value, element, key));
+},
+'stroke-widthSetter': function (value, key, element) {
+        element.stroked = !!value; // VML "stroked" attribute
+        this[key] = value; // used in getter, issue #113
+        if (isNumber(value)) {
+                value += PX;
+        }
+        this.setAttr('strokeweight', value);
+},
+titleSetter: function (value, key) {
+        this.setAttr(key, value);
+},
+visibilitySetter: function (value, key, element) {
+
+        // Handle inherited visibility
+        if (value === 'inherit') {
+                value = VISIBLE;
+        }
+
+        // Let the shadow follow the main element
+        if (this.shadows) {
+                each(this.shadows, function (shadow) {
+                        shadow.style[key] = value;
+                });
+        }
+
+        // Instead of toggling the visibility CSS property, move the div out of the viewport.
+        // This works around #61 and #586
+        if (element.nodeName === 'DIV') {
+                value = value === HIDDEN ? '-999em' : 0;
+
+                // In order to redraw, IE7 needs the div to be visible when tucked away
+                // outside the viewport. So the visibility is actually opposite of
+                // the expected value. This applies to the tooltip only.
+                if (!docMode8) {
+                        element.style[key] = value ? VISIBLE : HIDDEN;
+                }
+                key = 'top';
+        }
+        element.style[key] = value;
+},
+xSetter: function (value, key, element) {
+        this[key] = value; // used in getter
+
+        if (key === 'x') {
+                key = 'left';
+        } else if (key === 'y') {
+                key = 'top';
+        }/* else {
+                value = mathMax(0, value); // don't set width or height below zero (#311)
+        }*/
+
+        // clipping rectangle special
+        if (this.updateClipping) {
+                this[key] = value; // the key is now 'left' or 'top' for 'x' and 'y'
+                this.updateClipping();
+        } else {
+                // normal
+                element.style[key] = value;
+        }
+},
+zIndexSetter: function (value, key, element) {
+        element.style[key] = value;
+}
+ +

}; VMLElement = extendClass(SVGElement, VMLElement);

+ +

// Some shared setters VMLElement.prototype.ySetter =

+ +
VMLElement.prototype.widthSetter = 
+VMLElement.prototype.heightSetter = 
+VMLElement.prototype.xSetter;
+
+ +

/**

+ +
* The VML renderer
+*/
+ +

var VMLRendererExtension = { // inherit SVGRenderer

+ +
Element: VMLElement,
+isIE8: userAgent.indexOf('MSIE 8.0') > -1,
+
+/**
+ * Initialize the VMLRenderer
+ * @param {Object} container
+ * @param {Number} width
+ * @param {Number} height
+ */
+init: function (container, width, height, style) {
+        var renderer = this,
+                boxWrapper,
+                box,
+                css;
+
+        renderer.alignedObjects = [];
+
+        boxWrapper = renderer.createElement(DIV)
+                .css(extend(this.getStyle(style), { position: RELATIVE}));
+        box = boxWrapper.element;
+        container.appendChild(boxWrapper.element);
+
+        // generate the containing box
+        renderer.isVML = true;
+        renderer.box = box;
+        renderer.boxWrapper = boxWrapper;
+        renderer.cache = {};
+
+        renderer.setSize(width, height, false);
+
+        // The only way to make IE6 and IE7 print is to use a global namespace. However,
+        // with IE8 the only way to make the dynamic shapes visible in screen and print mode
+        // seems to be to add the xmlns attribute and the behaviour style inline.
+        if (!doc.namespaces.hcv) {
+
+                doc.namespaces.add('hcv', 'urn:schemas-microsoft-com:vml');
+
+                // Setup default CSS (#2153, #2368, #2384)
+                css = 'hcv\\:fill, hcv\\:path, hcv\\:shape, hcv\\:stroke' +
+                        '{ behavior:url(#default#VML); display: inline-block; } ';
+                try {
+                        doc.createStyleSheet().cssText = css;
+                } catch (e) {
+                        doc.styleSheets[0].cssText += css;
+                }
+
+        }
+},
+
+/**
+ * Detect whether the renderer is hidden. This happens when one of the parent elements
+ * has display: none
+ */
+isHidden: function () {
+        return !this.box.offsetWidth;
+},
+
+/**
+ * Define a clipping rectangle. In VML it is accomplished by storing the values
+ * for setting the CSS style to all associated members.
+ *
+ * @param {Number} x
+ * @param {Number} y
+ * @param {Number} width
+ * @param {Number} height
+ */
+clipRect: function (x, y, width, height) {
+
+        // create a dummy element
+        var clipRect = this.createElement(),
+                isObj = isObject(x);
+
+        // mimic a rectangle with its style object for automatic updating in attr
+        return extend(clipRect, {
+                members: [],
+                left: (isObj ? x.x : x) + 1,
+                top: (isObj ? x.y : y) + 1,
+                width: (isObj ? x.width : width) - 1,
+                height: (isObj ? x.height : height) - 1,
+                getCSS: function (wrapper) {
+                        var element = wrapper.element,
+                                nodeName = element.nodeName,
+                                isShape = nodeName === 'shape',
+                                inverted = wrapper.inverted,
+                                rect = this,
+                                top = rect.top - (isShape ? element.offsetTop : 0),
+                                left = rect.left,
+                                right = left + rect.width,
+                                bottom = top + rect.height,
+                                ret = {
+                                        clip: 'rect(' +
+                                                mathRound(inverted ? left : top) + 'px,' +
+                                                mathRound(inverted ? bottom : right) + 'px,' +
+                                                mathRound(inverted ? right : bottom) + 'px,' +
+                                                mathRound(inverted ? top : left) + 'px)'
+                                };
+
+                        // issue 74 workaround
+                        if (!inverted && docMode8 && nodeName === 'DIV') {
+                                extend(ret, {
+                                        width: right + PX,
+                                        height: bottom + PX
+                                });
+                        }
+                        return ret;
+                },
+
+                // used in attr and animation to update the clipping of all members
+                updateClipping: function () {
+                        each(clipRect.members, function (member) {
+                                if (member.element) { // Deleted series, like in stock/members/series-remove demo. Should be removed from members, but this will do.
+                                        member.css(clipRect.getCSS(member));
+                                }
+                        });
+                }
+        });
+
+},
+
+/**
+ * Take a color and return it if it's a string, make it a gradient if it's a
+ * gradient configuration object, and apply opacity.
+ *
+ * @param {Object} color The color or config object
+ */
+color: function (color, elem, prop, wrapper) {
+        var renderer = this,
+                colorObject,
+                regexRgba = /^rgba/,
+                markup,
+                fillType,
+                ret = NONE;
+
+        // Check for linear or radial gradient
+        if (color && color.linearGradient) {
+                fillType = 'gradient';
+        } else if (color && color.radialGradient) {
+                fillType = 'pattern';
+        }
+
+        if (fillType) {
+
+                var stopColor,
+                        stopOpacity,
+                        gradient = color.linearGradient || color.radialGradient,
+                        x1,
+                        y1,
+                        x2,
+                        y2,
+                        opacity1,
+                        opacity2,
+                        color1,
+                        color2,
+                        fillAttr = '',
+                        stops = color.stops,
+                        firstStop,
+                        lastStop,
+                        colors = [],
+                        addFillNode = function () {
+                                // Add the fill subnode. When colors attribute is used, the meanings of opacity and o:opacity2
+                                // are reversed.
+                                markup = ['<fill colors="' + colors.join(',') + '" opacity="', opacity2, '" o:opacity2="', opacity1,
+                                        '" type="', fillType, '" ', fillAttr, 'focus="100%" method="any" />'];
+                                createElement(renderer.prepVML(markup), null, null, elem);
+                        };
+
+                // Extend from 0 to 1
+                firstStop = stops[0];
+                lastStop = stops[stops.length - 1];
+                if (firstStop[0] > 0) {
+                        stops.unshift([
+                                0,
+                                firstStop[1]
+                        ]);
+                }
+                if (lastStop[0] < 1) {
+                        stops.push([
+                                1,
+                                lastStop[1]
+                        ]);
+                }
+
+                // Compute the stops
+                each(stops, function (stop, i) {
+                        if (regexRgba.test(stop[1])) {
+                                colorObject = Color(stop[1]);
+                                stopColor = colorObject.get('rgb');
+                                stopOpacity = colorObject.get('a');
+                        } else {
+                                stopColor = stop[1];
+                                stopOpacity = 1;
+                        }
+
+                        // Build the color attribute
+                        colors.push((stop[0] * 100) + '% ' + stopColor);
+
+                        // Only start and end opacities are allowed, so we use the first and the last
+                        if (!i) {
+                                opacity1 = stopOpacity;
+                                color2 = stopColor;
+                        } else {
+                                opacity2 = stopOpacity;
+                                color1 = stopColor;
+                        }
+                });
+
+                // Apply the gradient to fills only.
+                if (prop === 'fill') {
+
+                        // Handle linear gradient angle
+                        if (fillType === 'gradient') {
+                                x1 = gradient.x1 || gradient[0] || 0;
+                                y1 = gradient.y1 || gradient[1] || 0;
+                                x2 = gradient.x2 || gradient[2] || 0;
+                                y2 = gradient.y2 || gradient[3] || 0;
+                                fillAttr = 'angle="' + (90  - math.atan(
+                                        (y2 - y1) / // y vector
+                                        (x2 - x1) // x vector
+                                        ) * 180 / mathPI) + '"';
+
+                                addFillNode();
+
+                        // Radial (circular) gradient
+                        } else {
+
+                                var r = gradient.r,
+                                        sizex = r * 2,
+                                        sizey = r * 2,
+                                        cx = gradient.cx,
+                                        cy = gradient.cy,
+                                        radialReference = elem.radialReference,
+                                        bBox,
+                                        applyRadialGradient = function () {
+                                                if (radialReference) {
+                                                        bBox = wrapper.getBBox();
+                                                        cx += (radialReference[0] - bBox.x) / bBox.width - 0.5;
+                                                        cy += (radialReference[1] - bBox.y) / bBox.height - 0.5;
+                                                        sizex *= radialReference[2] / bBox.width;
+                                                        sizey *= radialReference[2] / bBox.height;
+                                                }
+                                                fillAttr = 'src="' + defaultOptions.global.VMLRadialGradientURL + '" ' +
+                                                        'size="' + sizex + ',' + sizey + '" ' +
+                                                        'origin="0.5,0.5" ' +
+                                                        'position="' + cx + ',' + cy + '" ' +
+                                                        'color2="' + color2 + '" ';
+
+                                                addFillNode();
+                                        };
+
+                                // Apply radial gradient
+                                if (wrapper.added) {
+                                        applyRadialGradient();
+                                } else {
+                                        // We need to know the bounding box to get the size and position right
+                                        wrapper.onAdd = applyRadialGradient;
+                                }
+
+                                // The fill element's color attribute is broken in IE8 standards mode, so we
+                                // need to set the parent shape's fillcolor attribute instead.
+                                ret = color1;
+                        }
+
+                // Gradients are not supported for VML stroke, return the first color. #722.
+                } else {
+                        ret = stopColor;
+                }
+
+        // if the color is an rgba color, split it and add a fill node
+        // to hold the opacity component
+        } else if (regexRgba.test(color) && elem.tagName !== 'IMG') {
+
+                colorObject = Color(color);
+
+                markup = ['<', prop, ' opacity="', colorObject.get('a'), '"/>'];
+                createElement(this.prepVML(markup), null, null, elem);
+
+                ret = colorObject.get('rgb');
+
+        } else {
+                var propNodes = elem.getElementsByTagName(prop); // 'stroke' or 'fill' node
+                if (propNodes.length) {
+                        propNodes[0].opacity = 1;
+                        propNodes[0].type = 'solid';
+                }
+                ret = color;
+        }
+
+        return ret;
+},
+
+/**
+ * Take a VML string and prepare it for either IE8 or IE6/IE7.
+ * @param {Array} markup A string array of the VML markup to prepare
+ */
+prepVML: function (markup) {
+        var vmlStyle = 'display:inline-block;behavior:url(#default#VML);',
+                isIE8 = this.isIE8;
+
+        markup = markup.join('');
+
+        if (isIE8) { // add xmlns and style inline
+                markup = markup.replace('/>', ' xmlns="urn:schemas-microsoft-com:vml" />');
+                if (markup.indexOf('style="') === -1) {
+                        markup = markup.replace('/>', ' style="' + vmlStyle + '" />');
+                } else {
+                        markup = markup.replace('style="', 'style="' + vmlStyle);
+                }
+
+        } else { // add namespace
+                markup = markup.replace('<', '<hcv:');
+        }
+
+        return markup;
+},
+
+/**
+ * Create rotated and aligned text
+ * @param {String} str
+ * @param {Number} x
+ * @param {Number} y
+ */
+text: SVGRenderer.prototype.html,
+
+/**
+ * Create and return a path element
+ * @param {Array} path
+ */
+path: function (path) {
+        var attr = {
+                // subpixel precision down to 0.1 (width and height = 1px)
+                coordsize: '10 10'
+        };
+        if (isArray(path)) {
+                attr.d = path;
+        } else if (isObject(path)) { // attributes
+                extend(attr, path);
+        }
+        // create the shape
+        return this.createElement('shape').attr(attr);
+},
+
+/**
+ * Create and return a circle element. In VML circles are implemented as
+ * shapes, which is faster than v:oval
+ * @param {Number} x
+ * @param {Number} y
+ * @param {Number} r
+ */
+circle: function (x, y, r) {
+        var circle = this.symbol('circle');
+        if (isObject(x)) {
+                r = x.r;
+                y = x.y;
+                x = x.x;
+        }
+        circle.isCircle = true; // Causes x and y to mean center (#1682)
+        circle.r = r;
+        return circle.attr({ x: x, y: y });
+},
+
+/**
+ * Create a group using an outer div and an inner v:group to allow rotating
+ * and flipping. A simple v:group would have problems with positioning
+ * child HTML elements and CSS clip.
+ *
+ * @param {String} name The name of the group
+ */
+g: function (name) {
+        var wrapper,
+                attribs;
+
+        // set the class name
+        if (name) {
+                attribs = { 'className': PREFIX + name, 'class': PREFIX + name };
+        }
+
+        // the div to hold HTML and clipping
+        wrapper = this.createElement(DIV).attr(attribs);
+
+        return wrapper;
+},
+
+/**
+ * VML override to create a regular HTML image
+ * @param {String} src
+ * @param {Number} x
+ * @param {Number} y
+ * @param {Number} width
+ * @param {Number} height
+ */
+image: function (src, x, y, width, height) {
+        var obj = this.createElement('img')
+                .attr({ src: src });
+
+        if (arguments.length > 1) {
+                obj.attr({
+                        x: x,
+                        y: y,
+                        width: width,
+                        height: height
+                });
+        }
+        return obj;
+},
+
+/**
+ * For rectangles, VML uses a shape for rect to overcome bugs and rotation problems
+ */
+createElement: function (nodeName) {
+        return nodeName === 'rect' ? this.symbol(nodeName) : SVGRenderer.prototype.createElement.call(this, nodeName);  
+},
+
+/**
+ * In the VML renderer, each child of an inverted div (group) is inverted
+ * @param {Object} element
+ * @param {Object} parentNode
+ */
+invertChild: function (element, parentNode) {
+        var ren = this,
+                parentStyle = parentNode.style,
+                imgStyle = element.tagName === 'IMG' && element.style; // #1111
+
+        css(element, {
+                flip: 'x',
+                left: pInt(parentStyle.width) - (imgStyle ? pInt(imgStyle.top) : 1),
+                top: pInt(parentStyle.height) - (imgStyle ? pInt(imgStyle.left) : 1),
+                rotation: -90
+        });
+
+        // Recursively invert child elements, needed for nested composite shapes like box plots and error bars. #1680, #1806.
+        each(element.childNodes, function (child) {
+                ren.invertChild(child, element);
+        });
+},
+
+/**
+ * Symbol definitions that override the parent SVG renderer's symbols
+ *
+ */
+symbols: {
+        // VML specific arc function
+        arc: function (x, y, w, h, options) {
+                var start = options.start,
+                        end = options.end,
+                        radius = options.r || w || h,
+                        innerRadius = options.innerR,
+                        cosStart = mathCos(start),
+                        sinStart = mathSin(start),
+                        cosEnd = mathCos(end),
+                        sinEnd = mathSin(end),
+                        ret;
+
+                if (end - start === 0) { // no angle, don't show it.
+                        return ['x'];
+                }
+
+                ret = [
+                        'wa', // clockwise arc to
+                        x - radius, // left
+                        y - radius, // top
+                        x + radius, // right
+                        y + radius, // bottom
+                        x + radius * cosStart, // start x
+                        y + radius * sinStart, // start y
+                        x + radius * cosEnd, // end x
+                        y + radius * sinEnd  // end y
+                ];
+
+                if (options.open && !innerRadius) {
+                        ret.push(
+                                'e',
+                                M,
+                                x,// - innerRadius,
+                                y// - innerRadius
+                        );
+                }
+
+                ret.push(
+                        'at', // anti clockwise arc to
+                        x - innerRadius, // left
+                        y - innerRadius, // top
+                        x + innerRadius, // right
+                        y + innerRadius, // bottom
+                        x + innerRadius * cosEnd, // start x
+                        y + innerRadius * sinEnd, // start y
+                        x + innerRadius * cosStart, // end x
+                        y + innerRadius * sinStart, // end y
+                        'x', // finish path
+                        'e' // close
+                );
+
+                ret.isArc = true;
+                return ret;
+
+        },
+        // Add circle symbol path. This performs significantly faster than v:oval.
+        circle: function (x, y, w, h, wrapper) {
+
+                if (wrapper) {
+                        w = h = 2 * wrapper.r;
+                }
+
+                // Center correction, #1682
+                if (wrapper && wrapper.isCircle) {
+                        x -= w / 2;
+                        y -= h / 2;
+                }
+
+                // Return the path
+                return [
+                        'wa', // clockwisearcto
+                        x, // left
+                        y, // top
+                        x + w, // right
+                        y + h, // bottom
+                        x + w, // start x
+                        y + h / 2,     // start y
+                        x + w, // end x
+                        y + h / 2,     // end y
+                        //'x', // finish path
+                        'e' // close
+                ];
+        },
+        /**
+         * Add rectangle symbol path which eases rotation and omits arcsize problems
+         * compared to the built-in VML roundrect shape. When borders are not rounded,
+         * use the simpler square path, else use the callout path without the arrow.
+         */
+        rect: function (x, y, w, h, options) {
+                return SVGRenderer.prototype.symbols[
+                        !defined(options) || !options.r ? 'square' : 'callout'
+                ].call(0, x, y, w, h, options);
+        }
+}
+ +

}; Highcharts.VMLRenderer = VMLRenderer = function () {

+ +
this.init.apply(this, arguments);
+
+ +

}; VMLRenderer.prototype = merge(SVGRenderer.prototype, VMLRendererExtension);

+ +
// general renderer
+Renderer = VMLRenderer;
+ +

}

+ +

// This method is used with exporting in old IE, when emulating SVG (see #2314) SVGRenderer.prototype.measureSpanWidth = function (text, styles) {

+ +
var measuringSpan = doc.createElement('span'),
+        offsetWidth,
+textNode = doc.createTextNode(text);
+
+measuringSpan.appendChild(textNode);
+css(measuringSpan, styles);
+this.box.appendChild(measuringSpan);
+offsetWidth = measuringSpan.offsetWidth;
+discardElement(measuringSpan); // #2463
+return offsetWidth;
+
+ +

};

+ +

/* ****************************************************************************

+ +
*                                                                            *
+* END OF INTERNET EXPLORER <= 8 SPECIFIC CODE                                *
+*                                                                            *
+*****************************************************************************/
+ +

/* ****************************************************************************

+ +
*                                                                            *
+* START OF ANDROID < 3 SPECIFIC CODE. THIS CAN BE REMOVED IF YOU'RE NOT      *
+* TARGETING THAT SYSTEM.                                                     *
+*                                                                            *
+*****************************************************************************/
+ +

var CanVGRenderer,

+ +
CanVGController;
+
+ +

if (useCanVG) {

+ +
/**
+ * The CanVGRenderer is empty from start to keep the source footprint small.
+ * When requested, the CanVGController downloads the rest of the source packaged
+ * together with the canvg library.
+ */
+Highcharts.CanVGRenderer = CanVGRenderer = function () {
+        // Override the global SVG namespace to fake SVG/HTML that accepts CSS
+        SVG_NS = 'http://www.w3.org/1999/xhtml';
+};
+
+/**
+ * Start with an empty symbols object. This is needed when exporting is used (exporting.src.js will add a few symbols), but 
+ * the implementation from SvgRenderer will not be merged in until first render.
+ */
+CanVGRenderer.prototype.symbols = {};
+
+/**
+ * Handles on demand download of canvg rendering support.
+ */
+CanVGController = (function () {
+        // List of renderering calls
+        var deferredRenderCalls = [];
+
+        /**
+         * When downloaded, we are ready to draw deferred charts.
+         */
+        function drawDeferred() {
+                var callLength = deferredRenderCalls.length,
+                        callIndex;
+
+                // Draw all pending render calls
+                for (callIndex = 0; callIndex < callLength; callIndex++) {
+                        deferredRenderCalls[callIndex]();
+                }
+                // Clear the list
+                deferredRenderCalls = [];
+        }
+
+        return {
+                push: function (func, scriptLocation) {
+                        // Only get the script once
+                        if (deferredRenderCalls.length === 0) {
+                                getScript(scriptLocation, drawDeferred);
+                        }
+                        // Register render call
+                        deferredRenderCalls.push(func);
+                }
+        };
+}());
+
+Renderer = CanVGRenderer;
+ +

} // end CanVGRenderer

+ +

/* ****************************************************************************

+ +
*                                                                            *
+* END OF ANDROID < 3 SPECIFIC CODE                                           *
+*                                                                            *
+*****************************************************************************/
+ +

/**

+ +
* The Tick class
+*/
+ +

function Tick(axis, pos, type, noLabel) {

+ +
this.axis = axis;
+this.pos = pos;
+this.type = type || '';
+this.isNew = true;
+
+if (!type && !noLabel) {
+        this.addLabel();
+}
+ +

}

+ +

Tick.prototype = {

+ +
/**
+ * Write the tick label
+ */
+addLabel: function () {
+        var tick = this,
+                axis = tick.axis,
+                options = axis.options,
+                chart = axis.chart,
+                horiz = axis.horiz,
+                categories = axis.categories,
+                names = axis.names,
+                pos = tick.pos,
+                labelOptions = options.labels,
+                str,
+                tickPositions = axis.tickPositions,
+                width = (horiz && categories &&
+                        !labelOptions.step && !labelOptions.staggerLines &&
+                        !labelOptions.rotation &&
+                        chart.plotWidth / tickPositions.length) ||
+                        (!horiz && (chart.margin[3] || chart.chartWidth * 0.33)), // #1580, #1931
+                isFirst = pos === tickPositions[0],
+                isLast = pos === tickPositions[tickPositions.length - 1],
+                css,
+                attr,
+                value = categories ?
+                        pick(categories[pos], names[pos], pos) :
+                        pos,
+                label = tick.label,
+                tickPositionInfo = tickPositions.info,
+                dateTimeLabelFormat;
+
+        // Set the datetime label format. If a higher rank is set for this position, use that. If not,
+        // use the general format.
+        if (axis.isDatetimeAxis && tickPositionInfo) {
+                dateTimeLabelFormat = options.dateTimeLabelFormats[tickPositionInfo.higherRanks[pos] || tickPositionInfo.unitName];
+        }
+        // set properties for access in render method
+        tick.isFirst = isFirst;
+        tick.isLast = isLast;
+
+        // get the string
+        str = axis.labelFormatter.call({
+                axis: axis,
+                chart: chart,
+                isFirst: isFirst,
+                isLast: isLast,
+                dateTimeLabelFormat: dateTimeLabelFormat,
+                value: axis.isLog ? correctFloat(lin2log(value)) : value
+        });
+
+        // prepare CSS
+        css = width && { width: mathMax(1, mathRound(width - 2 * (labelOptions.padding || 10))) + PX };
+        css = extend(css, labelOptions.style);
+
+        // first call
+        if (!defined(label)) {
+                attr = {
+                        align: axis.labelAlign
+                };
+                if (isNumber(labelOptions.rotation)) {
+                        attr.rotation = labelOptions.rotation;
+                }
+                if (width && labelOptions.ellipsis) {
+                        attr._clipHeight = axis.len / tickPositions.length;
+                }
+
+                tick.label =
+                        defined(str) && labelOptions.enabled ?
+                                chart.renderer.text(
+                                                str,
+                                                0,
+                                                0,
+                                                labelOptions.useHTML
+                                        )
+                                        .attr(attr)
+                                        // without position absolute, IE export sometimes is wrong
+                                        .css(css)
+                                        .add(axis.labelGroup) :
+                                null;
+
+        // update
+        } else if (label) {
+                label.attr({
+                                text: str
+                        })
+                        .css(css);
+        }
+},
+
+/**
+ * Get the offset height or width of the label
+ */
+getLabelSize: function () {
+        var label = this.label,
+                axis = this.axis;
+        return label ?
+                label.getBBox()[axis.horiz ? 'height' : 'width'] :
+                0;
+},
+
+/**
+ * Find how far the labels extend to the right and left of the tick's x position. Used for anti-collision
+ * detection with overflow logic.
+ */
+getLabelSides: function () {
+        var bBox = this.label.getBBox(),
+                axis = this.axis,
+                horiz = axis.horiz,
+                options = axis.options,
+                labelOptions = options.labels,
+                size = horiz ? bBox.width : bBox.height,
+                leftSide = horiz ?
+                        labelOptions.x - size * { left: 0, center: 0.5, right: 1 }[axis.labelAlign] :
+                        0,
+                rightSide = horiz ?
+                        size + leftSide :
+                        size;
+
+        return [leftSide, rightSide];
+},
+
+/**
+ * Handle the label overflow by adjusting the labels to the left and right edge, or
+ * hide them if they collide into the neighbour label.
+ */
+handleOverflow: function (index, xy) {
+        var show = true,
+                axis = this.axis,
+                isFirst = this.isFirst,
+                isLast = this.isLast,
+                horiz = axis.horiz,
+                pxPos = horiz ? xy.x : xy.y,
+                reversed = axis.reversed,
+                tickPositions = axis.tickPositions,
+                sides = this.getLabelSides(),
+                leftSide = sides[0],
+                rightSide = sides[1],
+                axisLeft,
+                axisRight,
+                neighbour,
+                neighbourEdge,
+                line = this.label.line || 0,
+                labelEdge = axis.labelEdge,
+                justifyLabel = axis.justifyLabels && (isFirst || isLast),
+                justifyToPlot;
+
+        // Hide it if it now overlaps the neighbour label
+        if (labelEdge[line] === UNDEFINED || pxPos + leftSide > labelEdge[line]) {
+                labelEdge[line] = pxPos + rightSide;
+
+        } else if (!justifyLabel) {
+                show = false;
+        }
+
+        if (justifyLabel) {
+                justifyToPlot = axis.justifyToPlot;
+                axisLeft = justifyToPlot ? axis.pos : 0;
+                axisRight = justifyToPlot ? axisLeft + axis.len : axis.chart.chartWidth;
+
+                // Find the firsth neighbour on the same line
+                do {
+                        index += (isFirst ? 1 : -1);
+                        neighbour = axis.ticks[tickPositions[index]];
+                } while (tickPositions[index] && (!neighbour || neighbour.label.line !== line));
+
+                neighbourEdge = neighbour && neighbour.label.xy && neighbour.label.xy.x + neighbour.getLabelSides()[isFirst ? 0 : 1];
+
+                if ((isFirst && !reversed) || (isLast && reversed)) {
+                        // Is the label spilling out to the left of the plot area?
+                        if (pxPos + leftSide < axisLeft) {
+
+                                // Align it to plot left
+                                pxPos = axisLeft - leftSide;
+
+                                // Hide it if it now overlaps the neighbour label
+                                if (neighbour && pxPos + rightSide > neighbourEdge) {
+                                        show = false;
+                                }
+                        }
+
+                } else {
+                        // Is the label spilling out to the right of the plot area?
+                        if (pxPos + rightSide > axisRight) {
+
+                                // Align it to plot right
+                                pxPos = axisRight - rightSide;
+
+                                // Hide it if it now overlaps the neighbour label
+                                if (neighbour && pxPos + leftSide < neighbourEdge) {
+                                        show = false;
+                                }
+
+                        }
+                }
+
+                // Set the modified x position of the label
+                xy.x = pxPos;
+        }
+        return show;
+},
+
+/**
+ * Get the x and y position for ticks and labels
+ */
+getPosition: function (horiz, pos, tickmarkOffset, old) {
+        var axis = this.axis,
+                chart = axis.chart,
+                cHeight = (old && chart.oldChartHeight) || chart.chartHeight;
+
+        return {
+                x: horiz ?
+                        axis.translate(pos + tickmarkOffset, null, null, old) + axis.transB :
+                        axis.left + axis.offset + (axis.opposite ? ((old && chart.oldChartWidth) || chart.chartWidth) - axis.right - axis.left : 0),
+
+                y: horiz ?
+                        cHeight - axis.bottom + axis.offset - (axis.opposite ? axis.height : 0) :
+                        cHeight - axis.translate(pos + tickmarkOffset, null, null, old) - axis.transB
+        };
+
+},
+
+/**
+ * Get the x, y position of the tick label
+ */
+getLabelPosition: function (x, y, label, horiz, labelOptions, tickmarkOffset, index, step) {
+        var axis = this.axis,
+                transA = axis.transA,
+                reversed = axis.reversed,
+                staggerLines = axis.staggerLines,
+                baseline = axis.chart.renderer.fontMetrics(labelOptions.style.fontSize).b,
+                rotation = labelOptions.rotation;
+
+        x = x + labelOptions.x - (tickmarkOffset && horiz ?
+                tickmarkOffset * transA * (reversed ? -1 : 1) : 0);
+        y = y + labelOptions.y - (tickmarkOffset && !horiz ?
+                tickmarkOffset * transA * (reversed ? 1 : -1) : 0);
+
+        // Correct for rotation (#1764)
+        if (rotation && axis.side === 2) {
+                y -= baseline - baseline * mathCos(rotation * deg2rad);
+        }
+
+        // Vertically centered
+        if (!defined(labelOptions.y) && !rotation) { // #1951
+                y += baseline - label.getBBox().height / 2;
+        }
+
+        // Correct for staggered labels
+        if (staggerLines) {
+                label.line = (index / (step || 1) % staggerLines);
+                y += label.line * (axis.labelOffset / staggerLines);
+        }
+
+        return {
+                x: x,
+                y: y
+        };
+},
+
+/**
+ * Extendible method to return the path of the marker
+ */
+getMarkPath: function (x, y, tickLength, tickWidth, horiz, renderer) {
+        return renderer.crispLine([
+                        M,
+                        x,
+                        y,
+                        L,
+                        x + (horiz ? 0 : -tickLength),
+                        y + (horiz ? tickLength : 0)
+                ], tickWidth);
+},
+
+/**
+ * Put everything in place
+ *
+ * @param index {Number}
+ * @param old {Boolean} Use old coordinates to prepare an animation into new position
+ */
+render: function (index, old, opacity) {
+        var tick = this,
+                axis = tick.axis,
+                options = axis.options,
+                chart = axis.chart,
+                renderer = chart.renderer,
+                horiz = axis.horiz,
+                type = tick.type,
+                label = tick.label,
+                pos = tick.pos,
+                labelOptions = options.labels,
+                gridLine = tick.gridLine,
+                gridPrefix = type ? type + 'Grid' : 'grid',
+                tickPrefix = type ? type + 'Tick' : 'tick',
+                gridLineWidth = options[gridPrefix + 'LineWidth'],
+                gridLineColor = options[gridPrefix + 'LineColor'],
+                dashStyle = options[gridPrefix + 'LineDashStyle'],
+                tickLength = options[tickPrefix + 'Length'],
+                tickWidth = options[tickPrefix + 'Width'] || 0,
+                tickColor = options[tickPrefix + 'Color'],
+                tickPosition = options[tickPrefix + 'Position'],
+                gridLinePath,
+                mark = tick.mark,
+                markPath,
+                step = labelOptions.step,
+                attribs,
+                show = true,
+                tickmarkOffset = axis.tickmarkOffset,
+                xy = tick.getPosition(horiz, pos, tickmarkOffset, old),
+                x = xy.x,
+                y = xy.y,
+                reverseCrisp = ((horiz && x === axis.pos + axis.len) || (!horiz && y === axis.pos)) ? -1 : 1; // #1480, #1687
+
+        this.isActive = true;
+
+        // create the grid line
+        if (gridLineWidth) {
+                gridLinePath = axis.getPlotLinePath(pos + tickmarkOffset, gridLineWidth * reverseCrisp, old, true);
+
+                if (gridLine === UNDEFINED) {
+                        attribs = {
+                                stroke: gridLineColor,
+                                'stroke-width': gridLineWidth
+                        };
+                        if (dashStyle) {
+                                attribs.dashstyle = dashStyle;
+                        }
+                        if (!type) {
+                                attribs.zIndex = 1;
+                        }
+                        if (old) {
+                                attribs.opacity = 0;
+                        }
+                        tick.gridLine = gridLine =
+                                gridLineWidth ?
+                                        renderer.path(gridLinePath)
+                                                .attr(attribs).add(axis.gridGroup) :
+                                        null;
+                }
+
+                // If the parameter 'old' is set, the current call will be followed
+                // by another call, therefore do not do any animations this time
+                if (!old && gridLine && gridLinePath) {
+                        gridLine[tick.isNew ? 'attr' : 'animate']({
+                                d: gridLinePath,
+                                opacity: opacity
+                        });
+                }
+        }
+
+        // create the tick mark
+        if (tickWidth && tickLength) {
+
+                // negate the length
+                if (tickPosition === 'inside') {
+                        tickLength = -tickLength;
+                }
+                if (axis.opposite) {
+                        tickLength = -tickLength;
+                }
+
+                markPath = tick.getMarkPath(x, y, tickLength, tickWidth * reverseCrisp, horiz, renderer);
+                if (mark) { // updating
+                        mark.animate({
+                                d: markPath,
+                                opacity: opacity
+                        });
+                } else { // first time
+                        tick.mark = renderer.path(
+                                markPath
+                        ).attr({
+                                stroke: tickColor,
+                                'stroke-width': tickWidth,
+                                opacity: opacity
+                        }).add(axis.axisGroup);
+                }
+        }
+
+        // the label is created on init - now move it into place
+        if (label && !isNaN(x)) {
+                label.xy = xy = tick.getLabelPosition(x, y, label, horiz, labelOptions, tickmarkOffset, index, step);
+
+                // Apply show first and show last. If the tick is both first and last, it is
+                // a single centered tick, in which case we show the label anyway (#2100).
+                if ((tick.isFirst && !tick.isLast && !pick(options.showFirstLabel, 1)) ||
+                                (tick.isLast && !tick.isFirst && !pick(options.showLastLabel, 1))) {
+                        show = false;
+
+                // Handle label overflow and show or hide accordingly
+                } else if (!axis.isRadial && !labelOptions.step && !labelOptions.rotation && !old && opacity !== 0) {
+                        show = tick.handleOverflow(index, xy);
+                }
+
+                // apply step
+                if (step && index % step) {
+                        // show those indices dividable by step
+                        show = false;
+                }
+
+                // Set the new position, and show or hide
+                if (show && !isNaN(xy.y)) {
+                        xy.opacity = opacity;
+                        label[tick.isNew ? 'attr' : 'animate'](xy);
+                        tick.isNew = false;
+                } else {
+                        label.attr('y', -9999); // #1338
+                }
+        }
+},
+
+/**
+ * Destructor for the tick prototype
+ */
+destroy: function () {
+        destroyObjectProperties(this, this.axis);
+}
+ +

};

+ +

/**

+ +
* The object wrapper for plot lines and plot bands
+* @param {Object} options
+*/
+ +

Highcharts.PlotLineOrBand = function (axis, options) {

+ +
this.axis = axis;
+
+if (options) {
+        this.options = options;
+        this.id = options.id;
+}
+ +

};

+ +

Highcharts.PlotLineOrBand.prototype = {

+ +
/**
+ * Render the plot line or plot band. If it is already existing,
+ * move it.
+ */
+render: function () {
+        var plotLine = this,
+                axis = plotLine.axis,
+                horiz = axis.horiz,
+                halfPointRange = (axis.pointRange || 0) / 2,
+                options = plotLine.options,
+                optionsLabel = options.label,
+                label = plotLine.label,
+                width = options.width,
+                to = options.to,
+                from = options.from,
+                isBand = defined(from) && defined(to),
+                value = options.value,
+                dashStyle = options.dashStyle,
+                svgElem = plotLine.svgElem,
+                path = [],
+                addEvent,
+                eventType,
+                xs,
+                ys,
+                x,
+                y,
+                color = options.color,
+                zIndex = options.zIndex,
+                events = options.events,
+                attribs = {},
+                renderer = axis.chart.renderer;
+
+        // logarithmic conversion
+        if (axis.isLog) {
+                from = log2lin(from);
+                to = log2lin(to);
+                value = log2lin(value);
+        }
+
+        // plot line
+        if (width) {
+                path = axis.getPlotLinePath(value, width);
+                attribs = {
+                        stroke: color,
+                        'stroke-width': width
+                };
+                if (dashStyle) {
+                        attribs.dashstyle = dashStyle;
+                }
+        } else if (isBand) { // plot band
+
+                // keep within plot area
+                from = mathMax(from, axis.min - halfPointRange);
+                to = mathMin(to, axis.max + halfPointRange);
+
+                path = axis.getPlotBandPath(from, to, options);
+                if (color) {
+                        attribs.fill = color;
+                }
+                if (options.borderWidth) {
+                        attribs.stroke = options.borderColor;
+                        attribs['stroke-width'] = options.borderWidth;
+                }
+        } else {
+                return;
+        }
+        // zIndex
+        if (defined(zIndex)) {
+                attribs.zIndex = zIndex;
+        }
+
+        // common for lines and bands
+        if (svgElem) {
+                if (path) {
+                        svgElem.animate({
+                                d: path
+                        }, null, svgElem.onGetPath);
+                } else {
+                        svgElem.hide();
+                        svgElem.onGetPath = function () {
+                                svgElem.show();
+                        };
+                        if (label) {
+                                plotLine.label = label = label.destroy();
+                        }
+                }
+        } else if (path && path.length) {
+                plotLine.svgElem = svgElem = renderer.path(path)
+                        .attr(attribs).add();
+
+                // events
+                if (events) {
+                        addEvent = function (eventType) {
+                                svgElem.on(eventType, function (e) {
+                                        events[eventType].apply(plotLine, [e]);
+                                });
+                        };
+                        for (eventType in events) {
+                                addEvent(eventType);
+                        }
+                }
+        }
+
+        // the plot band/line label
+        if (optionsLabel && defined(optionsLabel.text) && path && path.length && axis.width > 0 && axis.height > 0) {
+                // apply defaults
+                optionsLabel = merge({
+                        align: horiz && isBand && 'center',
+                        x: horiz ? !isBand && 4 : 10,
+                        verticalAlign : !horiz && isBand && 'middle',
+                        y: horiz ? isBand ? 16 : 10 : isBand ? 6 : -4,
+                        rotation: horiz && !isBand && 90
+                }, optionsLabel);
+
+                // add the SVG element
+                if (!label) {
+                        attribs = {
+                                align: optionsLabel.textAlign || optionsLabel.align,
+                                rotation: optionsLabel.rotation
+                        };
+                        if (defined(zIndex)) {
+                                attribs.zIndex = zIndex;
+                        }
+                        plotLine.label = label = renderer.text(
+                                        optionsLabel.text,
+                                        0,
+                                        0,
+                                        optionsLabel.useHTML
+                                )
+                                .attr(attribs)
+                                .css(optionsLabel.style)
+                                .add();
+                }
+
+                // get the bounding box and align the label
+                xs = [path[1], path[4], pick(path[6], path[1])];
+                ys = [path[2], path[5], pick(path[7], path[2])];
+                x = arrayMin(xs);
+                y = arrayMin(ys);
+
+                label.align(optionsLabel, false, {
+                        x: x,
+                        y: y,
+                        width: arrayMax(xs) - x,
+                        height: arrayMax(ys) - y
+                });
+                label.show();
+
+        } else if (label) { // move out of sight
+                label.hide();
+        }
+
+        // chainable
+        return plotLine;
+},
+
+/**
+ * Remove the plot line or band
+ */
+destroy: function () {
+        // remove it from the lookup
+        erase(this.axis.plotLinesAndBands, this);
+
+        delete this.axis;
+        destroyObjectProperties(this);
+}
+ +

};

+ +

/**

+ +
* Object with members for extending the Axis prototype
+*/
+ +

AxisPlotLineOrBandExtension = {

+ +
/**
+ * Create the path for a plot band
+ */ 
+getPlotBandPath: function (from, to) {
+        var toPath = this.getPlotLinePath(to),
+                path = this.getPlotLinePath(from);
+
+        if (path && toPath) {
+                path.push(
+                        toPath[4],
+                        toPath[5],
+                        toPath[1],
+                        toPath[2]
+                );
+        } else { // outside the axis area
+                path = null;
+        }
+
+        return path;
+},
+
+addPlotBand: function (options) {
+        this.addPlotBandOrLine(options, 'plotBands');
+},
+
+addPlotLine: function (options) {
+                this.addPlotBandOrLine(options, 'plotLines');
+},
+
+/**
+ * Add a plot band or plot line after render time
+ *
+ * @param options {Object} The plotBand or plotLine configuration object
+ */
+addPlotBandOrLine: function (options, coll) {
+        var obj = new Highcharts.PlotLineOrBand(this, options).render(),
+                userOptions = this.userOptions;
+
+        if (obj) { // #2189
+                // Add it to the user options for exporting and Axis.update
+                if (coll) {
+                        userOptions[coll] = userOptions[coll] || [];
+                        userOptions[coll].push(options); 
+                }
+                this.plotLinesAndBands.push(obj); 
+        }
+
+        return obj;
+},
+
+/**
+ * Remove a plot band or plot line from the chart by id
+ * @param {Object} id
+ */
+removePlotBandOrLine: function (id) {
+        var plotLinesAndBands = this.plotLinesAndBands,
+                options = this.options,
+                userOptions = this.userOptions,
+                i = plotLinesAndBands.length;
+        while (i--) {
+                if (plotLinesAndBands[i].id === id) {
+                        plotLinesAndBands[i].destroy();
+                }
+        }
+        each([options.plotLines || [], userOptions.plotLines || [], options.plotBands || [], userOptions.plotBands || []], function (arr) {
+                i = arr.length;
+                while (i--) {
+                        if (arr[i].id === id) {
+                                erase(arr, arr[i]);
+                        }
+                }
+        });
+}
+ +

};

+ +

/**

+ +
* Create a new axis object
+* @param {Object} chart
+* @param {Object} options
+*/
+ +

function Axis() {

+ +
this.init.apply(this, arguments);
+
+ +

}

+ +

Axis.prototype = {

+ +
/**
+ * Default options for the X axis - the Y axis has extended defaults
+ */
+defaultOptions: {
+        // allowDecimals: null,
+        // alternateGridColor: null,
+        // categories: [],
+        dateTimeLabelFormats: {
+                millisecond: '%H:%M:%S.%L',
+                second: '%H:%M:%S',
+                minute: '%H:%M',
+                hour: '%H:%M',
+                day: '%e. %b',
+                week: '%e. %b',
+                month: '%b \'%y',
+                year: '%Y'
+        },
+        endOnTick: false,
+        gridLineColor: '#C0C0C0',
+        // gridLineDashStyle: 'solid',
+        // gridLineWidth: 0,
+        // reversed: false,
+
+        labels: defaultLabelOptions,
+                // { step: null },
+        lineColor: '#C0D0E0',
+        lineWidth: 1,
+        //linkedTo: null,
+        //max: undefined,
+        //min: undefined,
+        minPadding: 0.01,
+        maxPadding: 0.01,
+        //minRange: null,
+        minorGridLineColor: '#E0E0E0',
+        // minorGridLineDashStyle: null,
+        minorGridLineWidth: 1,
+        minorTickColor: '#A0A0A0',
+        //minorTickInterval: null,
+        minorTickLength: 2,
+        minorTickPosition: 'outside', // inside or outside
+        //minorTickWidth: 0,
+        //opposite: false,
+        //offset: 0,
+        //plotBands: [{
+        //      events: {},
+        //      zIndex: 1,
+        //      labels: { align, x, verticalAlign, y, style, rotation, textAlign }
+        //}],
+        //plotLines: [{
+        //      events: {}
+        //  dashStyle: {}
+        //      zIndex:
+        //      labels: { align, x, verticalAlign, y, style, rotation, textAlign }
+        //}],
+        //reversed: false,
+        // showFirstLabel: true,
+        // showLastLabel: true,
+        startOfWeek: 1,
+        startOnTick: false,
+        tickColor: '#C0D0E0',
+        //tickInterval: null,
+        tickLength: 10,
+        tickmarkPlacement: 'between', // on or between
+        tickPixelInterval: 100,
+        tickPosition: 'outside',
+        tickWidth: 1,
+        title: {
+                //text: null,
+                align: 'middle', // low, middle or high
+                //margin: 0 for horizontal, 10 for vertical axes,
+                //rotation: 0,
+                //side: 'outside',
+                style: {
+                        color: '#707070'
+                }
+                //x: 0,
+                //y: 0
+        },
+        type: 'linear' // linear, logarithmic or datetime
+},
+
+/**
+ * This options set extends the defaultOptions for Y axes
+ */
+defaultYAxisOptions: {
+        endOnTick: true,
+        gridLineWidth: 1,
+        tickPixelInterval: 72,
+        showLastLabel: true,
+        labels: {
+                x: -8,
+                y: 3
+        },
+        lineWidth: 0,
+        maxPadding: 0.05,
+        minPadding: 0.05,
+        startOnTick: true,
+        tickWidth: 0,
+        title: {
+                rotation: 270,
+                text: 'Values'
+        },
+        stackLabels: {
+                enabled: false,
+                //align: dynamic,
+                //y: dynamic,
+                //x: dynamic,
+                //verticalAlign: dynamic,
+                //textAlign: dynamic,
+                //rotation: 0,
+                formatter: function () {
+                        return numberFormat(this.total, -1);
+                },
+                style: defaultLabelOptions.style
+        }
+},
+
+/**
+ * These options extend the defaultOptions for left axes
+ */
+defaultLeftAxisOptions: {
+        labels: {
+                x: -15,
+                y: null
+        },
+        title: {
+                rotation: 270
+        }
+},
+
+/**
+ * These options extend the defaultOptions for right axes
+ */
+defaultRightAxisOptions: {
+        labels: {
+                x: 15,
+                y: null
+        },
+        title: {
+                rotation: 90
+        }
+},
+
+/**
+ * These options extend the defaultOptions for bottom axes
+ */
+defaultBottomAxisOptions: {
+        labels: {
+                x: 0,
+                y: 20
+                // overflow: undefined,
+                // staggerLines: null
+        },
+        title: {
+                rotation: 0
+        }
+},
+/**
+ * These options extend the defaultOptions for left axes
+ */
+defaultTopAxisOptions: {
+        labels: {
+                x: 0,
+                y: -15
+                // overflow: undefined
+                // staggerLines: null
+        },
+        title: {
+                rotation: 0
+        }
+},
+
+/**
+ * Initialize the axis
+ */
+init: function (chart, userOptions) {
+
+        var isXAxis = userOptions.isX,
+                axis = this;
+
+        // Flag, is the axis horizontal
+        axis.horiz = chart.inverted ? !isXAxis : isXAxis;
+
+        // Flag, isXAxis
+        axis.isXAxis = isXAxis;
+        axis.coll = isXAxis ? 'xAxis' : 'yAxis';
+
+        axis.opposite = userOptions.opposite; // needed in setOptions
+        axis.side = userOptions.side || (axis.horiz ?
+                        (axis.opposite ? 0 : 2) : // top : bottom
+                        (axis.opposite ? 1 : 3));  // right : left
+
+        axis.setOptions(userOptions);
+
+        var options = this.options,
+                type = options.type,
+                isDatetimeAxis = type === 'datetime';
+
+        axis.labelFormatter = options.labels.formatter || axis.defaultLabelFormatter; // can be overwritten by dynamic format
+
+        // Flag, stagger lines or not
+        axis.userOptions = userOptions;
+
+        //axis.axisTitleMargin = UNDEFINED,// = options.title.margin,
+        axis.minPixelPadding = 0;
+        //axis.ignoreMinPadding = UNDEFINED; // can be set to true by a column or bar series
+        //axis.ignoreMaxPadding = UNDEFINED;
+
+        axis.chart = chart;
+        axis.reversed = options.reversed;
+        axis.zoomEnabled = options.zoomEnabled !== false;
+
+        // Initial categories
+        axis.categories = options.categories || type === 'category';
+        axis.names = [];
+
+        // Elements
+        //axis.axisGroup = UNDEFINED;
+        //axis.gridGroup = UNDEFINED;
+        //axis.axisTitle = UNDEFINED;
+        //axis.axisLine = UNDEFINED;
+
+        // Shorthand types
+        axis.isLog = type === 'logarithmic';
+        axis.isDatetimeAxis = isDatetimeAxis;
+
+        // Flag, if axis is linked to another axis
+        axis.isLinked = defined(options.linkedTo);
+        // Linked axis.
+        //axis.linkedParent = UNDEFINED;
+
+        // Tick positions
+        //axis.tickPositions = UNDEFINED; // array containing predefined positions
+        // Tick intervals
+        //axis.tickInterval = UNDEFINED;
+        //axis.minorTickInterval = UNDEFINED;
+
+        axis.tickmarkOffset = (axis.categories && options.tickmarkPlacement === 'between') ? 0.5 : 0;
+
+        // Major ticks
+        axis.ticks = {};
+        axis.labelEdge = [];
+        // Minor ticks
+        axis.minorTicks = {};
+        //axis.tickAmount = UNDEFINED;
+
+        // List of plotLines/Bands
+        axis.plotLinesAndBands = [];
+
+        // Alternate bands
+        axis.alternateBands = {};
+
+        // Axis metrics
+        //axis.left = UNDEFINED;
+        //axis.top = UNDEFINED;
+        //axis.width = UNDEFINED;
+        //axis.height = UNDEFINED;
+        //axis.bottom = UNDEFINED;
+        //axis.right = UNDEFINED;
+        //axis.transA = UNDEFINED;
+        //axis.transB = UNDEFINED;
+        //axis.oldTransA = UNDEFINED;
+        axis.len = 0;
+        //axis.oldMin = UNDEFINED;
+        //axis.oldMax = UNDEFINED;
+        //axis.oldUserMin = UNDEFINED;
+        //axis.oldUserMax = UNDEFINED;
+        //axis.oldAxisLength = UNDEFINED;
+        axis.minRange = axis.userMinRange = options.minRange || options.maxZoom;
+        axis.range = options.range;
+        axis.offset = options.offset || 0;
+
+        // Dictionary for stacks
+        axis.stacks = {};
+        axis.oldStacks = {};
+
+        // Min and max in the data
+        //axis.dataMin = UNDEFINED,
+        //axis.dataMax = UNDEFINED,
+
+        // The axis range
+        axis.max = null;
+        axis.min = null;
+
+        // User set min and max
+        //axis.userMin = UNDEFINED,
+        //axis.userMax = UNDEFINED,
+
+        // Crosshair options
+        axis.crosshair = pick(options.crosshair, splat(chart.options.tooltip.crosshairs)[isXAxis ? 0 : 1], false);
+        // Run Axis
+
+        var eventType,
+                events = axis.options.events;
+
+        // Register
+        if (inArray(axis, chart.axes) === -1) { // don't add it again on Axis.update()
+                if (isXAxis && !this.isColorAxis) { // #2713
+                        chart.axes.splice(chart.xAxis.length, 0, axis);
+                } else {
+                        chart.axes.push(axis);
+                }
+
+                chart[axis.coll].push(axis);
+        }
+
+        axis.series = axis.series || []; // populated by Series
+
+        // inverted charts have reversed xAxes as default
+        if (chart.inverted && isXAxis && axis.reversed === UNDEFINED) {
+                axis.reversed = true;
+        }
+
+        axis.removePlotBand = axis.removePlotBandOrLine;
+        axis.removePlotLine = axis.removePlotBandOrLine;
+
+        // register event listeners
+        for (eventType in events) {
+                addEvent(axis, eventType, events[eventType]);
+        }
+
+        // extend logarithmic axis
+        if (axis.isLog) {
+                axis.val2lin = log2lin;
+                axis.lin2val = lin2log;
+        }
+},
+
+/**
+ * Merge and set options
+ */
+setOptions: function (userOptions) {
+        this.options = merge(
+                this.defaultOptions,
+                this.isXAxis ? {} : this.defaultYAxisOptions,
+                [this.defaultTopAxisOptions, this.defaultRightAxisOptions,
+                        this.defaultBottomAxisOptions, this.defaultLeftAxisOptions][this.side],
+                merge(
+                        defaultOptions[this.coll], // if set in setOptions (#1053)
+                        userOptions
+                )
+        );
+},
+
+/**
+ * The default label formatter. The context is a special config object for the label.
+ */
+defaultLabelFormatter: function () {
+        var axis = this.axis,
+                value = this.value,
+                categories = axis.categories,
+                dateTimeLabelFormat = this.dateTimeLabelFormat,
+                numericSymbols = defaultOptions.lang.numericSymbols,
+                i = numericSymbols && numericSymbols.length,
+                multi,
+                ret,
+                formatOption = axis.options.labels.format,
+
+                // make sure the same symbol is added for all labels on a linear axis
+                numericSymbolDetector = axis.isLog ? value : axis.tickInterval;
+
+        if (formatOption) {
+                ret = format(formatOption, this);
+
+        } else if (categories) {
+                ret = value;
+
+        } else if (dateTimeLabelFormat) { // datetime axis
+                ret = dateFormat(dateTimeLabelFormat, value);
+
+        } else if (i && numericSymbolDetector >= 1000) {
+                // Decide whether we should add a numeric symbol like k (thousands) or M (millions).
+                // If we are to enable this in tooltip or other places as well, we can move this
+                // logic to the numberFormatter and enable it by a parameter.
+                while (i-- && ret === UNDEFINED) {
+                        multi = Math.pow(1000, i + 1);
+                        if (numericSymbolDetector >= multi && numericSymbols[i] !== null) {
+                                ret = numberFormat(value / multi, -1) + numericSymbols[i];
+                        }
+                }
+        }
+
+        if (ret === UNDEFINED) {
+                if (mathAbs(value) >= 10000) { // add thousands separators
+                        ret = numberFormat(value, 0);
+
+                } else { // small numbers
+                        ret = numberFormat(value, -1, UNDEFINED, ''); // #2466
+                }
+        }
+
+        return ret;
+},
+
+/**
+ * Get the minimum and maximum for the series of each axis
+ */
+getSeriesExtremes: function () {
+        var axis = this,
+                chart = axis.chart;
+
+        axis.hasVisibleSeries = false;
+
+        // reset dataMin and dataMax in case we're redrawing
+        axis.dataMin = axis.dataMax = null;
+
+        if (axis.buildStacks) {
+                axis.buildStacks();
+        }
+
+        // loop through this axis' series
+        each(axis.series, function (series) {
+
+                if (series.visible || !chart.options.chart.ignoreHiddenSeries) {
+
+                        var seriesOptions = series.options,
+                                xData,
+                                threshold = seriesOptions.threshold,
+                                seriesDataMin,
+                                seriesDataMax;
+
+                        axis.hasVisibleSeries = true;
+
+                        // Validate threshold in logarithmic axes
+                        if (axis.isLog && threshold <= 0) {
+                                threshold = null;
+                        }
+
+                        // Get dataMin and dataMax for X axes
+                        if (axis.isXAxis) {
+                                xData = series.xData;
+                                if (xData.length) {
+                                        axis.dataMin = mathMin(pick(axis.dataMin, xData[0]), arrayMin(xData));
+                                        axis.dataMax = mathMax(pick(axis.dataMax, xData[0]), arrayMax(xData));
+                                }
+
+                        // Get dataMin and dataMax for Y axes, as well as handle stacking and processed data
+                        } else {
+
+                                // Get this particular series extremes
+                                series.getExtremes();
+                                seriesDataMax = series.dataMax;
+                                seriesDataMin = series.dataMin;
+
+                                // Get the dataMin and dataMax so far. If percentage is used, the min and max are
+                                // always 0 and 100. If seriesDataMin and seriesDataMax is null, then series
+                                // doesn't have active y data, we continue with nulls
+                                if (defined(seriesDataMin) && defined(seriesDataMax)) {
+                                        axis.dataMin = mathMin(pick(axis.dataMin, seriesDataMin), seriesDataMin);
+                                        axis.dataMax = mathMax(pick(axis.dataMax, seriesDataMax), seriesDataMax);
+                                }
+
+                                // Adjust to threshold
+                                if (defined(threshold)) {
+                                        if (axis.dataMin >= threshold) {
+                                                axis.dataMin = threshold;
+                                                axis.ignoreMinPadding = true;
+                                        } else if (axis.dataMax < threshold) {
+                                                axis.dataMax = threshold;
+                                                axis.ignoreMaxPadding = true;
+                                        }
+                                }
+                        }
+                }
+        });
+},
+
+/**
+ * Translate from axis value to pixel position on the chart, or back
+ *
+ */
+translate: function (val, backwards, cvsCoord, old, handleLog, pointPlacement) {
+        var axis = this,
+                sign = 1,
+                cvsOffset = 0,
+                localA = old ? axis.oldTransA : axis.transA,
+                localMin = old ? axis.oldMin : axis.min,
+                returnValue,
+                minPixelPadding = axis.minPixelPadding,
+                postTranslate = (axis.options.ordinal || (axis.isLog && handleLog)) && axis.lin2val;
+
+        if (!localA) {
+                localA = axis.transA;
+        }
+
+        // In vertical axes, the canvas coordinates start from 0 at the top like in
+        // SVG.
+        if (cvsCoord) {
+                sign *= -1; // canvas coordinates inverts the value
+                cvsOffset = axis.len;
+        }
+
+        // Handle reversed axis
+        if (axis.reversed) {
+                sign *= -1;
+                cvsOffset -= sign * (axis.sector || axis.len);
+        }
+
+        // From pixels to value
+        if (backwards) { // reverse translation
+
+                val = val * sign + cvsOffset;
+                val -= minPixelPadding;
+                returnValue = val / localA + localMin; // from chart pixel to value
+                if (postTranslate) { // log and ordinal axes
+                        returnValue = axis.lin2val(returnValue);
+                }
+
+        // From value to pixels
+        } else {
+                if (postTranslate) { // log and ordinal axes
+                        val = axis.val2lin(val);
+                }
+                if (pointPlacement === 'between') {
+                        pointPlacement = 0.5;
+                }
+                returnValue = sign * (val - localMin) * localA + cvsOffset + (sign * minPixelPadding) +
+                        (isNumber(pointPlacement) ? localA * pointPlacement * axis.pointRange : 0);
+        }
+
+        return returnValue;
+},
+
+/**
+ * Utility method to translate an axis value to pixel position.
+ * @param {Number} value A value in terms of axis units
+ * @param {Boolean} paneCoordinates Whether to return the pixel coordinate relative to the chart
+ *        or just the axis/pane itself.
+ */
+toPixels: function (value, paneCoordinates) {
+        return this.translate(value, false, !this.horiz, null, true) + (paneCoordinates ? 0 : this.pos);
+},
+
+/*
+ * Utility method to translate a pixel position in to an axis value
+ * @param {Number} pixel The pixel value coordinate
+ * @param {Boolean} paneCoordiantes Whether the input pixel is relative to the chart or just the
+ *        axis/pane itself.
+ */
+toValue: function (pixel, paneCoordinates) {
+        return this.translate(pixel - (paneCoordinates ? 0 : this.pos), true, !this.horiz, null, true);
+},
+
+/**
+ * Create the path for a plot line that goes from the given value on
+ * this axis, across the plot to the opposite side
+ * @param {Number} value
+ * @param {Number} lineWidth Used for calculation crisp line
+ * @param {Number] old Use old coordinates (for resizing and rescaling)
+ */
+getPlotLinePath: function (value, lineWidth, old, force, translatedValue) {
+        var axis = this,
+                chart = axis.chart,
+                axisLeft = axis.left,
+                axisTop = axis.top,
+                x1,
+                y1,
+                x2,
+                y2,
+                cHeight = (old && chart.oldChartHeight) || chart.chartHeight,
+                cWidth = (old && chart.oldChartWidth) || chart.chartWidth,
+                skip,
+                transB = axis.transB;
+
+        translatedValue = pick(translatedValue, axis.translate(value, null, null, old));
+        x1 = x2 = mathRound(translatedValue + transB);
+        y1 = y2 = mathRound(cHeight - translatedValue - transB);
+
+        if (isNaN(translatedValue)) { // no min or max
+                skip = true;
+
+        } else if (axis.horiz) {
+                y1 = axisTop;
+                y2 = cHeight - axis.bottom;
+                if (x1 < axisLeft || x1 > axisLeft + axis.width) {
+                        skip = true;
+                }
+        } else {
+                x1 = axisLeft;
+                x2 = cWidth - axis.right;
+
+                if (y1 < axisTop || y1 > axisTop + axis.height) {
+                        skip = true;
+                }
+        }
+        return skip && !force ?
+                null :
+                chart.renderer.crispLine([M, x1, y1, L, x2, y2], lineWidth || 1);
+},
+
+/**
+ * Set the tick positions of a linear axis to round values like whole tens or every five.
+ */
+getLinearTickPositions: function (tickInterval, min, max) {
+        var pos,
+                lastPos,
+                roundedMin = correctFloat(mathFloor(min / tickInterval) * tickInterval),
+                roundedMax = correctFloat(mathCeil(max / tickInterval) * tickInterval),
+                tickPositions = [];
+
+        // For single points, add a tick regardless of the relative position (#2662)
+        if (min === max && isNumber(min)) {
+                return [min];
+        }
+
+        // Populate the intermediate values
+        pos = roundedMin;
+        while (pos <= roundedMax) {
+
+                // Place the tick on the rounded value
+                tickPositions.push(pos);
+
+                // Always add the raw tickInterval, not the corrected one.
+                pos = correctFloat(pos + tickInterval);
+
+                // If the interval is not big enough in the current min - max range to actually increase
+                // the loop variable, we need to break out to prevent endless loop. Issue #619
+                if (pos === lastPos) {
+                        break;
+                }
+
+                // Record the last value
+                lastPos = pos;
+        }
+        return tickPositions;
+},
+
+/**
+ * Return the minor tick positions. For logarithmic axes, reuse the same logic
+ * as for major ticks.
+ */
+getMinorTickPositions: function () {
+        var axis = this,
+                options = axis.options,
+                tickPositions = axis.tickPositions,
+                minorTickInterval = axis.minorTickInterval,
+                minorTickPositions = [],
+                pos,
+                i,
+                len;
+
+        if (axis.isLog) {
+                len = tickPositions.length;
+                for (i = 1; i < len; i++) {
+                        minorTickPositions = minorTickPositions.concat(
+                                axis.getLogTickPositions(minorTickInterval, tickPositions[i - 1], tickPositions[i], true)
+                        );
+                }
+        } else if (axis.isDatetimeAxis && options.minorTickInterval === 'auto') { // #1314
+                minorTickPositions = minorTickPositions.concat(
+                        axis.getTimeTicks(
+                                axis.normalizeTimeTickInterval(minorTickInterval),
+                                axis.min,
+                                axis.max,
+                                options.startOfWeek
+                        )
+                );
+                if (minorTickPositions[0] < axis.min) {
+                        minorTickPositions.shift();
+                }
+        } else {
+                for (pos = axis.min + (tickPositions[0] - axis.min) % minorTickInterval; pos <= axis.max; pos += minorTickInterval) {
+                        minorTickPositions.push(pos);
+                }
+        }
+        return minorTickPositions;
+},
+
+/**
+ * Adjust the min and max for the minimum range. Keep in mind that the series data is
+ * not yet processed, so we don't have information on data cropping and grouping, or
+ * updated axis.pointRange or series.pointRange. The data can't be processed until
+ * we have finally established min and max.
+ */
+adjustForMinRange: function () {
+        var axis = this,
+                options = axis.options,
+                min = axis.min,
+                max = axis.max,
+                zoomOffset,
+                spaceAvailable = axis.dataMax - axis.dataMin >= axis.minRange,
+                closestDataRange,
+                i,
+                distance,
+                xData,
+                loopLength,
+                minArgs,
+                maxArgs;
+
+        // Set the automatic minimum range based on the closest point distance
+        if (axis.isXAxis && axis.minRange === UNDEFINED && !axis.isLog) {
+
+                if (defined(options.min) || defined(options.max)) {
+                        axis.minRange = null; // don't do this again
+
+                } else {
+
+                        // Find the closest distance between raw data points, as opposed to
+                        // closestPointRange that applies to processed points (cropped and grouped)
+                        each(axis.series, function (series) {
+                                xData = series.xData;
+                                loopLength = series.xIncrement ? 1 : xData.length - 1;
+                                for (i = loopLength; i > 0; i--) {
+                                        distance = xData[i] - xData[i - 1];
+                                        if (closestDataRange === UNDEFINED || distance < closestDataRange) {
+                                                closestDataRange = distance;
+                                        }
+                                }
+                        });
+                        axis.minRange = mathMin(closestDataRange * 5, axis.dataMax - axis.dataMin);
+                }
+        }
+
+        // if minRange is exceeded, adjust
+        if (max - min < axis.minRange) {
+                var minRange = axis.minRange;
+                zoomOffset = (minRange - max + min) / 2;
+
+                // if min and max options have been set, don't go beyond it
+                minArgs = [min - zoomOffset, pick(options.min, min - zoomOffset)];
+                if (spaceAvailable) { // if space is available, stay within the data range
+                        minArgs[2] = axis.dataMin;
+                }
+                min = arrayMax(minArgs);
+
+                maxArgs = [min + minRange, pick(options.max, min + minRange)];
+                if (spaceAvailable) { // if space is availabe, stay within the data range
+                        maxArgs[2] = axis.dataMax;
+                }
+
+                max = arrayMin(maxArgs);
+
+                // now if the max is adjusted, adjust the min back
+                if (max - min < minRange) {
+                        minArgs[0] = max - minRange;
+                        minArgs[1] = pick(options.min, max - minRange);
+                        min = arrayMax(minArgs);
+                }
+        }
+
+        // Record modified extremes
+        axis.min = min;
+        axis.max = max;
+},
+
+/**
+ * Update translation information
+ */
+setAxisTranslation: function (saveOld) {
+        var axis = this,
+                range = axis.max - axis.min,
+                pointRange = axis.axisPointRange || 0,
+                closestPointRange,
+                minPointOffset = 0,
+                pointRangePadding = 0,
+                linkedParent = axis.linkedParent,
+                ordinalCorrection,
+                hasCategories = !!axis.categories,
+                transA = axis.transA;
+
+        // Adjust translation for padding. Y axis with categories need to go through the same (#1784).
+        if (axis.isXAxis || hasCategories || pointRange) {
+                if (linkedParent) {
+                        minPointOffset = linkedParent.minPointOffset;
+                        pointRangePadding = linkedParent.pointRangePadding;
+
+                } else {
+                        each(axis.series, function (series) {
+                                var seriesPointRange = hasCategories ? 1 : (axis.isXAxis ? series.pointRange : (axis.axisPointRange || 0)), // #2806
+                                        pointPlacement = series.options.pointPlacement,
+                                        seriesClosestPointRange = series.closestPointRange;
+
+                                if (seriesPointRange > range) { // #1446
+                                        seriesPointRange = 0;
+                                }
+                                pointRange = mathMax(pointRange, seriesPointRange);
+
+                                // minPointOffset is the value padding to the left of the axis in order to make
+                                // room for points with a pointRange, typically columns. When the pointPlacement option
+                                // is 'between' or 'on', this padding does not apply.
+                                minPointOffset = mathMax(
+                                        minPointOffset,
+                                        isString(pointPlacement) ? 0 : seriesPointRange / 2
+                                );
+
+                                // Determine the total padding needed to the length of the axis to make room for the
+                                // pointRange. If the series' pointPlacement is 'on', no padding is added.
+                                pointRangePadding = mathMax(
+                                        pointRangePadding,
+                                        pointPlacement === 'on' ? 0 : seriesPointRange
+                                );
+
+                                // Set the closestPointRange
+                                if (!series.noSharedTooltip && defined(seriesClosestPointRange)) {
+                                        closestPointRange = defined(closestPointRange) ?
+                                                mathMin(closestPointRange, seriesClosestPointRange) :
+                                                seriesClosestPointRange;
+                                }
+                        });
+                }
+
+                // Record minPointOffset and pointRangePadding
+                ordinalCorrection = axis.ordinalSlope && closestPointRange ? axis.ordinalSlope / closestPointRange : 1; // #988, #1853
+                axis.minPointOffset = minPointOffset = minPointOffset * ordinalCorrection;
+                axis.pointRangePadding = pointRangePadding = pointRangePadding * ordinalCorrection;
+
+                // pointRange means the width reserved for each point, like in a column chart
+                axis.pointRange = mathMin(pointRange, range);
+
+                // closestPointRange means the closest distance between points. In columns
+                // it is mostly equal to pointRange, but in lines pointRange is 0 while closestPointRange
+                // is some other value
+                axis.closestPointRange = closestPointRange;
+        }
+
+        // Secondary values
+        if (saveOld) {
+                axis.oldTransA = transA;
+        }
+        axis.translationSlope = axis.transA = transA = axis.len / ((range + pointRangePadding) || 1);
+        axis.transB = axis.horiz ? axis.left : axis.bottom; // translation addend
+        axis.minPixelPadding = transA * minPointOffset;
+},
+
+/**
+ * Set the tick positions to round values and optionally extend the extremes
+ * to the nearest tick
+ */
+setTickPositions: function (secondPass) {
+        var axis = this,
+                chart = axis.chart,
+                options = axis.options,
+                isLog = axis.isLog,
+                isDatetimeAxis = axis.isDatetimeAxis,
+                isXAxis = axis.isXAxis,
+                isLinked = axis.isLinked,
+                tickPositioner = axis.options.tickPositioner,
+                maxPadding = options.maxPadding,
+                minPadding = options.minPadding,
+                length,
+                linkedParentExtremes,
+                tickIntervalOption = options.tickInterval,
+                minTickIntervalOption = options.minTickInterval,
+                tickPixelIntervalOption = options.tickPixelInterval,
+                tickPositions,
+                keepTwoTicksOnly,
+                categories = axis.categories;
+
+        // linked axis gets the extremes from the parent axis
+        if (isLinked) {
+                axis.linkedParent = chart[axis.coll][options.linkedTo];
+                linkedParentExtremes = axis.linkedParent.getExtremes();
+                axis.min = pick(linkedParentExtremes.min, linkedParentExtremes.dataMin);
+                axis.max = pick(linkedParentExtremes.max, linkedParentExtremes.dataMax);
+                if (options.type !== axis.linkedParent.options.type) {
+                        error(11, 1); // Can't link axes of different type
+                }
+        } else { // initial min and max from the extreme data values
+                axis.min = pick(axis.userMin, options.min, axis.dataMin);
+                axis.max = pick(axis.userMax, options.max, axis.dataMax);
+        }
+
+        if (isLog) {
+                if (!secondPass && mathMin(axis.min, pick(axis.dataMin, axis.min)) <= 0) { // #978
+                        error(10, 1); // Can't plot negative values on log axis
+                }
+                axis.min = correctFloat(log2lin(axis.min)); // correctFloat cures #934
+                axis.max = correctFloat(log2lin(axis.max));
+        }
+
+        // handle zoomed range
+        if (axis.range && defined(axis.max)) {
+                axis.userMin = axis.min = mathMax(axis.min, axis.max - axis.range); // #618
+                axis.userMax = axis.max;
+
+                axis.range = null;  // don't use it when running setExtremes
+        }
+
+        // Hook for adjusting this.min and this.max. Used by bubble series.
+        if (axis.beforePadding) {
+                axis.beforePadding();
+        }
+
+        // adjust min and max for the minimum range
+        axis.adjustForMinRange();
+
+        // Pad the values to get clear of the chart's edges. To avoid tickInterval taking the padding
+        // into account, we do this after computing tick interval (#1337).
+        if (!categories && !axis.axisPointRange && !axis.usePercentage && !isLinked && defined(axis.min) && defined(axis.max)) {
+                length = axis.max - axis.min;
+                if (length) {
+                        if (!defined(options.min) && !defined(axis.userMin) && minPadding && (axis.dataMin < 0 || !axis.ignoreMinPadding)) {
+                                axis.min -= length * minPadding;
+                        }
+                        if (!defined(options.max) && !defined(axis.userMax)  && maxPadding && (axis.dataMax > 0 || !axis.ignoreMaxPadding)) {
+                                axis.max += length * maxPadding;
+                        }
+                }
+        }
+
+        // Stay within floor and ceiling
+        if (isNumber(options.floor)) {
+                axis.min = mathMax(axis.min, options.floor);
+        }
+        if (isNumber(options.ceiling)) {
+                axis.max = mathMin(axis.max, options.ceiling);
+        }
+
+        // get tickInterval
+        if (axis.min === axis.max || axis.min === undefined || axis.max === undefined) {
+                axis.tickInterval = 1;
+        } else if (isLinked && !tickIntervalOption &&
+                        tickPixelIntervalOption === axis.linkedParent.options.tickPixelInterval) {
+                axis.tickInterval = axis.linkedParent.tickInterval;
+        } else {
+                axis.tickInterval = pick(
+                        tickIntervalOption,
+                        categories ? // for categoried axis, 1 is default, for linear axis use tickPix
+                                1 :
+                                // don't let it be more than the data range
+                                (axis.max - axis.min) * tickPixelIntervalOption / mathMax(axis.len, tickPixelIntervalOption)
+                );
+                // For squished axes, set only two ticks
+                if (!defined(tickIntervalOption) && axis.len < tickPixelIntervalOption && !this.isRadial &&
+                                !this.isLog && !categories && options.startOnTick && options.endOnTick) {
+                        keepTwoTicksOnly = true;
+                        axis.tickInterval /= 4; // tick extremes closer to the real values
+                }
+        }
+
+        // Now we're finished detecting min and max, crop and group series data. This
+        // is in turn needed in order to find tick positions in ordinal axes.
+        if (isXAxis && !secondPass) {
+                each(axis.series, function (series) {
+                        series.processData(axis.min !== axis.oldMin || axis.max !== axis.oldMax);
+                });
+        }
+
+        // set the translation factor used in translate function
+        axis.setAxisTranslation(true);
+
+        // hook for ordinal axes and radial axes
+        if (axis.beforeSetTickPositions) {
+                axis.beforeSetTickPositions();
+        }
+
+        // hook for extensions, used in Highstock ordinal axes
+        if (axis.postProcessTickInterval) {
+                axis.tickInterval = axis.postProcessTickInterval(axis.tickInterval);
+        }
+
+        // In column-like charts, don't cramp in more ticks than there are points (#1943)
+        if (axis.pointRange) {
+                axis.tickInterval = mathMax(axis.pointRange, axis.tickInterval);
+        }
+
+        // Before normalizing the tick interval, handle minimum tick interval. This applies only if tickInterval is not defined.
+        if (!tickIntervalOption && axis.tickInterval < minTickIntervalOption) {
+                axis.tickInterval = minTickIntervalOption;
+        }
+
+        // for linear axes, get magnitude and normalize the interval
+        if (!isDatetimeAxis && !isLog) { // linear
+                if (!tickIntervalOption) {
+                        axis.tickInterval = normalizeTickInterval(axis.tickInterval, null, getMagnitude(axis.tickInterval), options);
+                }
+        }
+
+        // get minorTickInterval
+        axis.minorTickInterval = options.minorTickInterval === 'auto' && axis.tickInterval ?
+                        axis.tickInterval / 5 : options.minorTickInterval;
+
+        // find the tick positions
+        axis.tickPositions = tickPositions = options.tickPositions ?
+                [].concat(options.tickPositions) : // Work on a copy (#1565)
+                (tickPositioner && tickPositioner.apply(axis, [axis.min, axis.max]));
+        if (!tickPositions) {
+
+                // Too many ticks
+                if (!axis.ordinalPositions && (axis.max - axis.min) / axis.tickInterval > mathMax(2 * axis.len, 200)) {
+                        error(19, true);
+                }
+
+                if (isDatetimeAxis) {
+                        tickPositions = axis.getTimeTicks(
+                                axis.normalizeTimeTickInterval(axis.tickInterval, options.units),
+                                axis.min,
+                                axis.max,
+                                options.startOfWeek,
+                                axis.ordinalPositions,
+                                axis.closestPointRange,
+                                true
+                        );
+                } else if (isLog) {
+                        tickPositions = axis.getLogTickPositions(axis.tickInterval, axis.min, axis.max);
+                } else {
+                        tickPositions = axis.getLinearTickPositions(axis.tickInterval, axis.min, axis.max);
+                }
+
+                if (keepTwoTicksOnly) {
+                        tickPositions.splice(1, tickPositions.length - 2);
+                }
+
+                axis.tickPositions = tickPositions;
+        }
+
+        if (!isLinked) {
+
+                // reset min/max or remove extremes based on start/end on tick
+                var roundedMin = tickPositions[0],
+                        roundedMax = tickPositions[tickPositions.length - 1],
+                        minPointOffset = axis.minPointOffset || 0,
+                        singlePad;
+
+                if (options.startOnTick) {
+                        axis.min = roundedMin;
+                } else if (axis.min - minPointOffset > roundedMin) {
+                        tickPositions.shift();
+                }
+
+                if (options.endOnTick) {
+                        axis.max = roundedMax;
+                } else if (axis.max + minPointOffset < roundedMax) {
+                        tickPositions.pop();
+                }
+
+                // When there is only one point, or all points have the same value on this axis, then min
+                // and max are equal and tickPositions.length is 0 or 1. In this case, add some padding
+                // in order to center the point, but leave it with one tick. #1337.
+                if (tickPositions.length === 1) {
+                        singlePad = mathAbs(axis.max) > 10e12 ? 1 : 0.001; // The lowest possible number to avoid extra padding on columns (#2619, #2846)
+                        axis.min -= singlePad;
+                        axis.max += singlePad;
+                }
+        }
+},
+
+/**
+ * Set the max ticks of either the x and y axis collection
+ */
+setMaxTicks: function () {
+
+        var chart = this.chart,
+                maxTicks = chart.maxTicks || {},
+                tickPositions = this.tickPositions,
+                key = this._maxTicksKey = [this.coll, this.pos, this.len].join('-');
+
+        if (!this.isLinked && !this.isDatetimeAxis && tickPositions && tickPositions.length > (maxTicks[key] || 0) && this.options.alignTicks !== false) {
+                maxTicks[key] = tickPositions.length;
+        }
+        chart.maxTicks = maxTicks;
+},
+
+/**
+ * When using multiple axes, adjust the number of ticks to match the highest
+ * number of ticks in that group
+ */
+adjustTickAmount: function () {
+        var axis = this,
+                chart = axis.chart,
+                key = axis._maxTicksKey,
+                tickPositions = axis.tickPositions,
+                maxTicks = chart.maxTicks;
+
+        if (maxTicks && maxTicks[key] && !axis.isDatetimeAxis && !axis.categories && !axis.isLinked &&
+                        axis.options.alignTicks !== false && this.min !== UNDEFINED) {
+                var oldTickAmount = axis.tickAmount,
+                        calculatedTickAmount = tickPositions.length,
+                        tickAmount;
+
+                // set the axis-level tickAmount to use below
+                axis.tickAmount = tickAmount = maxTicks[key];
+
+                if (calculatedTickAmount < tickAmount) {
+                        while (tickPositions.length < tickAmount) {
+                                tickPositions.push(correctFloat(
+                                        tickPositions[tickPositions.length - 1] + axis.tickInterval
+                                ));
+                        }
+                        axis.transA *= (calculatedTickAmount - 1) / (tickAmount - 1);
+                        axis.max = tickPositions[tickPositions.length - 1];
+
+                }
+                if (defined(oldTickAmount) && tickAmount !== oldTickAmount) {
+                        axis.isDirty = true;
+                }
+        }
+},
+
+/**
+ * Set the scale based on data min and max, user set min and max or options
+ *
+ */
+setScale: function () {
+        var axis = this,
+                stacks = axis.stacks,
+                type,
+                i,
+                isDirtyData,
+                isDirtyAxisLength;
+
+        axis.oldMin = axis.min;
+        axis.oldMax = axis.max;
+        axis.oldAxisLength = axis.len;
+
+        // set the new axisLength
+        axis.setAxisSize();
+        //axisLength = horiz ? axisWidth : axisHeight;
+        isDirtyAxisLength = axis.len !== axis.oldAxisLength;
+
+        // is there new data?
+        each(axis.series, function (series) {
+                if (series.isDirtyData || series.isDirty ||
+                                series.xAxis.isDirty) { // when x axis is dirty, we need new data extremes for y as well
+                        isDirtyData = true;
+                }
+        });
+
+        // do we really need to go through all this?
+        if (isDirtyAxisLength || isDirtyData || axis.isLinked || axis.forceRedraw ||
+                axis.userMin !== axis.oldUserMin || axis.userMax !== axis.oldUserMax) {
+
+                // reset stacks
+                if (!axis.isXAxis) {
+                        for (type in stacks) {
+                                for (i in stacks[type]) {
+                                        stacks[type][i].total = null;
+                                        stacks[type][i].cum = 0;
+                                }
+                        }
+                }
+
+                axis.forceRedraw = false;
+
+                // get data extremes if needed
+                axis.getSeriesExtremes();
+
+                // get fixed positions based on tickInterval
+                axis.setTickPositions();
+
+                // record old values to decide whether a rescale is necessary later on (#540)
+                axis.oldUserMin = axis.userMin;
+                axis.oldUserMax = axis.userMax;
+
+                // Mark as dirty if it is not already set to dirty and extremes have changed. #595.
+                if (!axis.isDirty) {
+                        axis.isDirty = isDirtyAxisLength || axis.min !== axis.oldMin || axis.max !== axis.oldMax;
+                }
+        } else if (!axis.isXAxis) {
+                if (axis.oldStacks) {
+                        stacks = axis.stacks = axis.oldStacks;
+                }
+
+                // reset stacks
+                for (type in stacks) {
+                        for (i in stacks[type]) {
+                                stacks[type][i].cum = stacks[type][i].total;
+                        }
+                }
+        }
+
+        // Set the maximum tick amount
+        axis.setMaxTicks();
+},
+
+/**
+ * Set the extremes and optionally redraw
+ * @param {Number} newMin
+ * @param {Number} newMax
+ * @param {Boolean} redraw
+ * @param {Boolean|Object} animation Whether to apply animation, and optionally animation
+ *    configuration
+ * @param {Object} eventArguments
+ *
+ */
+setExtremes: function (newMin, newMax, redraw, animation, eventArguments) {
+        var axis = this,
+                chart = axis.chart;
+
+        redraw = pick(redraw, true); // defaults to true
+
+        // Extend the arguments with min and max
+        eventArguments = extend(eventArguments, {
+                min: newMin,
+                max: newMax
+        });
+
+        // Fire the event
+        fireEvent(axis, 'setExtremes', eventArguments, function () { // the default event handler
+
+                axis.userMin = newMin;
+                axis.userMax = newMax;
+                axis.eventArgs = eventArguments;
+
+                // Mark for running afterSetExtremes
+                axis.isDirtyExtremes = true;
+
+                // redraw
+                if (redraw) {
+                        chart.redraw(animation);
+                }
+        });
+},
+
+/**
+ * Overridable method for zooming chart. Pulled out in a separate method to allow overriding
+ * in stock charts.
+ */
+zoom: function (newMin, newMax) {
+        var dataMin = this.dataMin,
+                dataMax = this.dataMax,
+                options = this.options;
+
+        // Prevent pinch zooming out of range. Check for defined is for #1946. #1734.
+        if (!this.allowZoomOutside) {
+                if (defined(dataMin) && newMin <= mathMin(dataMin, pick(options.min, dataMin))) {
+                        newMin = UNDEFINED;
+                }
+                if (defined(dataMax) && newMax >= mathMax(dataMax, pick(options.max, dataMax))) {
+                        newMax = UNDEFINED;
+                }
+        }
+
+        // In full view, displaying the reset zoom button is not required
+        this.displayBtn = newMin !== UNDEFINED || newMax !== UNDEFINED;
+
+        // Do it
+        this.setExtremes(
+                newMin,
+                newMax,
+                false,
+                UNDEFINED,
+                { trigger: 'zoom' }
+        );
+        return true;
+},
+
+/**
+ * Update the axis metrics
+ */
+setAxisSize: function () {
+        var chart = this.chart,
+                options = this.options,
+                offsetLeft = options.offsetLeft || 0,
+                offsetRight = options.offsetRight || 0,
+                horiz = this.horiz,
+                width = pick(options.width, chart.plotWidth - offsetLeft + offsetRight),
+                height = pick(options.height, chart.plotHeight),
+                top = pick(options.top, chart.plotTop),
+                left = pick(options.left, chart.plotLeft + offsetLeft),
+                percentRegex = /%$/; // docs
+
+        // Check for percentage based input values
+        if (percentRegex.test(height)) {
+                height = parseInt(height, 10) / 100 * chart.plotHeight;
+        }
+        if (percentRegex.test(top)) {
+                top = parseInt(top, 10) / 100 * chart.plotHeight + chart.plotTop;
+        }
+
+        // Expose basic values to use in Series object and navigator
+        this.left = left;
+        this.top = top;
+        this.width = width;
+        this.height = height;
+        this.bottom = chart.chartHeight - height - top;
+        this.right = chart.chartWidth - width - left;
+
+        // Direction agnostic properties
+        this.len = mathMax(horiz ? width : height, 0); // mathMax fixes #905
+        this.pos = horiz ? left : top; // distance from SVG origin
+},
+
+/**
+ * Get the actual axis extremes
+ */
+getExtremes: function () {
+        var axis = this,
+                isLog = axis.isLog;
+
+        return {
+                min: isLog ? correctFloat(lin2log(axis.min)) : axis.min,
+                max: isLog ? correctFloat(lin2log(axis.max)) : axis.max,
+                dataMin: axis.dataMin,
+                dataMax: axis.dataMax,
+                userMin: axis.userMin,
+                userMax: axis.userMax
+        };
+},
+
+/**
+ * Get the zero plane either based on zero or on the min or max value.
+ * Used in bar and area plots
+ */
+getThreshold: function (threshold) {
+        var axis = this,
+                isLog = axis.isLog;
+
+        var realMin = isLog ? lin2log(axis.min) : axis.min,
+                realMax = isLog ? lin2log(axis.max) : axis.max;
+
+        if (realMin > threshold || threshold === null) {
+                threshold = realMin;
+        } else if (realMax < threshold) {
+                threshold = realMax;
+        }
+
+        return axis.translate(threshold, 0, 1, 0, 1);
+},
+
+/**
+ * Compute auto alignment for the axis label based on which side the axis is on
+ * and the given rotation for the label
+ */
+autoLabelAlign: function (rotation) {
+        var ret,
+                angle = (pick(rotation, 0) - (this.side * 90) + 720) % 360;
+
+        if (angle > 15 && angle < 165) {
+                ret = 'right';
+        } else if (angle > 195 && angle < 345) {
+                ret = 'left';
+        } else {
+                ret = 'center';
+        }
+        return ret;
+},
+
+/**
+ * Render the tick labels to a preliminary position to get their sizes
+ */
+getOffset: function () {
+        var axis = this,
+                chart = axis.chart,
+                renderer = chart.renderer,
+                options = axis.options,
+                tickPositions = axis.tickPositions,
+                ticks = axis.ticks,
+                horiz = axis.horiz,
+                side = axis.side,
+                invertedSide = chart.inverted ? [1, 0, 3, 2][side] : side,
+                hasData,
+                showAxis,
+                titleOffset = 0,
+                titleOffsetOption,
+                titleMargin = 0,
+                axisTitleOptions = options.title,
+                labelOptions = options.labels,
+                labelOffset = 0, // reset
+                axisOffset = chart.axisOffset,
+                clipOffset = chart.clipOffset,
+                directionFactor = [-1, 1, 1, -1][side],
+                n,
+                i,
+                autoStaggerLines = 1,
+                maxStaggerLines = pick(labelOptions.maxStaggerLines, 5),
+                sortedPositions,
+                lastRight,
+                overlap,
+                pos,
+                bBox,
+                x,
+                w,
+                lineNo,
+                lineHeightCorrection = side === 2 ? renderer.fontMetrics(labelOptions.style.fontSize).b : 0;
+
+        // For reuse in Axis.render
+        axis.hasData = hasData = (axis.hasVisibleSeries || (defined(axis.min) && defined(axis.max) && !!tickPositions));
+        axis.showAxis = showAxis = hasData || pick(options.showEmpty, true);
+
+        // Set/reset staggerLines
+        axis.staggerLines = axis.horiz && labelOptions.staggerLines;
+
+        // Create the axisGroup and gridGroup elements on first iteration
+        if (!axis.axisGroup) {
+                axis.gridGroup = renderer.g('grid')
+                        .attr({ zIndex: options.gridZIndex || 1 })
+                        .add();
+                axis.axisGroup = renderer.g('axis')
+                        .attr({ zIndex: options.zIndex || 2 })
+                        .add();
+                axis.labelGroup = renderer.g('axis-labels')
+                        .attr({ zIndex: labelOptions.zIndex || 7 })
+                        .addClass(PREFIX + axis.coll.toLowerCase() + '-labels')
+                        .add();
+        }
+
+        if (hasData || axis.isLinked) {
+
+                // Set the explicit or automatic label alignment
+                axis.labelAlign = pick(labelOptions.align || axis.autoLabelAlign(labelOptions.rotation));
+
+                // Generate ticks
+                each(tickPositions, function (pos) {
+                        if (!ticks[pos]) {
+                                ticks[pos] = new Tick(axis, pos);
+                        } else {
+                                ticks[pos].addLabel(); // update labels depending on tick interval
+                        }
+                });
+
+                // Handle automatic stagger lines
+                if (axis.horiz && !axis.staggerLines && maxStaggerLines && !labelOptions.rotation) {
+                        sortedPositions = axis.reversed ? [].concat(tickPositions).reverse() : tickPositions;
+                        while (autoStaggerLines < maxStaggerLines) {
+                                lastRight = [];
+                                overlap = false;
+
+                                for (i = 0; i < sortedPositions.length; i++) {
+                                        pos = sortedPositions[i];
+                                        bBox = ticks[pos].label && ticks[pos].label.getBBox();
+                                        w = bBox ? bBox.width : 0;
+                                        lineNo = i % autoStaggerLines;
+
+                                        if (w) {
+                                                x = axis.translate(pos); // don't handle log
+                                                if (lastRight[lineNo] !== UNDEFINED && x < lastRight[lineNo]) {
+                                                        overlap = true;
+                                                }
+                                                lastRight[lineNo] = x + w;
+                                        }
+                                }
+                                if (overlap) {
+                                        autoStaggerLines++;
+                                } else {
+                                        break;
+                                }
+                        }
+
+                        if (autoStaggerLines > 1) {
+                                axis.staggerLines = autoStaggerLines;
+                        }
+                }
+
+                each(tickPositions, function (pos) {
+                        // left side must be align: right and right side must have align: left for labels
+                        if (side === 0 || side === 2 || { 1: 'left', 3: 'right' }[side] === axis.labelAlign) {
+
+                                // get the highest offset
+                                labelOffset = mathMax(
+                                        ticks[pos].getLabelSize(),
+                                        labelOffset
+                                );
+                        }
+
+                });
+                if (axis.staggerLines) {
+                        labelOffset *= axis.staggerLines;
+                        axis.labelOffset = labelOffset;
+                }
+
+        } else { // doesn't have data
+                for (n in ticks) {
+                        ticks[n].destroy();
+                        delete ticks[n];
+                }
+        }
+
+        if (axisTitleOptions && axisTitleOptions.text && axisTitleOptions.enabled !== false) {
+                if (!axis.axisTitle) {
+                        axis.axisTitle = renderer.text(
+                                axisTitleOptions.text,
+                                0,
+                                0,
+                                axisTitleOptions.useHTML
+                        )
+                        .attr({
+                                zIndex: 7,
+                                rotation: axisTitleOptions.rotation || 0,
+                                align:
+                                        axisTitleOptions.textAlign ||
+                                        { low: 'left', middle: 'center', high: 'right' }[axisTitleOptions.align]
+                        })
+                        .addClass(PREFIX + this.coll.toLowerCase() + '-title')
+                        .css(axisTitleOptions.style)
+                        .add(axis.axisGroup);
+                        axis.axisTitle.isNew = true;
+                }
+
+                if (showAxis) {
+                        titleOffset = axis.axisTitle.getBBox()[horiz ? 'height' : 'width'];
+                        titleMargin = pick(axisTitleOptions.margin, horiz ? 5 : 10);
+                        titleOffsetOption = axisTitleOptions.offset;
+                }
+
+                // hide or show the title depending on whether showEmpty is set
+                axis.axisTitle[showAxis ? 'show' : 'hide']();
+        }
+
+        // handle automatic or user set offset
+        axis.offset = directionFactor * pick(options.offset, axisOffset[side]);
+
+        axis.axisTitleMargin =
+                pick(titleOffsetOption,
+                        labelOffset + titleMargin +
+                        (labelOffset && (directionFactor * options.labels[horiz ? 'y' : 'x'] - lineHeightCorrection))
+                );
+
+        axisOffset[side] = mathMax(
+                axisOffset[side],
+                axis.axisTitleMargin + titleOffset + directionFactor * axis.offset
+        );
+        clipOffset[invertedSide] = mathMax(clipOffset[invertedSide], mathFloor(options.lineWidth / 2) * 2);
+},
+
+/**
+ * Get the path for the axis line
+ */
+getLinePath: function (lineWidth) {
+        var chart = this.chart,
+                opposite = this.opposite,
+                offset = this.offset,
+                horiz = this.horiz,
+                lineLeft = this.left + (opposite ? this.width : 0) + offset,
+                lineTop = chart.chartHeight - this.bottom - (opposite ? this.height : 0) + offset;
+
+        if (opposite) {
+                lineWidth *= -1; // crispify the other way - #1480, #1687
+        }
+
+        return chart.renderer.crispLine([
+                        M,
+                        horiz ?
+                                this.left :
+                                lineLeft,
+                        horiz ?
+                                lineTop :
+                                this.top,
+                        L,
+                        horiz ?
+                                chart.chartWidth - this.right :
+                                lineLeft,
+                        horiz ?
+                                lineTop :
+                                chart.chartHeight - this.bottom
+                ], lineWidth);
+},
+
+/**
+ * Position the title
+ */
+getTitlePosition: function () {
+        // compute anchor points for each of the title align options
+        var horiz = this.horiz,
+                axisLeft = this.left,
+                axisTop = this.top,
+                axisLength = this.len,
+                axisTitleOptions = this.options.title,
+                margin = horiz ? axisLeft : axisTop,
+                opposite = this.opposite,
+                offset = this.offset,
+                fontSize = pInt(axisTitleOptions.style.fontSize || 12),
+
+                // the position in the length direction of the axis
+                alongAxis = {
+                        low: margin + (horiz ? 0 : axisLength),
+                        middle: margin + axisLength / 2,
+                        high: margin + (horiz ? axisLength : 0)
+                }[axisTitleOptions.align],
+
+                // the position in the perpendicular direction of the axis
+                offAxis = (horiz ? axisTop + this.height : axisLeft) +
+                        (horiz ? 1 : -1) * // horizontal axis reverses the margin
+                        (opposite ? -1 : 1) * // so does opposite axes
+                        this.axisTitleMargin +
+                        (this.side === 2 ? fontSize : 0);
+
+        return {
+                x: horiz ?
+                        alongAxis :
+                        offAxis + (opposite ? this.width : 0) + offset +
+                                (axisTitleOptions.x || 0), // x
+                y: horiz ?
+                        offAxis - (opposite ? this.height : 0) + offset :
+                        alongAxis + (axisTitleOptions.y || 0) // y
+        };
+},
+
+/**
+ * Render the axis
+ */
+render: function () {
+        var axis = this,
+                horiz = axis.horiz,
+                reversed = axis.reversed,
+                chart = axis.chart,
+                renderer = chart.renderer,
+                options = axis.options,
+                isLog = axis.isLog,
+                isLinked = axis.isLinked,
+                tickPositions = axis.tickPositions,
+                sortedPositions,
+                axisTitle = axis.axisTitle,                     
+                ticks = axis.ticks,
+                minorTicks = axis.minorTicks,
+                alternateBands = axis.alternateBands,
+                stackLabelOptions = options.stackLabels,
+                alternateGridColor = options.alternateGridColor,
+                tickmarkOffset = axis.tickmarkOffset,
+                lineWidth = options.lineWidth,
+                linePath,
+                hasRendered = chart.hasRendered,
+                slideInTicks = hasRendered && defined(axis.oldMin) && !isNaN(axis.oldMin),
+                hasData = axis.hasData,
+                showAxis = axis.showAxis,
+                from,
+                overflow = options.labels.overflow,
+                justifyLabels = axis.justifyLabels = horiz && overflow !== false,
+                to;
+
+        // Reset
+        axis.labelEdge.length = 0;
+        axis.justifyToPlot = overflow === 'justify';
+
+        // Mark all elements inActive before we go over and mark the active ones
+        each([ticks, minorTicks, alternateBands], function (coll) {
+                var pos;
+                for (pos in coll) {
+                        coll[pos].isActive = false;
+                }
+        });
+
+        // If the series has data draw the ticks. Else only the line and title
+        if (hasData || isLinked) {
+
+                // minor ticks
+                if (axis.minorTickInterval && !axis.categories) {
+                        each(axis.getMinorTickPositions(), function (pos) {
+                                if (!minorTicks[pos]) {
+                                        minorTicks[pos] = new Tick(axis, pos, 'minor');
+                                }
+
+                                // render new ticks in old position
+                                if (slideInTicks && minorTicks[pos].isNew) {
+                                        minorTicks[pos].render(null, true);
+                                }
+
+                                minorTicks[pos].render(null, false, 1);
+                        });
+                }
+
+                // Major ticks. Pull out the first item and render it last so that
+                // we can get the position of the neighbour label. #808.
+                if (tickPositions.length) { // #1300
+                        sortedPositions = tickPositions.slice();
+                        if ((horiz && reversed) || (!horiz && !reversed)) {
+                                sortedPositions.reverse();
+                        }
+                        if (justifyLabels) {
+                                sortedPositions = sortedPositions.slice(1).concat([sortedPositions[0]]);
+                        }
+                        each(sortedPositions, function (pos, i) {
+
+                                // Reorganize the indices
+                                if (justifyLabels) {
+                                        i = (i === sortedPositions.length - 1) ? 0 : i + 1;
+                                }
+
+                                // linked axes need an extra check to find out if
+                                if (!isLinked || (pos >= axis.min && pos <= axis.max)) {
+
+                                        if (!ticks[pos]) {
+                                                ticks[pos] = new Tick(axis, pos);
+                                        }
+
+                                        // render new ticks in old position
+                                        if (slideInTicks && ticks[pos].isNew) {
+                                                ticks[pos].render(i, true, 0.1);
+                                        }
+
+                                        ticks[pos].render(i, false, 1);
+                                }
+
+                        });
+                        // In a categorized axis, the tick marks are displayed between labels. So
+                        // we need to add a tick mark and grid line at the left edge of the X axis.
+                        if (tickmarkOffset && axis.min === 0) {
+                                if (!ticks[-1]) {
+                                        ticks[-1] = new Tick(axis, -1, null, true);
+                                }
+                                ticks[-1].render(-1);
+                        }
+
+                }
+
+                // alternate grid color
+                if (alternateGridColor) {
+                        each(tickPositions, function (pos, i) {
+                                if (i % 2 === 0 && pos < axis.max) {
+                                        if (!alternateBands[pos]) {
+                                                alternateBands[pos] = new Highcharts.PlotLineOrBand(axis);
+                                        }
+                                        from = pos + tickmarkOffset; // #949
+                                        to = tickPositions[i + 1] !== UNDEFINED ? tickPositions[i + 1] + tickmarkOffset : axis.max;
+                                        alternateBands[pos].options = {
+                                                from: isLog ? lin2log(from) : from,
+                                                to: isLog ? lin2log(to) : to,
+                                                color: alternateGridColor
+                                        };
+                                        alternateBands[pos].render();
+                                        alternateBands[pos].isActive = true;
+                                }
+                        });
+                }
+
+                // custom plot lines and bands
+                if (!axis._addedPlotLB) { // only first time
+                        each((options.plotLines || []).concat(options.plotBands || []), function (plotLineOptions) {
+                                axis.addPlotBandOrLine(plotLineOptions);
+                        });
+                        axis._addedPlotLB = true;
+                }
+
+        } // end if hasData
+
+        // Remove inactive ticks
+        each([ticks, minorTicks, alternateBands], function (coll) {
+                var pos,
+                        i,
+                        forDestruction = [],
+                        delay = globalAnimation ? globalAnimation.duration || 500 : 0,
+                        destroyInactiveItems = function () {
+                                i = forDestruction.length;
+                                while (i--) {
+                                        // When resizing rapidly, the same items may be destroyed in different timeouts,
+                                        // or the may be reactivated
+                                        if (coll[forDestruction[i]] && !coll[forDestruction[i]].isActive) {
+                                                coll[forDestruction[i]].destroy();
+                                                delete coll[forDestruction[i]];
+                                        }
+                                }
+
+                        };
+
+                for (pos in coll) {
+
+                        if (!coll[pos].isActive) {
+                                // Render to zero opacity
+                                coll[pos].render(pos, false, 0);
+                                coll[pos].isActive = false;
+                                forDestruction.push(pos);
+                        }
+                }
+
+                // When the objects are finished fading out, destroy them
+                if (coll === alternateBands || !chart.hasRendered || !delay) {
+                        destroyInactiveItems();
+                } else if (delay) {
+                        setTimeout(destroyInactiveItems, delay);
+                }
+        });
+
+        // Static items. As the axis group is cleared on subsequent calls
+        // to render, these items are added outside the group.
+        // axis line
+        if (lineWidth) {
+                linePath = axis.getLinePath(lineWidth);
+                if (!axis.axisLine) {
+                        axis.axisLine = renderer.path(linePath)
+                                .attr({
+                                        stroke: options.lineColor,
+                                        'stroke-width': lineWidth,
+                                        zIndex: 7
+                                })
+                                .add(axis.axisGroup);
+                } else {
+                        axis.axisLine.animate({ d: linePath });
+                }
+
+                // show or hide the line depending on options.showEmpty
+                axis.axisLine[showAxis ? 'show' : 'hide']();
+        }
+
+        if (axisTitle && showAxis) {
+
+                axisTitle[axisTitle.isNew ? 'attr' : 'animate'](
+                        axis.getTitlePosition()
+                );
+                axisTitle.isNew = false;
+        }
+
+        // Stacked totals:
+        if (stackLabelOptions && stackLabelOptions.enabled) {
+                axis.renderStackTotals();
+        }
+        // End stacked totals
+
+        axis.isDirty = false;
+},
+
+/**
+ * Redraw the axis to reflect changes in the data or axis extremes
+ */
+redraw: function () {
+        var axis = this,
+                chart = axis.chart,
+                pointer = chart.pointer;
+
+        // hide tooltip and hover states
+        if (pointer) {
+                pointer.reset(true);
+        }
+
+        // render the axis
+        axis.render();
+
+        // move plot lines and bands
+        each(axis.plotLinesAndBands, function (plotLine) {
+                plotLine.render();
+        });
+
+        // mark associated series as dirty and ready for redraw
+        each(axis.series, function (series) {
+                series.isDirty = true;
+        });
+
+},
+
+/**
+ * Destroys an Axis instance.
+ */
+destroy: function (keepEvents) {
+        var axis = this,
+                stacks = axis.stacks,
+                stackKey,
+                plotLinesAndBands = axis.plotLinesAndBands,
+                i;
+
+        // Remove the events
+        if (!keepEvents) {
+                removeEvent(axis);
+        }
+
+        // Destroy each stack total
+        for (stackKey in stacks) {
+                destroyObjectProperties(stacks[stackKey]);
+
+                stacks[stackKey] = null;
+        }
+
+        // Destroy collections
+        each([axis.ticks, axis.minorTicks, axis.alternateBands], function (coll) {
+                destroyObjectProperties(coll);
+        });
+        i = plotLinesAndBands.length;
+        while (i--) { // #1975
+                plotLinesAndBands[i].destroy();
+        }
+
+        // Destroy local variables
+        each(['stackTotalGroup', 'axisLine', 'axisTitle', 'axisGroup', 'cross', 'gridGroup', 'labelGroup'], function (prop) {
+                if (axis[prop]) {
+                        axis[prop] = axis[prop].destroy();
+                }
+        });
+
+        // Destroy crosshair
+        if (this.cross) {
+                this.cross.destroy();
+        }
+},
+
+/**
+ * Draw the crosshair
+ */
+drawCrosshair: function (e, point) {
+        if (!this.crosshair) { return; }// Do not draw crosshairs if you don't have too.
+
+        if ((defined(point) || !pick(this.crosshair.snap, true)) === false) {
+                this.hideCrosshair();
+                return;
+        }
+
+        var path,
+                options = this.crosshair,
+                animation = options.animation,
+                pos;
+
+        // Get the path
+        if (!pick(options.snap, true)) {
+                pos = (this.horiz ? e.chartX - this.pos : this.len - e.chartY + this.pos);
+        } else if (defined(point)) {
+                /*jslint eqeq: true*/
+                pos = (this.chart.inverted != this.horiz) ? point.plotX : this.len - point.plotY;
+                /*jslint eqeq: false*/
+        }
+
+        if (this.isRadial) {
+                path = this.getPlotLinePath(this.isXAxis ? point.x : pick(point.stackY, point.y));
+        } else {
+                path = this.getPlotLinePath(null, null, null, null, pos);
+        }
+
+        if (path === null) {
+                this.hideCrosshair();
+                return;
+        }
+
+        // Draw the cross
+        if (this.cross) {
+                this.cross
+                        .attr({ visibility: VISIBLE })[animation ? 'animate' : 'attr']({ d: path }, animation);
+        } else {
+                var attribs = {
+                        'stroke-width': options.width || 1,
+                        stroke: options.color || '#C0C0C0',
+                        zIndex: options.zIndex || 2
+                };
+                if (options.dashStyle) {
+                        attribs.dashstyle = options.dashStyle;
+                }
+                this.cross = this.chart.renderer.path(path).attr(attribs).add();
+        }
+},
+
+/**
+ *      Hide the crosshair.
+ */
+hideCrosshair: function () {
+        if (this.cross) {
+                this.cross.hide();
+        }
+}
+ +

}; // end Axis

+ +

extend(Axis.prototype, AxisPlotLineOrBandExtension);

+ +

/**

+ +
* Set the tick positions to a time unit that makes sense, for example
+* on the first of each month or on every Monday. Return an array
+* with the time positions. Used in datetime axes as well as for grouping
+* data on a datetime axis.
+*
+* @param {Object} normalizedInterval The interval in axis values (ms) and the count
+* @param {Number} min The minimum in axis values
+* @param {Number} max The maximum in axis values
+* @param {Number} startOfWeek
+*/
+ +

Axis.prototype.getTimeTicks = function (normalizedInterval, min, max, startOfWeek) {

+ +
var tickPositions = [],
+        i,
+        higherRanks = {},
+        useUTC = defaultOptions.global.useUTC,
+        minYear, // used in months and years as a basis for Date.UTC()
+        minDate = new Date(min - timezoneOffset),
+        interval = normalizedInterval.unitRange,
+        count = normalizedInterval.count;
+
+if (defined(min)) { // #1300
+        if (interval >= timeUnits[SECOND]) { // second
+                minDate.setMilliseconds(0);
+                minDate.setSeconds(interval >= timeUnits[MINUTE] ? 0 :
+                        count * mathFloor(minDate.getSeconds() / count));
+        }
+
+        if (interval >= timeUnits[MINUTE]) { // minute
+                minDate[setMinutes](interval >= timeUnits[HOUR] ? 0 :
+                        count * mathFloor(minDate[getMinutes]() / count));
+        }
+
+        if (interval >= timeUnits[HOUR]) { // hour
+                minDate[setHours](interval >= timeUnits[DAY] ? 0 :
+                        count * mathFloor(minDate[getHours]() / count));
+        }
+
+        if (interval >= timeUnits[DAY]) { // day
+                minDate[setDate](interval >= timeUnits[MONTH] ? 1 :
+                        count * mathFloor(minDate[getDate]() / count));
+        }
+
+        if (interval >= timeUnits[MONTH]) { // month
+                minDate[setMonth](interval >= timeUnits[YEAR] ? 0 :
+                        count * mathFloor(minDate[getMonth]() / count));
+                minYear = minDate[getFullYear]();
+        }
+
+        if (interval >= timeUnits[YEAR]) { // year
+                minYear -= minYear % count;
+                minDate[setFullYear](minYear);
+        }
+
+        // week is a special case that runs outside the hierarchy
+        if (interval === timeUnits[WEEK]) {
+                // get start of current week, independent of count
+                minDate[setDate](minDate[getDate]() - minDate[getDay]() +
+                        pick(startOfWeek, 1));
+        }
+
+        // get tick positions
+        i = 1;
+        if (timezoneOffset) {
+                minDate = new Date(minDate.getTime() + timezoneOffset);
+        }
+        minYear = minDate[getFullYear]();
+        var time = minDate.getTime(),
+                minMonth = minDate[getMonth](),
+                minDateDate = minDate[getDate](),
+                localTimezoneOffset = useUTC ? 
+                        timezoneOffset : 
+                        (24 * 3600 * 1000 + minDate.getTimezoneOffset() * 60 * 1000) % (24 * 3600 * 1000); // #950
+
+        // iterate and add tick positions at appropriate values
+        while (time < max) {
+                tickPositions.push(time);
+
+                // if the interval is years, use Date.UTC to increase years
+                if (interval === timeUnits[YEAR]) {
+                        time = makeTime(minYear + i * count, 0);
+
+                // if the interval is months, use Date.UTC to increase months
+                } else if (interval === timeUnits[MONTH]) {
+                        time = makeTime(minYear, minMonth + i * count);
+
+                // if we're using global time, the interval is not fixed as it jumps
+                // one hour at the DST crossover
+                } else if (!useUTC && (interval === timeUnits[DAY] || interval === timeUnits[WEEK])) {
+                        time = makeTime(minYear, minMonth, minDateDate +
+                                i * count * (interval === timeUnits[DAY] ? 1 : 7));
+
+                // else, the interval is fixed and we use simple addition
+                } else {
+                        time += interval * count;
+                }
+
+                i++;
+        }
+
+        // push the last time
+        tickPositions.push(time);
+
+        // mark new days if the time is dividible by day (#1649, #1760)
+        each(grep(tickPositions, function (time) {
+                return interval <= timeUnits[HOUR] && time % timeUnits[DAY] === localTimezoneOffset;
+        }), function (time) {
+                higherRanks[time] = DAY;
+        });
+}
+
+// record information on the chosen unit - for dynamic label formatter
+tickPositions.info = extend(normalizedInterval, {
+        higherRanks: higherRanks,
+        totalRange: interval * count
+});
+
+return tickPositions;
+ +

};

+ +

/**

+ +
* Get a normalized tick interval for dates. Returns a configuration object with
+* unit range (interval), count and name. Used to prepare data for getTimeTicks. 
+* Previously this logic was part of getTimeTicks, but as getTimeTicks now runs
+* of segments in stock charts, the normalizing logic was extracted in order to 
+* prevent it for running over again for each segment having the same interval. 
+* #662, #697.
+*/
+ +

Axis.prototype.normalizeTimeTickInterval = function (tickInterval, unitsOption) {

+ +
var units = unitsOption || [[
+                        MILLISECOND, // unit name
+                        [1, 2, 5, 10, 20, 25, 50, 100, 200, 500] // allowed multiples
+                ], [
+                        SECOND,
+                        [1, 2, 5, 10, 15, 30]
+                ], [
+                        MINUTE,
+                        [1, 2, 5, 10, 15, 30]
+                ], [
+                        HOUR,
+                        [1, 2, 3, 4, 6, 8, 12]
+                ], [
+                        DAY,
+                        [1, 2]
+                ], [
+                        WEEK,
+                        [1, 2]
+                ], [
+                        MONTH,
+                        [1, 2, 3, 4, 6]
+                ], [
+                        YEAR,
+                        null
+                ]],
+        unit = units[units.length - 1], // default unit is years
+        interval = timeUnits[unit[0]],
+        multiples = unit[1],
+        count,
+        i;
+
+// loop through the units to find the one that best fits the tickInterval
+for (i = 0; i < units.length; i++) {
+        unit = units[i];
+        interval = timeUnits[unit[0]];
+        multiples = unit[1];
+
+        if (units[i + 1]) {
+                // lessThan is in the middle between the highest multiple and the next unit.
+                var lessThan = (interval * multiples[multiples.length - 1] +
+                                        timeUnits[units[i + 1][0]]) / 2;
+
+                // break and keep the current unit
+                if (tickInterval <= lessThan) {
+                        break;
+                }
+        }
+}
+
+// prevent 2.5 years intervals, though 25, 250 etc. are allowed
+if (interval === timeUnits[YEAR] && tickInterval < 5 * interval) {
+        multiples = [1, 2, 5];
+}
+
+// get the count
+count = normalizeTickInterval(
+        tickInterval / interval, 
+        multiples,
+        unit[0] === YEAR ? mathMax(getMagnitude(tickInterval / interval), 1) : 1 // #1913, #2360
+);
+
+return {
+        unitRange: interval,
+        count: count,
+        unitName: unit[0]
+};
+ +

};/**

+ +
* Methods defined on the Axis prototype
+*/
+ +

/**

+ +
* Set the tick positions of a logarithmic axis
+*/
+ +

Axis.prototype.getLogTickPositions = function (interval, min, max, minor) {

+ +
var axis = this,
+        options = axis.options,
+        axisLength = axis.len,
+        // Since we use this method for both major and minor ticks,
+        // use a local variable and return the result
+        positions = []; 
+
+// Reset
+if (!minor) {
+        axis._minorAutoInterval = null;
+}
+
+// First case: All ticks fall on whole logarithms: 1, 10, 100 etc.
+if (interval >= 0.5) {
+        interval = mathRound(interval);
+        positions = axis.getLinearTickPositions(interval, min, max);
+
+// Second case: We need intermediary ticks. For example 
+// 1, 2, 4, 6, 8, 10, 20, 40 etc. 
+} else if (interval >= 0.08) {
+        var roundedMin = mathFloor(min),
+                intermediate,
+                i,
+                j,
+                len,
+                pos,
+                lastPos,
+                break2;
+
+        if (interval > 0.3) {
+                intermediate = [1, 2, 4];
+        } else if (interval > 0.15) { // 0.2 equals five minor ticks per 1, 10, 100 etc
+                intermediate = [1, 2, 4, 6, 8];
+        } else { // 0.1 equals ten minor ticks per 1, 10, 100 etc
+                intermediate = [1, 2, 3, 4, 5, 6, 7, 8, 9];
+        }
+
+        for (i = roundedMin; i < max + 1 && !break2; i++) {
+                len = intermediate.length;
+                for (j = 0; j < len && !break2; j++) {
+                        pos = log2lin(lin2log(i) * intermediate[j]);
+
+                        if (pos > min && (!minor || lastPos <= max)) { // #1670
+                                positions.push(lastPos);
+                        }
+
+                        if (lastPos > max) {
+                                break2 = true;
+                        }
+                        lastPos = pos;
+                }
+        }
+
+// Third case: We are so deep in between whole logarithmic values that
+// we might as well handle the tick positions like a linear axis. For
+// example 1.01, 1.02, 1.03, 1.04.
+} else {
+        var realMin = lin2log(min),
+                realMax = lin2log(max),
+                tickIntervalOption = options[minor ? 'minorTickInterval' : 'tickInterval'],
+                filteredTickIntervalOption = tickIntervalOption === 'auto' ? null : tickIntervalOption,
+                tickPixelIntervalOption = options.tickPixelInterval / (minor ? 5 : 1),
+                totalPixelLength = minor ? axisLength / axis.tickPositions.length : axisLength;
+
+        interval = pick(
+                filteredTickIntervalOption,
+                axis._minorAutoInterval,
+                (realMax - realMin) * tickPixelIntervalOption / (totalPixelLength || 1)
+        );
+
+        interval = normalizeTickInterval(
+                interval, 
+                null, 
+                getMagnitude(interval)
+        );
+
+        positions = map(axis.getLinearTickPositions(
+                interval, 
+                realMin,
+                realMax 
+        ), log2lin);
+
+        if (!minor) {
+                axis._minorAutoInterval = interval / 5;
+        }
+}
+
+// Set the axis-level tickInterval variable 
+if (!minor) {
+        axis.tickInterval = interval;
+}
+return positions;
+ +

};/**

+ +
* The tooltip object
+* @param {Object} chart The chart instance
+* @param {Object} options Tooltip options
+*/
+ +

var Tooltip = Highcharts.Tooltip = function () {

+ +
this.init.apply(this, arguments);
+
+ +

};

+ +

Tooltip.prototype = {

+ +
init: function (chart, options) {
+
+        var borderWidth = options.borderWidth,
+                style = options.style,
+                padding = pInt(style.padding);
+
+        // Save the chart and options
+        this.chart = chart;
+        this.options = options;
+
+        // Keep track of the current series
+        //this.currentSeries = UNDEFINED;
+
+        // List of crosshairs
+        this.crosshairs = [];
+
+        // Current values of x and y when animating
+        this.now = { x: 0, y: 0 };
+
+        // The tooltip is initially hidden
+        this.isHidden = true;
+
+        // create the label
+        this.label = chart.renderer.label('', 0, 0, options.shape || 'callout', null, null, options.useHTML, null, 'tooltip')
+                .attr({
+                        padding: padding,
+                        fill: options.backgroundColor,
+                        'stroke-width': borderWidth,
+                        r: options.borderRadius,
+                        zIndex: 8
+                })
+                .css(style)
+                .css({ padding: 0 }) // Remove it from VML, the padding is applied as an attribute instead (#1117)
+                .add()
+                .attr({ y: -9999 }); // #2301, #2657
+
+        // When using canVG the shadow shows up as a gray circle
+        // even if the tooltip is hidden.
+        if (!useCanVG) {
+                this.label.shadow(options.shadow);
+        }
+
+        // Public property for getting the shared state.
+        this.shared = options.shared;
+},
+
+/**
+ * Destroy the tooltip and its elements.
+ */
+destroy: function () {
+        // Destroy and clear local variables
+        if (this.label) {
+                this.label = this.label.destroy();
+        }
+        clearTimeout(this.hideTimer);
+        clearTimeout(this.tooltipTimeout);
+},
+
+/**
+ * Provide a soft movement for the tooltip
+ *
+ * @param {Number} x
+ * @param {Number} y
+ * @private
+ */
+move: function (x, y, anchorX, anchorY) {
+        var tooltip = this,
+                now = tooltip.now,
+                animate = tooltip.options.animation !== false && !tooltip.isHidden,
+                skipAnchor = tooltip.followPointer || tooltip.len > 1;
+
+        // get intermediate values for animation
+        extend(now, {
+                x: animate ? (2 * now.x + x) / 3 : x,
+                y: animate ? (now.y + y) / 2 : y,
+                anchorX: skipAnchor ? UNDEFINED : animate ? (2 * now.anchorX + anchorX) / 3 : anchorX,
+                anchorY: skipAnchor ? UNDEFINED : animate ? (now.anchorY + anchorY) / 2 : anchorY
+        });
+
+        // move to the intermediate value
+        tooltip.label.attr(now);
+
+        // run on next tick of the mouse tracker
+        if (animate && (mathAbs(x - now.x) > 1 || mathAbs(y - now.y) > 1)) {
+
+                // never allow two timeouts
+                clearTimeout(this.tooltipTimeout);
+
+                // set the fixed interval ticking for the smooth tooltip
+                this.tooltipTimeout = setTimeout(function () {
+                        // The interval function may still be running during destroy, so check that the chart is really there before calling.
+                        if (tooltip) {
+                                tooltip.move(x, y, anchorX, anchorY);
+                        }
+                }, 32);
+
+        }
+},
+
+/**
+ * Hide the tooltip
+ */
+hide: function () {
+        var tooltip = this,
+                hoverPoints;
+
+        clearTimeout(this.hideTimer); // disallow duplicate timers (#1728, #1766)
+        if (!this.isHidden) {
+                hoverPoints = this.chart.hoverPoints;
+
+                this.hideTimer = setTimeout(function () {
+                        tooltip.label.fadeOut();
+                        tooltip.isHidden = true;
+                }, pick(this.options.hideDelay, 500));
+
+                // hide previous hoverPoints and set new
+                if (hoverPoints) {
+                        each(hoverPoints, function (point) {
+                                point.setState();
+                        });
+                }
+
+                this.chart.hoverPoints = null;
+        }
+},
+
+/** 
+ * Extendable method to get the anchor position of the tooltip
+ * from a point or set of points
+ */
+getAnchor: function (points, mouseEvent) {
+        var ret,
+                chart = this.chart,
+                inverted = chart.inverted,
+                plotTop = chart.plotTop,
+                plotX = 0,
+                plotY = 0,
+                yAxis;
+
+        points = splat(points);
+
+        // Pie uses a special tooltipPos
+        ret = points[0].tooltipPos;
+
+        // When tooltip follows mouse, relate the position to the mouse
+        if (this.followPointer && mouseEvent) {
+                if (mouseEvent.chartX === UNDEFINED) {
+                        mouseEvent = chart.pointer.normalize(mouseEvent);
+                }
+                ret = [
+                        mouseEvent.chartX - chart.plotLeft,
+                        mouseEvent.chartY - plotTop
+                ];
+        }
+        // When shared, use the average position
+        if (!ret) {
+                each(points, function (point) {
+                        yAxis = point.series.yAxis;
+                        plotX += point.plotX;
+                        plotY += (point.plotLow ? (point.plotLow + point.plotHigh) / 2 : point.plotY) +
+                                (!inverted && yAxis ? yAxis.top - plotTop : 0); // #1151
+                });
+
+                plotX /= points.length;
+                plotY /= points.length;
+
+                ret = [
+                        inverted ? chart.plotWidth - plotY : plotX,
+                        this.shared && !inverted && points.length > 1 && mouseEvent ? 
+                                mouseEvent.chartY - plotTop : // place shared tooltip next to the mouse (#424)
+                                inverted ? chart.plotHeight - plotX : plotY
+                ];
+        }
+
+        return map(ret, mathRound);
+},
+
+/**
+ * Place the tooltip in a chart without spilling over
+ * and not covering the point it self.
+ */
+getPosition: function (boxWidth, boxHeight, point) {
+
+        var chart = this.chart,
+                distance = this.distance,
+                ret = {},
+                swapped,
+                first = ['y', chart.chartHeight, boxHeight, point.plotY + chart.plotTop],
+                second = ['x', chart.chartWidth, boxWidth, point.plotX + chart.plotLeft],
+                // The far side is right or bottom
+                preferFarSide = point.ttBelow || (chart.inverted && !point.negative) || (!chart.inverted && point.negative),
+                /**
+                 * Handle the preferred dimension. When the preferred dimension is tooltip
+                 * on top or bottom of the point, it will look for space there.
+                 */
+                firstDimension = function (dim, outerSize, innerSize, point) {
+                        var roomLeft = innerSize < point - distance,
+                                roomRight = point + distance + innerSize < outerSize,
+                                alignedLeft = point - distance - innerSize,
+                                alignedRight = point + distance;
+
+                        if (preferFarSide && roomRight) {
+                                ret[dim] = alignedRight;
+                        } else if (!preferFarSide && roomLeft) {
+                                ret[dim] = alignedLeft;
+                        } else if (roomLeft) {
+                                ret[dim] = alignedLeft;
+                        } else if (roomRight) {
+                                ret[dim] = alignedRight;
+                        } else {
+                                return false;
+                        }
+                },
+                /**
+                 * Handle the secondary dimension. If the preferred dimension is tooltip
+                 * on top or bottom of the point, the second dimension is to align the tooltip
+                 * above the point, trying to align center but allowing left or right
+                 * align within the chart box.
+                 */
+                secondDimension = function (dim, outerSize, innerSize, point) {
+                        // Too close to the edge, return false and swap dimensions
+                        if (point < distance || point > outerSize - distance) {
+                                return false;
+
+                        // Align left/top
+                        } else if (point < innerSize / 2) {
+                                ret[dim] = 1;
+                        // Align right/bottom
+                        } else if (point > outerSize - innerSize / 2) {
+                                ret[dim] = outerSize - innerSize - 2;
+                        // Align center
+                        } else {
+                                ret[dim] = point - innerSize / 2;
+                        }
+                },
+                /**
+                 * Swap the dimensions 
+                 */
+                swap = function (count) {
+                        var temp = first;
+                        first = second;
+                        second = temp;
+                        swapped = count;
+                },
+                run = function () {
+                        if (firstDimension.apply(0, first) !== false) {
+                                if (secondDimension.apply(0, second) === false && !swapped) {
+                                        swap(true);
+                                        run();
+                                }
+                        } else if (!swapped) {
+                                swap(true);
+                                run();
+                        } else {
+                                ret.x = ret.y = 0;
+                        }
+                };
+
+        // Under these conditions, prefer the tooltip on the side of the point
+        if (chart.inverted || this.len > 1) {
+                swap();
+        }
+        run();
+
+        return ret;
+
+},
+
+/**
+ * In case no user defined formatter is given, this will be used. Note that the context
+ * here is an object holding point, series, x, y etc.
+ */
+defaultFormatter: function (tooltip) {
+        var items = this.points || splat(this),
+                series = items[0].series,
+                s;
+
+        // build the header
+        s = [tooltip.tooltipHeaderFormatter(items[0])];
+
+        // build the values
+        each(items, function (item) {
+                series = item.series;
+                s.push((series.tooltipFormatter && series.tooltipFormatter(item)) ||
+                        item.point.tooltipFormatter(series.tooltipOptions.pointFormat));
+        });
+
+        // footer
+        s.push(tooltip.options.footerFormat || '');
+
+        return s.join('');
+},
+
+/**
+ * Refresh the tooltip's text and position.
+ * @param {Object} point
+ */
+refresh: function (point, mouseEvent) {
+        var tooltip = this,
+                chart = tooltip.chart,
+                label = tooltip.label,
+                options = tooltip.options,
+                x,
+                y,
+                anchor,
+                textConfig = {},
+                text,
+                pointConfig = [],
+                formatter = options.formatter || tooltip.defaultFormatter,
+                hoverPoints = chart.hoverPoints,
+                borderColor,
+                shared = tooltip.shared,
+                currentSeries;
+
+        clearTimeout(this.hideTimer);
+
+        // get the reference point coordinates (pie charts use tooltipPos)
+        tooltip.followPointer = splat(point)[0].series.tooltipOptions.followPointer;
+        anchor = tooltip.getAnchor(point, mouseEvent);
+        x = anchor[0];
+        y = anchor[1];
+
+        // shared tooltip, array is sent over
+        if (shared && !(point.series && point.series.noSharedTooltip)) {
+
+                // hide previous hoverPoints and set new
+
+                chart.hoverPoints = point;
+                if (hoverPoints) {
+                        each(hoverPoints, function (point) {
+                                point.setState();
+                        });
+                }
+
+                each(point, function (item) {
+                        item.setState(HOVER_STATE);
+
+                        pointConfig.push(item.getLabelConfig());
+                });
+
+                textConfig = {
+                        x: point[0].category,
+                        y: point[0].y
+                };
+                textConfig.points = pointConfig;
+                this.len = pointConfig.length;
+                point = point[0];
+
+        // single point tooltip
+        } else {
+                textConfig = point.getLabelConfig();
+        }
+        text = formatter.call(textConfig, tooltip);
+
+        // register the current series
+        currentSeries = point.series;
+        this.distance = pick(currentSeries.tooltipOptions.distance, 16);
+
+        // update the inner HTML
+        if (text === false) {
+                this.hide();
+        } else {
+
+                // show it
+                if (tooltip.isHidden) {
+                        stop(label);
+                        label.attr('opacity', 1).show();
+                }
+
+                // update text
+                label.attr({
+                        text: text
+                });
+
+                // set the stroke color of the box
+                borderColor = options.borderColor || point.color || currentSeries.color || '#606060';
+                label.attr({
+                        stroke: borderColor
+                });
+
+                tooltip.updatePosition({ plotX: x, plotY: y, negative: point.negative, ttBelow: point.ttBelow });
+
+                this.isHidden = false;
+        }
+        fireEvent(chart, 'tooltipRefresh', {
+                        text: text,
+                        x: x + chart.plotLeft,
+                        y: y + chart.plotTop,
+                        borderColor: borderColor
+                });
+},
+
+/**
+ * Find the new position and perform the move
+ */
+updatePosition: function (point) {
+        var chart = this.chart,
+                label = this.label, 
+                pos = (this.options.positioner || this.getPosition).call(
+                        this,
+                        label.width,
+                        label.height,
+                        point
+                );
+
+        // do the move
+        this.move(
+                mathRound(pos.x), 
+                mathRound(pos.y), 
+                point.plotX + chart.plotLeft, 
+                point.plotY + chart.plotTop
+        );
+},
+
+/**
+ * Format the header of the tooltip
+ */
+tooltipHeaderFormatter: function (point) {
+        var series = point.series,
+                tooltipOptions = series.tooltipOptions,
+                dateTimeLabelFormats = tooltipOptions.dateTimeLabelFormats,
+                xDateFormat = tooltipOptions.xDateFormat,
+                xAxis = series.xAxis,
+                isDateTime = xAxis && xAxis.options.type === 'datetime' && isNumber(point.key),
+                headerFormat = tooltipOptions.headerFormat,
+                closestPointRange = xAxis && xAxis.closestPointRange,
+                n;
+
+        // Guess the best date format based on the closest point distance (#568)
+        if (isDateTime && !xDateFormat) {
+                if (closestPointRange) {
+                        for (n in timeUnits) {
+                                if (timeUnits[n] >= closestPointRange || 
+                                                // If the point is placed every day at 23:59, we need to show
+                                                // the minutes as well. This logic only works for time units less than 
+                                                // a day, since all higher time units are dividable by those. #2637.
+                                                (timeUnits[n] <= timeUnits[DAY] && point.key % timeUnits[n] > 0)) {
+                                        xDateFormat = dateTimeLabelFormats[n];
+                                        break;
+                                }
+                        }
+                } else {
+                        xDateFormat = dateTimeLabelFormats.day;
+                }
+
+                xDateFormat = xDateFormat || dateTimeLabelFormats.year; // #2546, 2581
+
+        }
+
+        // Insert the header date format if any
+        if (isDateTime && xDateFormat) {
+                headerFormat = headerFormat.replace('{point.key}', '{point.key:' + xDateFormat + '}');
+        }
+
+        return format(headerFormat, {
+                point: point,
+                series: series
+        });
+}
+ +

};

+ +

var hoverChartIndex;

+ +

// Global flag for touch support hasTouch = doc.documentElement.ontouchstart !== UNDEFINED;

+ +

/**

+ +
* The mouse tracker object. All methods starting with "on" are primary DOM event handlers. 
+* Subsequent methods should be named differently from what they are doing.
+* @param {Object} chart The Chart instance
+* @param {Object} options The root options object
+*/
+ +

var Pointer = Highcharts.Pointer = function (chart, options) {

+ +
this.init(chart, options);
+
+ +

};

+ +

Pointer.prototype = {

+ +
/**
+ * Initialize Pointer
+ */
+init: function (chart, options) {
+
+        var chartOptions = options.chart,
+                chartEvents = chartOptions.events,
+                zoomType = useCanVG ? '' : chartOptions.zoomType,
+                inverted = chart.inverted,
+                zoomX,
+                zoomY;
+
+        // Store references
+        this.options = options;
+        this.chart = chart;
+
+        // Zoom status
+        this.zoomX = zoomX = /x/.test(zoomType);
+        this.zoomY = zoomY = /y/.test(zoomType);
+        this.zoomHor = (zoomX && !inverted) || (zoomY && inverted);
+        this.zoomVert = (zoomY && !inverted) || (zoomX && inverted);
+        this.hasZoom = zoomX || zoomY;
+
+        // Do we need to handle click on a touch device?
+        this.runChartClick = chartEvents && !!chartEvents.click;
+
+        this.pinchDown = [];
+        this.lastValidTouch = {};
+
+        if (Highcharts.Tooltip && options.tooltip.enabled) {
+                chart.tooltip = new Tooltip(chart, options.tooltip);
+                this.followTouchMove = options.tooltip.followTouchMove;
+        }
+
+        this.setDOMEvents();
+}, 
+
+/**
+ * Add crossbrowser support for chartX and chartY
+ * @param {Object} e The event object in standard browsers
+ */
+normalize: function (e, chartPosition) {
+        var chartX,
+                chartY,
+                ePos;
+
+        // common IE normalizing
+        e = e || window.event;
+
+        // Framework specific normalizing (#1165)
+        e = washMouseEvent(e);
+
+        // More IE normalizing, needs to go after washMouseEvent
+        if (!e.target) {
+                e.target = e.srcElement;
+        }
+
+        // iOS (#2757)
+        ePos = e.touches ?  (e.touches.length ? e.touches.item(0) : e.changedTouches[0]) : e;
+
+        // Get mouse position
+        if (!chartPosition) {
+                this.chartPosition = chartPosition = offset(this.chart.container);
+        }
+
+        // chartX and chartY
+        if (ePos.pageX === UNDEFINED) { // IE < 9. #886.
+                chartX = mathMax(e.x, e.clientX - chartPosition.left); // #2005, #2129: the second case is 
+                        // for IE10 quirks mode within framesets
+                chartY = e.y;
+        } else {
+                chartX = ePos.pageX - chartPosition.left;
+                chartY = ePos.pageY - chartPosition.top;
+        }
+
+        return extend(e, {
+                chartX: mathRound(chartX),
+                chartY: mathRound(chartY)
+        });
+},
+
+/**
+ * Get the click position in terms of axis values.
+ *
+ * @param {Object} e A pointer event
+ */
+getCoordinates: function (e) {
+        var coordinates = {
+                        xAxis: [],
+                        yAxis: []
+                };
+
+        each(this.chart.axes, function (axis) {
+                coordinates[axis.isXAxis ? 'xAxis' : 'yAxis'].push({
+                        axis: axis,
+                        value: axis.toValue(e[axis.horiz ? 'chartX' : 'chartY'])
+                });
+        });
+        return coordinates;
+},
+
+/**
+ * Return the index in the tooltipPoints array, corresponding to pixel position in 
+ * the plot area.
+ */
+getIndex: function (e) {
+        var chart = this.chart;
+        return chart.inverted ? 
+                chart.plotHeight + chart.plotTop - e.chartY : 
+                e.chartX - chart.plotLeft;
+},
+
+/**
+ * With line type charts with a single tracker, get the point closest to the mouse.
+ * Run Point.onMouseOver and display tooltip for the point or points.
+ */
+runPointActions: function (e) {
+        var pointer = this,
+                chart = pointer.chart,
+                series = chart.series,
+                tooltip = chart.tooltip,
+                followPointer,
+                point,
+                points,
+                hoverPoint = chart.hoverPoint,
+                hoverSeries = chart.hoverSeries,
+                i,
+                j,
+                distance = chart.chartWidth,
+                index = pointer.getIndex(e),
+                anchor;
+
+        // shared tooltip
+        if (tooltip && pointer.options.tooltip.shared && !(hoverSeries && hoverSeries.noSharedTooltip)) {
+                points = [];
+
+                // loop over all series and find the ones with points closest to the mouse
+                i = series.length;
+                for (j = 0; j < i; j++) {
+                        if (series[j].visible &&
+                                        series[j].options.enableMouseTracking !== false &&
+                                        !series[j].noSharedTooltip && series[j].singularTooltips !== true && series[j].tooltipPoints.length) {
+                                point = series[j].tooltipPoints[index];
+                                if (point && point.series) { // not a dummy point, #1544
+                                        point._dist = mathAbs(index - point.clientX);
+                                        distance = mathMin(distance, point._dist);
+                                        points.push(point);
+                                }
+                        }
+                }
+                // remove furthest points
+                i = points.length;
+                while (i--) {
+                        if (points[i]._dist > distance) {
+                                points.splice(i, 1);
+                        }
+                }
+                // refresh the tooltip if necessary
+                if (points.length && (points[0].clientX !== pointer.hoverX)) {
+                        tooltip.refresh(points, e);
+                        pointer.hoverX = points[0].clientX;
+                }
+        }
+
+        // Separate tooltip and general mouse events
+        followPointer = hoverSeries && hoverSeries.tooltipOptions.followPointer;
+        if (hoverSeries && hoverSeries.tracker && !followPointer) { // #2584, #2830
+
+                // get the point
+                point = hoverSeries.tooltipPoints[index];
+
+                // a new point is hovered, refresh the tooltip
+                if (point && point !== hoverPoint) {
+
+                        // trigger the events
+                        point.onMouseOver(e);
+
+                }
+
+        } else if (tooltip && followPointer && !tooltip.isHidden) {
+                anchor = tooltip.getAnchor([{}], e);
+                tooltip.updatePosition({ plotX: anchor[0], plotY: anchor[1] });
+        }
+
+        // Start the event listener to pick up the tooltip 
+        if (tooltip && !pointer._onDocumentMouseMove) {
+                pointer._onDocumentMouseMove = function (e) {
+                        if (charts[hoverChartIndex]) {
+                                charts[hoverChartIndex].pointer.onDocumentMouseMove(e);
+                        }
+                };
+                addEvent(doc, 'mousemove', pointer._onDocumentMouseMove);
+        }
+
+        // Draw independent crosshairs
+        each(chart.axes, function (axis) {
+                axis.drawCrosshair(e, pick(point, hoverPoint));
+        });
+},
+
+/**
+ * Reset the tracking by hiding the tooltip, the hover series state and the hover point
+ * 
+ * @param allowMove {Boolean} Instead of destroying the tooltip altogether, allow moving it if possible
+ */
+reset: function (allowMove) {
+        var pointer = this,
+                chart = pointer.chart,
+                hoverSeries = chart.hoverSeries,
+                hoverPoint = chart.hoverPoint,
+                tooltip = chart.tooltip,
+                tooltipPoints = tooltip && tooltip.shared ? chart.hoverPoints : hoverPoint;
+
+        // Narrow in allowMove
+        allowMove = allowMove && tooltip && tooltipPoints;
+
+        // Check if the points have moved outside the plot area, #1003
+        if (allowMove && splat(tooltipPoints)[0].plotX === UNDEFINED) {
+                allowMove = false;
+        }       
+
+        // Just move the tooltip, #349
+        if (allowMove) {
+                tooltip.refresh(tooltipPoints);
+                if (hoverPoint) { // #2500
+                        hoverPoint.setState(hoverPoint.state, true);
+                }
+
+        // Full reset
+        } else {
+
+                if (hoverPoint) {
+                        hoverPoint.onMouseOut();
+                }
+
+                if (hoverSeries) {
+                        hoverSeries.onMouseOut();
+                }
+
+                if (tooltip) {
+                        tooltip.hide();
+                }
+
+                if (pointer._onDocumentMouseMove) {
+                        removeEvent(doc, 'mousemove', pointer._onDocumentMouseMove);
+                        pointer._onDocumentMouseMove = null;
+                }
+
+                // Remove crosshairs
+                each(chart.axes, function (axis) {
+                        axis.hideCrosshair();
+                });
+
+                pointer.hoverX = null;
+
+        }
+},
+
+/**
+ * Scale series groups to a certain scale and translation
+ */
+scaleGroups: function (attribs, clip) {
+
+        var chart = this.chart,
+                seriesAttribs;
+
+        // Scale each series
+        each(chart.series, function (series) {
+                seriesAttribs = attribs || series.getPlotBox(); // #1701
+                if (series.xAxis && series.xAxis.zoomEnabled) {
+                        series.group.attr(seriesAttribs);
+                        if (series.markerGroup) {
+                                series.markerGroup.attr(seriesAttribs);
+                                series.markerGroup.clip(clip ? chart.clipRect : null);
+                        }
+                        if (series.dataLabelsGroup) {
+                                series.dataLabelsGroup.attr(seriesAttribs);
+                        }
+                }
+        });
+
+        // Clip
+        chart.clipRect.attr(clip || chart.clipBox);
+},
+
+/**
+ * Start a drag operation
+ */
+dragStart: function (e) {
+        var chart = this.chart;
+
+        // Record the start position
+        chart.mouseIsDown = e.type;
+        chart.cancelClick = false;
+        chart.mouseDownX = this.mouseDownX = e.chartX;
+        chart.mouseDownY = this.mouseDownY = e.chartY;
+},
+
+/**
+ * Perform a drag operation in response to a mousemove event while the mouse is down
+ */
+drag: function (e) {
+
+        var chart = this.chart,
+                chartOptions = chart.options.chart,
+                chartX = e.chartX,
+                chartY = e.chartY,
+                zoomHor = this.zoomHor,
+                zoomVert = this.zoomVert,
+                plotLeft = chart.plotLeft,
+                plotTop = chart.plotTop,
+                plotWidth = chart.plotWidth,
+                plotHeight = chart.plotHeight,
+                clickedInside,
+                size,
+                mouseDownX = this.mouseDownX,
+                mouseDownY = this.mouseDownY;
+
+        // If the mouse is outside the plot area, adjust to cooordinates
+        // inside to prevent the selection marker from going outside
+        if (chartX < plotLeft) {
+                chartX = plotLeft;
+        } else if (chartX > plotLeft + plotWidth) {
+                chartX = plotLeft + plotWidth;
+        }
+
+        if (chartY < plotTop) {
+                chartY = plotTop;
+        } else if (chartY > plotTop + plotHeight) {
+                chartY = plotTop + plotHeight;
+        }
+
+        // determine if the mouse has moved more than 10px
+        this.hasDragged = Math.sqrt(
+                Math.pow(mouseDownX - chartX, 2) +
+                Math.pow(mouseDownY - chartY, 2)
+        );
+
+        if (this.hasDragged > 10) {
+                clickedInside = chart.isInsidePlot(mouseDownX - plotLeft, mouseDownY - plotTop);
+
+                // make a selection
+                if (chart.hasCartesianSeries && (this.zoomX || this.zoomY) && clickedInside) {
+                        if (!this.selectionMarker) {
+                                this.selectionMarker = chart.renderer.rect(
+                                        plotLeft,
+                                        plotTop,
+                                        zoomHor ? 1 : plotWidth,
+                                        zoomVert ? 1 : plotHeight,
+                                        0
+                                )
+                                .attr({
+                                        fill: chartOptions.selectionMarkerFill || 'rgba(69,114,167,0.25)',
+                                        zIndex: 7
+                                })
+                                .add();
+                        }
+                }
+
+                // adjust the width of the selection marker
+                if (this.selectionMarker && zoomHor) {
+                        size = chartX - mouseDownX;
+                        this.selectionMarker.attr({
+                                width: mathAbs(size),
+                                x: (size > 0 ? 0 : size) + mouseDownX
+                        });
+                }
+                // adjust the height of the selection marker
+                if (this.selectionMarker && zoomVert) {
+                        size = chartY - mouseDownY;
+                        this.selectionMarker.attr({
+                                height: mathAbs(size),
+                                y: (size > 0 ? 0 : size) + mouseDownY
+                        });
+                }
+
+                // panning
+                if (clickedInside && !this.selectionMarker && chartOptions.panning) {
+                        chart.pan(e, chartOptions.panning);
+                }
+        }
+},
+
+/**
+ * On mouse up or touch end across the entire document, drop the selection.
+ */
+drop: function (e) {
+        var chart = this.chart,
+                hasPinched = this.hasPinched;
+
+        if (this.selectionMarker) {
+                var selectionData = {
+                                xAxis: [],
+                                yAxis: [],
+                                originalEvent: e.originalEvent || e
+                        },
+                        selectionBox = this.selectionMarker,
+                        selectionLeft = selectionBox.attr ? selectionBox.attr('x') : selectionBox.x,
+                        selectionTop = selectionBox.attr ? selectionBox.attr('y') : selectionBox.y,
+                        selectionWidth = selectionBox.attr ? selectionBox.attr('width') : selectionBox.width,
+                        selectionHeight = selectionBox.attr ? selectionBox.attr('height') : selectionBox.height,
+                        runZoom;
+
+                // a selection has been made
+                if (this.hasDragged || hasPinched) {
+
+                        // record each axis' min and max
+                        each(chart.axes, function (axis) {
+                                if (axis.zoomEnabled) {
+                                        var horiz = axis.horiz,
+                                                selectionMin = axis.toValue((horiz ? selectionLeft : selectionTop)),
+                                                selectionMax = axis.toValue((horiz ? selectionLeft + selectionWidth : selectionTop + selectionHeight));
+
+                                        if (!isNaN(selectionMin) && !isNaN(selectionMax)) { // #859
+                                                selectionData[axis.coll].push({
+                                                        axis: axis,
+                                                        min: mathMin(selectionMin, selectionMax), // for reversed axes,
+                                                        max: mathMax(selectionMin, selectionMax)
+                                                });
+                                                runZoom = true;
+                                        }
+                                }
+                        });
+                        if (runZoom) {
+                                fireEvent(chart, 'selection', selectionData, function (args) { 
+                                        chart.zoom(extend(args, hasPinched ? { animation: false } : null)); 
+                                });
+                        }
+
+                }
+                this.selectionMarker = this.selectionMarker.destroy();
+
+                // Reset scaling preview
+                if (hasPinched) {
+                        this.scaleGroups();
+                }
+        }
+
+        // Reset all
+        if (chart) { // it may be destroyed on mouse up - #877
+                css(chart.container, { cursor: chart._cursor });
+                chart.cancelClick = this.hasDragged > 10; // #370
+                chart.mouseIsDown = this.hasDragged = this.hasPinched = false;
+                this.pinchDown = [];
+        }
+},
+
+onContainerMouseDown: function (e) {
+
+        e = this.normalize(e);
+
+        // issue #295, dragging not always working in Firefox
+        if (e.preventDefault) {
+                e.preventDefault();
+        }
+
+        this.dragStart(e);
+},
+
+onDocumentMouseUp: function (e) {
+        if (charts[hoverChartIndex]) {
+                charts[hoverChartIndex].pointer.drop(e);
+        }
+},
+
+/**
+ * Special handler for mouse move that will hide the tooltip when the mouse leaves the plotarea.
+ * Issue #149 workaround. The mouseleave event does not always fire. 
+ */
+onDocumentMouseMove: function (e) {
+        var chart = this.chart,
+                chartPosition = this.chartPosition,
+                hoverSeries = chart.hoverSeries;
+
+        e = this.normalize(e, chartPosition);
+
+        // If we're outside, hide the tooltip
+        if (chartPosition && hoverSeries && !this.inClass(e.target, 'highcharts-tracker') &&
+                        !chart.isInsidePlot(e.chartX - chart.plotLeft, e.chartY - chart.plotTop)) {
+                this.reset();
+        }
+},
+
+/**
+ * When mouse leaves the container, hide the tooltip.
+ */
+onContainerMouseLeave: function () {
+        var chart = charts[hoverChartIndex];
+        if (chart) {
+                chart.pointer.reset();
+                chart.pointer.chartPosition = null; // also reset the chart position, used in #149 fix
+        }
+},
+
+// The mousemove, touchmove and touchstart event handler
+onContainerMouseMove: function (e) {
+
+        var chart = this.chart;
+
+        hoverChartIndex = chart.index;
+
+        // normalize
+        e = this.normalize(e);          
+
+        if (chart.mouseIsDown === 'mousedown') {
+                this.drag(e);
+        } 
+
+        // Show the tooltip and run mouse over events (#977)
+        if ((this.inClass(e.target, 'highcharts-tracker') || 
+                        chart.isInsidePlot(e.chartX - chart.plotLeft, e.chartY - chart.plotTop)) && !chart.openMenu) {
+                this.runPointActions(e);
+        }
+},
+
+/**
+ * Utility to detect whether an element has, or has a parent with, a specific
+ * class name. Used on detection of tracker objects and on deciding whether
+ * hovering the tooltip should cause the active series to mouse out.
+ */
+inClass: function (element, className) {
+        var elemClassName;
+        while (element) {
+                elemClassName = attr(element, 'class');
+                if (elemClassName) {
+                        if (elemClassName.indexOf(className) !== -1) {
+                                return true;
+                        } else if (elemClassName.indexOf(PREFIX + 'container') !== -1) {
+                                return false;
+                        }
+                }
+                element = element.parentNode;
+        }               
+},
+
+onTrackerMouseOut: function (e) {
+        var series = this.chart.hoverSeries,
+                relatedTarget = e.relatedTarget || e.toElement,
+                relatedSeries = relatedTarget && relatedTarget.point && relatedTarget.point.series; // #2499
+
+        if (series && !series.options.stickyTracking && !this.inClass(relatedTarget, PREFIX + 'tooltip') &&
+                        relatedSeries !== series) {
+                series.onMouseOut();
+        }
+},
+
+onContainerClick: function (e) {
+        var chart = this.chart,
+                hoverPoint = chart.hoverPoint, 
+                plotLeft = chart.plotLeft,
+                plotTop = chart.plotTop;
+
+        e = this.normalize(e);
+        e.cancelBubble = true; // IE specific
+
+        if (!chart.cancelClick) {
+
+                // On tracker click, fire the series and point events. #783, #1583
+                if (hoverPoint && this.inClass(e.target, PREFIX + 'tracker')) {
+
+                        // the series click event
+                        fireEvent(hoverPoint.series, 'click', extend(e, {
+                                point: hoverPoint
+                        }));
+
+                        // the point click event
+                        if (chart.hoverPoint) { // it may be destroyed (#1844)
+                                hoverPoint.firePointEvent('click', e);
+                        }
+
+                // When clicking outside a tracker, fire a chart event
+                } else {
+                        extend(e, this.getCoordinates(e));
+
+                        // fire a click event in the chart
+                        if (chart.isInsidePlot(e.chartX - plotLeft, e.chartY - plotTop)) {
+                                fireEvent(chart, 'click', e);
+                        }
+                }
+
+        }
+},
+
+/**
+ * Set the JS DOM events on the container and document. This method should contain
+ * a one-to-one assignment between methods and their handlers. Any advanced logic should
+ * be moved to the handler reflecting the event's name.
+ */
+setDOMEvents: function () {
+
+        var pointer = this,
+                container = pointer.chart.container;
+
+        container.onmousedown = function (e) {
+                pointer.onContainerMouseDown(e);
+        };
+        container.onmousemove = function (e) {
+                pointer.onContainerMouseMove(e);
+        };
+        container.onclick = function (e) {
+                pointer.onContainerClick(e);
+        };
+        addEvent(container, 'mouseleave', pointer.onContainerMouseLeave);
+        if (chartCount === 1) {
+                addEvent(doc, 'mouseup', pointer.onDocumentMouseUp);
+        }
+        if (hasTouch) {
+                container.ontouchstart = function (e) {
+                        pointer.onContainerTouchStart(e);
+                };
+                container.ontouchmove = function (e) {
+                        pointer.onContainerTouchMove(e);
+                };
+                if (chartCount === 1) {
+                        addEvent(doc, 'touchend', pointer.onDocumentTouchEnd);
+                }
+        }
+
+},
+
+/**
+ * Destroys the Pointer object and disconnects DOM events.
+ */
+destroy: function () {
+        var prop;
+
+        removeEvent(this.chart.container, 'mouseleave', this.onContainerMouseLeave);
+        if (!chartCount) {
+                removeEvent(doc, 'mouseup', this.onDocumentMouseUp);
+                removeEvent(doc, 'touchend', this.onDocumentTouchEnd);
+        }
+
+        // memory and CPU leak
+        clearInterval(this.tooltipTimeout);
+
+        for (prop in this) {
+                this[prop] = null;
+        }
+}
+ +

};

+ +

/* Support for touch devices */ extend(Highcharts.Pointer.prototype, {

+ +
/**
+ * Run translation operations
+ */
+pinchTranslate: function (pinchDown, touches, transform, selectionMarker, clip, lastValidTouch) {
+        if (this.zoomHor || this.pinchHor) {
+                this.pinchTranslateDirection(true, pinchDown, touches, transform, selectionMarker, clip, lastValidTouch);
+        }
+        if (this.zoomVert || this.pinchVert) {
+                this.pinchTranslateDirection(false, pinchDown, touches, transform, selectionMarker, clip, lastValidTouch);
+        }
+},
+
+/**
+ * Run translation operations for each direction (horizontal and vertical) independently
+ */
+pinchTranslateDirection: function (horiz, pinchDown, touches, transform, selectionMarker, clip, lastValidTouch, forcedScale) {
+        var chart = this.chart,
+                xy = horiz ? 'x' : 'y',
+                XY = horiz ? 'X' : 'Y',
+                sChartXY = 'chart' + XY,
+                wh = horiz ? 'width' : 'height',
+                plotLeftTop = chart['plot' + (horiz ? 'Left' : 'Top')],
+                selectionWH,
+                selectionXY,
+                clipXY,
+                scale = forcedScale || 1,
+                inverted = chart.inverted,
+                bounds = chart.bounds[horiz ? 'h' : 'v'],
+                singleTouch = pinchDown.length === 1,
+                touch0Start = pinchDown[0][sChartXY],
+                touch0Now = touches[0][sChartXY],
+                touch1Start = !singleTouch && pinchDown[1][sChartXY],
+                touch1Now = !singleTouch && touches[1][sChartXY],
+                outOfBounds,
+                transformScale,
+                scaleKey,
+                setScale = function () {
+                        if (!singleTouch && mathAbs(touch0Start - touch1Start) > 20) { // Don't zoom if fingers are too close on this axis
+                                scale = forcedScale || mathAbs(touch0Now - touch1Now) / mathAbs(touch0Start - touch1Start); 
+                        }
+
+                        clipXY = ((plotLeftTop - touch0Now) / scale) + touch0Start;
+                        selectionWH = chart['plot' + (horiz ? 'Width' : 'Height')] / scale;
+                };
+
+        // Set the scale, first pass
+        setScale();
+
+        selectionXY = clipXY; // the clip position (x or y) is altered if out of bounds, the selection position is not
+
+        // Out of bounds
+        if (selectionXY < bounds.min) {
+                selectionXY = bounds.min;
+                outOfBounds = true;
+        } else if (selectionXY + selectionWH > bounds.max) {
+                selectionXY = bounds.max - selectionWH;
+                outOfBounds = true;
+        }
+
+        // Is the chart dragged off its bounds, determined by dataMin and dataMax?
+        if (outOfBounds) {
+
+                // Modify the touchNow position in order to create an elastic drag movement. This indicates
+                // to the user that the chart is responsive but can't be dragged further.
+                touch0Now -= 0.8 * (touch0Now - lastValidTouch[xy][0]);
+                if (!singleTouch) {
+                        touch1Now -= 0.8 * (touch1Now - lastValidTouch[xy][1]);
+                }
+
+                // Set the scale, second pass to adapt to the modified touchNow positions
+                setScale();
+
+        } else {
+                lastValidTouch[xy] = [touch0Now, touch1Now];
+        }
+
+        // Set geometry for clipping, selection and transformation
+        if (!inverted) { // TODO: implement clipping for inverted charts
+                clip[xy] = clipXY - plotLeftTop;
+                clip[wh] = selectionWH;
+        }
+        scaleKey = inverted ? (horiz ? 'scaleY' : 'scaleX') : 'scale' + XY;
+        transformScale = inverted ? 1 / scale : scale;
+
+        selectionMarker[wh] = selectionWH;
+        selectionMarker[xy] = selectionXY;
+        transform[scaleKey] = scale;
+        transform['translate' + XY] = (transformScale * plotLeftTop) + (touch0Now - (transformScale * touch0Start));
+},
+
+/**
+ * Handle touch events with two touches
+ */
+pinch: function (e) {
+
+        var self = this,
+                chart = self.chart,
+                pinchDown = self.pinchDown,
+                followTouchMove = self.followTouchMove,
+                touches = e.touches,
+                touchesLength = touches.length,
+                lastValidTouch = self.lastValidTouch,
+                hasZoom = self.hasZoom,
+                selectionMarker = self.selectionMarker,
+                transform = {},
+                fireClickEvent = touchesLength === 1 && ((self.inClass(e.target, PREFIX + 'tracker') && 
+                        chart.runTrackerClick) || chart.runChartClick),
+                clip = {};
+
+        // On touch devices, only proceed to trigger click if a handler is defined
+        if ((hasZoom || followTouchMove) && !fireClickEvent) {
+                e.preventDefault();
+        }
+
+        // Normalize each touch
+        map(touches, function (e) {
+                return self.normalize(e);
+        });
+
+        // Register the touch start position
+        if (e.type === 'touchstart') {
+                each(touches, function (e, i) {
+                        pinchDown[i] = { chartX: e.chartX, chartY: e.chartY };
+                });
+                lastValidTouch.x = [pinchDown[0].chartX, pinchDown[1] && pinchDown[1].chartX];
+                lastValidTouch.y = [pinchDown[0].chartY, pinchDown[1] && pinchDown[1].chartY];
+
+                // Identify the data bounds in pixels
+                each(chart.axes, function (axis) {
+                        if (axis.zoomEnabled) {
+                                var bounds = chart.bounds[axis.horiz ? 'h' : 'v'],
+                                        minPixelPadding = axis.minPixelPadding,
+                                        min = axis.toPixels(axis.dataMin),
+                                        max = axis.toPixels(axis.dataMax),
+                                        absMin = mathMin(min, max),
+                                        absMax = mathMax(min, max);
+
+                                // Store the bounds for use in the touchmove handler
+                                bounds.min = mathMin(axis.pos, absMin - minPixelPadding);
+                                bounds.max = mathMax(axis.pos + axis.len, absMax + minPixelPadding);
+                        }
+                });
+
+        // Event type is touchmove, handle panning and pinching
+        } else if (pinchDown.length) { // can be 0 when releasing, if touchend fires first
+
+                // Set the marker
+                if (!selectionMarker) {
+                        self.selectionMarker = selectionMarker = extend({
+                                destroy: noop
+                        }, chart.plotBox);
+                }
+
+                self.pinchTranslate(pinchDown, touches, transform, selectionMarker, clip, lastValidTouch);
+
+                self.hasPinched = hasZoom;
+
+                // Scale and translate the groups to provide visual feedback during pinching
+                self.scaleGroups(transform, clip);
+
+                // Optionally move the tooltip on touchmove
+                if (!hasZoom && followTouchMove && touchesLength === 1) {
+                        this.runPointActions(self.normalize(e));
+                }
+        }
+},
+
+onContainerTouchStart: function (e) {
+        var chart = this.chart;
+
+        hoverChartIndex = chart.index;
+
+        if (e.touches.length === 1) {
+
+                e = this.normalize(e);
+
+                if (chart.isInsidePlot(e.chartX - chart.plotLeft, e.chartY - chart.plotTop)) {
+
+                        // Run mouse events and display tooltip etc
+                        this.runPointActions(e);
+
+                        this.pinch(e);
+
+                } else {
+                        // Hide the tooltip on touching outside the plot area (#1203)
+                        this.reset();
+                }
+
+        } else if (e.touches.length === 2) {
+                this.pinch(e);
+        }   
+},
+
+onContainerTouchMove: function (e) {
+        if (e.touches.length === 1 || e.touches.length === 2) {
+                this.pinch(e);
+        }
+},
+
+onDocumentTouchEnd: function (e) {
+        if (charts[hoverChartIndex]) {
+                charts[hoverChartIndex].pointer.drop(e);
+        }
+}
+ +

}); if (win.PointerEvent || win.MSPointerEvent) {

+ +
// The touches object keeps track of the points being touched at all times
+var touches = {},
+        hasPointerEvent = !!win.PointerEvent,
+        getWebkitTouches = function () {
+                var key, fake = [];
+                fake.item = function (i) { return this[i]; };
+                for (key in touches) {
+                        if (touches.hasOwnProperty(key)) {
+                                fake.push({
+                                        pageX: touches[key].pageX,
+                                        pageY: touches[key].pageY,
+                                        target: touches[key].target
+                                });
+                        }
+                }
+                return fake;
+        },
+        translateMSPointer = function (e, method, wktype, callback) {
+                var p;
+                e = e.originalEvent || e;
+                if ((e.pointerType === 'touch' || e.pointerType === e.MSPOINTER_TYPE_TOUCH) && charts[hoverChartIndex]) {
+                        callback(e);
+                        p = charts[hoverChartIndex].pointer;
+                        p[method]({
+                                type: wktype,
+                                target: e.currentTarget,
+                                preventDefault: noop,
+                                touches: getWebkitTouches()
+                        });                             
+                }
+        };
+
+/**
+ * Extend the Pointer prototype with methods for each event handler and more
+ */
+extend(Pointer.prototype, {
+        onContainerPointerDown: function (e) {
+                translateMSPointer(e, 'onContainerTouchStart', 'touchstart', function (e) {
+                        touches[e.pointerId] = { pageX: e.pageX, pageY: e.pageY, target: e.currentTarget };
+                });
+        },
+        onContainerPointerMove: function (e) {
+                translateMSPointer(e, 'onContainerTouchMove', 'touchmove', function (e) {
+                        touches[e.pointerId] = { pageX: e.pageX, pageY: e.pageY };
+                        if (!touches[e.pointerId].target) {
+                                touches[e.pointerId].target = e.currentTarget;
+                        }
+                });
+        },
+        onDocumentPointerUp: function (e) {
+                translateMSPointer(e, 'onContainerTouchEnd', 'touchend', function (e) {
+                        delete touches[e.pointerId];
+                });
+        },
+
+        /**
+         * Add or remove the MS Pointer specific events
+         */
+        batchMSEvents: function (fn) {
+                fn(this.chart.container, hasPointerEvent ? 'pointerdown' : 'MSPointerDown', this.onContainerPointerDown);
+                fn(this.chart.container, hasPointerEvent ? 'pointermove' : 'MSPointerMove', this.onContainerPointerMove);
+                fn(doc, hasPointerEvent ? 'pointerup' : 'MSPointerUp', this.onDocumentPointerUp);
+        }
+});
+
+// Disable default IE actions for pinch and such on chart element
+wrap(Pointer.prototype, 'init', function (proceed, chart, options) {
+        proceed.call(this, chart, options);
+        if (this.hasZoom || this.followTouchMove) {
+                css(chart.container, {
+                        '-ms-touch-action': NONE,
+                        'touch-action': NONE
+                });
+        }
+});
+
+// Add IE specific touch events to chart
+wrap(Pointer.prototype, 'setDOMEvents', function (proceed) {
+        proceed.apply(this);
+        if (this.hasZoom || this.followTouchMove) {
+                this.batchMSEvents(addEvent);
+        }
+});
+// Destroy MS events also
+wrap(Pointer.prototype, 'destroy', function (proceed) {
+        this.batchMSEvents(removeEvent);
+        proceed.call(this);
+});
+ +

} /**

+ +
* The overview of the chart's series
+*/
+ +

var Legend = Highcharts.Legend = function (chart, options) {

+ +
this.init(chart, options);
+
+ +

};

+ +

Legend.prototype = {

+ +
/**
+ * Initialize the legend
+ */
+init: function (chart, options) {
+
+        var legend = this,
+                itemStyle = options.itemStyle,
+                padding = pick(options.padding, 8),
+                itemMarginTop = options.itemMarginTop || 0;
+
+        this.options = options;
+
+        if (!options.enabled) {
+                return;
+        }
+
+        legend.baseline = pInt(itemStyle.fontSize) + 3 + itemMarginTop; // used in Series prototype
+        legend.itemStyle = itemStyle;
+        legend.itemHiddenStyle = merge(itemStyle, options.itemHiddenStyle);
+        legend.itemMarginTop = itemMarginTop;
+        legend.padding = padding;
+        legend.initialItemX = padding;
+        legend.initialItemY = padding - 5; // 5 is the number of pixels above the text
+        legend.maxItemWidth = 0;
+        legend.chart = chart;
+        legend.itemHeight = 0;
+        legend.lastLineHeight = 0;
+        legend.symbolWidth = pick(options.symbolWidth, 16);
+        legend.pages = [];
+
+        // Render it
+        legend.render();
+
+        // move checkboxes
+        addEvent(legend.chart, 'endResize', function () { 
+                legend.positionCheckboxes();
+        });
+
+},
+
+/**
+ * Set the colors for the legend item
+ * @param {Object} item A Series or Point instance
+ * @param {Object} visible Dimmed or colored
+ */
+colorizeItem: function (item, visible) {
+        var legend = this,
+                options = legend.options,
+                legendItem = item.legendItem,
+                legendLine = item.legendLine,
+                legendSymbol = item.legendSymbol,
+                hiddenColor = legend.itemHiddenStyle.color,
+                textColor = visible ? options.itemStyle.color : hiddenColor,
+                symbolColor = visible ? (item.legendColor || item.color || '#CCC') : hiddenColor,
+                markerOptions = item.options && item.options.marker,
+                symbolAttr = { fill: symbolColor },
+                key,
+                val;
+
+        if (legendItem) {
+                legendItem.css({ fill: textColor, color: textColor }); // color for #1553, oldIE
+        }
+        if (legendLine) {
+                legendLine.attr({ stroke: symbolColor });
+        }
+
+        if (legendSymbol) {
+
+                // Apply marker options
+                if (markerOptions && legendSymbol.isMarker) { // #585
+                        symbolAttr.stroke = symbolColor;
+                        markerOptions = item.convertAttribs(markerOptions);
+                        for (key in markerOptions) {
+                                val = markerOptions[key];
+                                if (val !== UNDEFINED) {
+                                        symbolAttr[key] = val;
+                                }
+                        }
+                }
+
+                legendSymbol.attr(symbolAttr);
+        }
+},
+
+/**
+ * Position the legend item
+ * @param {Object} item A Series or Point instance
+ */
+positionItem: function (item) {
+        var legend = this,
+                options = legend.options,
+                symbolPadding = options.symbolPadding,
+                ltr = !options.rtl,
+                legendItemPos = item._legendItemPos,
+                itemX = legendItemPos[0],
+                itemY = legendItemPos[1],
+                checkbox = item.checkbox;
+
+        if (item.legendGroup) {
+                item.legendGroup.translate(
+                        ltr ? itemX : legend.legendWidth - itemX - 2 * symbolPadding - 4,
+                        itemY
+                );
+        }
+
+        if (checkbox) {
+                checkbox.x = itemX;
+                checkbox.y = itemY;
+        }
+},
+
+/**
+ * Destroy a single legend item
+ * @param {Object} item The series or point
+ */
+destroyItem: function (item) {
+        var checkbox = item.checkbox;
+
+        // destroy SVG elements
+        each(['legendItem', 'legendLine', 'legendSymbol', 'legendGroup'], function (key) {
+                if (item[key]) {
+                        item[key] = item[key].destroy();
+                }
+        });
+
+        if (checkbox) {
+                discardElement(item.checkbox);
+        }
+},
+
+/**
+ * Destroys the legend.
+ */
+destroy: function () {
+        var legend = this,
+                legendGroup = legend.group,
+                box = legend.box;
+
+        if (box) {
+                legend.box = box.destroy();
+        }
+
+        if (legendGroup) {
+                legend.group = legendGroup.destroy();
+        }
+},
+
+/**
+ * Position the checkboxes after the width is determined
+ */
+positionCheckboxes: function (scrollOffset) {
+        var alignAttr = this.group.alignAttr,
+                translateY,
+                clipHeight = this.clipHeight || this.legendHeight;
+
+        if (alignAttr) {
+                translateY = alignAttr.translateY;
+                each(this.allItems, function (item) {
+                        var checkbox = item.checkbox,
+                                top;
+
+                        if (checkbox) {
+                                top = (translateY + checkbox.y + (scrollOffset || 0) + 3);
+                                css(checkbox, {
+                                        left: (alignAttr.translateX + item.checkboxOffset + checkbox.x - 20) + PX,
+                                        top: top + PX,
+                                        display: top > translateY - 6 && top < translateY + clipHeight - 6 ? '' : NONE
+                                });
+                        }
+                });
+        }
+},
+
+/**
+ * Render the legend title on top of the legend
+ */
+renderTitle: function () {
+        var options = this.options,
+                padding = this.padding,
+                titleOptions = options.title,
+                titleHeight = 0,
+                bBox;
+
+        if (titleOptions.text) {
+                if (!this.title) {
+                        this.title = this.chart.renderer.label(titleOptions.text, padding - 3, padding - 4, null, null, null, null, null, 'legend-title')
+                                .attr({ zIndex: 1 })
+                                .css(titleOptions.style)
+                                .add(this.group);
+                }
+                bBox = this.title.getBBox();
+                titleHeight = bBox.height;
+                this.offsetWidth = bBox.width; // #1717
+                this.contentGroup.attr({ translateY: titleHeight });
+        }
+        this.titleHeight = titleHeight;
+},
+
+/**
+ * Render a single specific legend item
+ * @param {Object} item A series or point
+ */
+renderItem: function (item) {
+        var legend = this,
+                chart = legend.chart,
+                renderer = chart.renderer,
+                options = legend.options,
+                horizontal = options.layout === 'horizontal',
+                symbolWidth = legend.symbolWidth,
+                symbolPadding = options.symbolPadding,
+                itemStyle = legend.itemStyle,
+                itemHiddenStyle = legend.itemHiddenStyle,
+                padding = legend.padding,
+                itemDistance = horizontal ? pick(options.itemDistance, 20) : 0, // docs
+                ltr = !options.rtl,
+                itemHeight,
+                widthOption = options.width,
+                itemMarginBottom = options.itemMarginBottom || 0,
+                itemMarginTop = legend.itemMarginTop,
+                initialItemX = legend.initialItemX,
+                bBox,
+                itemWidth,
+                li = item.legendItem,
+                series = item.series && item.series.drawLegendSymbol ? item.series : item,
+                seriesOptions = series.options,
+                showCheckbox = legend.createCheckboxForItem && seriesOptions && seriesOptions.showCheckbox,
+                useHTML = options.useHTML;
+
+        if (!li) { // generate it once, later move it
+
+                // Generate the group box
+                // A group to hold the symbol and text. Text is to be appended in Legend class.
+                item.legendGroup = renderer.g('legend-item')
+                        .attr({ zIndex: 1 })
+                        .add(legend.scrollGroup);
+
+                // Draw the legend symbol inside the group box
+                series.drawLegendSymbol(legend, item);
+
+                // Generate the list item text and add it to the group
+                item.legendItem = li = renderer.text(
+                                options.labelFormat ? format(options.labelFormat, item) : options.labelFormatter.call(item),
+                                ltr ? symbolWidth + symbolPadding : -symbolPadding,
+                                legend.baseline,
+                                useHTML
+                        )
+                        .css(merge(item.visible ? itemStyle : itemHiddenStyle)) // merge to prevent modifying original (#1021)
+                        .attr({
+                                align: ltr ? 'left' : 'right',
+                                zIndex: 2
+                        })
+                        .add(item.legendGroup);
+
+                if (legend.setItemEvents) {
+                        legend.setItemEvents(item, li, useHTML, itemStyle, itemHiddenStyle);
+                }                       
+
+                // Colorize the items
+                legend.colorizeItem(item, item.visible);
+
+                // add the HTML checkbox on top
+                if (showCheckbox) {
+                        legend.createCheckboxForItem(item);                             
+                }
+        }
+
+        // calculate the positions for the next line
+        bBox = li.getBBox();
+
+        itemWidth = item.checkboxOffset = 
+                options.itemWidth || 
+                item.legendItemWidth || 
+                symbolWidth + symbolPadding + bBox.width + itemDistance + (showCheckbox ? 20 : 0);
+        legend.itemHeight = itemHeight = mathRound(item.legendItemHeight || bBox.height);
+
+        // if the item exceeds the width, start a new line
+        if (horizontal && legend.itemX - initialItemX + itemWidth >
+                        (widthOption || (chart.chartWidth - 2 * padding - initialItemX - options.x))) {
+                legend.itemX = initialItemX;
+                legend.itemY += itemMarginTop + legend.lastLineHeight + itemMarginBottom;
+                legend.lastLineHeight = 0; // reset for next line
+        }
+
+        // If the item exceeds the height, start a new column
+        /*if (!horizontal && legend.itemY + options.y + itemHeight > chart.chartHeight - spacingTop - spacingBottom) {
+                legend.itemY = legend.initialItemY;
+                legend.itemX += legend.maxItemWidth;
+                legend.maxItemWidth = 0;
+        }*/
+
+        // Set the edge positions
+        legend.maxItemWidth = mathMax(legend.maxItemWidth, itemWidth);
+        legend.lastItemY = itemMarginTop + legend.itemY + itemMarginBottom;
+        legend.lastLineHeight = mathMax(itemHeight, legend.lastLineHeight); // #915
+
+        // cache the position of the newly generated or reordered items
+        item._legendItemPos = [legend.itemX, legend.itemY];
+
+        // advance
+        if (horizontal) {
+                legend.itemX += itemWidth;
+
+        } else {
+                legend.itemY += itemMarginTop + itemHeight + itemMarginBottom;
+                legend.lastLineHeight = itemHeight;
+        }
+
+        // the width of the widest item
+        legend.offsetWidth = widthOption || mathMax(
+                (horizontal ? legend.itemX - initialItemX - itemDistance : itemWidth) + padding,
+                legend.offsetWidth
+        );
+},
+
+/**
+ * Get all items, which is one item per series for normal series and one item per point
+ * for pie series.
+ */
+getAllItems: function () {
+        var allItems = [];
+        each(this.chart.series, function (series) {
+                var seriesOptions = series.options;
+
+                // Handle showInLegend. If the series is linked to another series, defaults to false.
+                if (!pick(seriesOptions.showInLegend, !defined(seriesOptions.linkedTo) ? UNDEFINED : false, true)) {
+                        return;
+                }
+
+                // use points or series for the legend item depending on legendType
+                allItems = allItems.concat(
+                                series.legendItems ||
+                                (seriesOptions.legendType === 'point' ?
+                                                series.data :
+                                                series)
+                );
+        });
+        return allItems;
+},
+
+/**
+ * Render the legend. This method can be called both before and after
+ * chart.render. If called after, it will only rearrange items instead
+ * of creating new ones.
+ */
+render: function () {
+        var legend = this,
+                chart = legend.chart,
+                renderer = chart.renderer,
+                legendGroup = legend.group,
+                allItems,
+                display,
+                legendWidth,
+                legendHeight,
+                box = legend.box,
+                options = legend.options,
+                padding = legend.padding,
+                legendBorderWidth = options.borderWidth,
+                legendBackgroundColor = options.backgroundColor;
+
+        legend.itemX = legend.initialItemX;
+        legend.itemY = legend.initialItemY;
+        legend.offsetWidth = 0;
+        legend.lastItemY = 0;
+
+        if (!legendGroup) {
+                legend.group = legendGroup = renderer.g('legend')
+                        .attr({ zIndex: 7 }) 
+                        .add();
+                legend.contentGroup = renderer.g()
+                        .attr({ zIndex: 1 }) // above background
+                        .add(legendGroup);
+                legend.scrollGroup = renderer.g()
+                        .add(legend.contentGroup);
+        }
+
+        legend.renderTitle();
+
+        // add each series or point
+        allItems = legend.getAllItems();
+
+        // sort by legendIndex
+        stableSort(allItems, function (a, b) {
+                return ((a.options && a.options.legendIndex) || 0) - ((b.options && b.options.legendIndex) || 0);
+        });
+
+        // reversed legend
+        if (options.reversed) {
+                allItems.reverse();
+        }
+
+        legend.allItems = allItems;
+        legend.display = display = !!allItems.length;
+
+        // render the items
+        each(allItems, function (item) {
+                legend.renderItem(item); 
+        });
+
+        // Draw the border
+        legendWidth = options.width || legend.offsetWidth;
+        legendHeight = legend.lastItemY + legend.lastLineHeight + legend.titleHeight;
+
+        legendHeight = legend.handleOverflow(legendHeight);
+
+        if (legendBorderWidth || legendBackgroundColor) {
+                legendWidth += padding;
+                legendHeight += padding;
+
+                if (!box) {
+                        legend.box = box = renderer.rect(
+                                0,
+                                0,
+                                legendWidth,
+                                legendHeight,
+                                options.borderRadius,
+                                legendBorderWidth || 0
+                        ).attr({
+                                stroke: options.borderColor,
+                                'stroke-width': legendBorderWidth || 0,
+                                fill: legendBackgroundColor || NONE
+                        })
+                        .add(legendGroup)
+                        .shadow(options.shadow);
+                        box.isNew = true;
+
+                } else if (legendWidth > 0 && legendHeight > 0) {
+                        box[box.isNew ? 'attr' : 'animate'](
+                                box.crisp({ width: legendWidth, height: legendHeight })
+                        );
+                        box.isNew = false;
+                }
+
+                // hide the border if no items
+                box[display ? 'show' : 'hide']();
+        }
+
+        legend.legendWidth = legendWidth;
+        legend.legendHeight = legendHeight;
+
+        // Now that the legend width and height are established, put the items in the 
+        // final position
+        each(allItems, function (item) {
+                legend.positionItem(item);
+        });
+
+        // 1.x compatibility: positioning based on style
+        /*var props = ['left', 'right', 'top', 'bottom'],
+                prop,
+                i = 4;
+        while (i--) {
+                prop = props[i];
+                if (options.style[prop] && options.style[prop] !== 'auto') {
+                        options[i < 2 ? 'align' : 'verticalAlign'] = prop;
+                        options[i < 2 ? 'x' : 'y'] = pInt(options.style[prop]) * (i % 2 ? -1 : 1);
+                }
+        }*/
+
+        if (display) {
+                legendGroup.align(extend({
+                        width: legendWidth,
+                        height: legendHeight
+                }, options), true, 'spacingBox');
+        }
+
+        if (!chart.isResizing) {
+                this.positionCheckboxes();
+        }
+},
+
+/**
+ * Set up the overflow handling by adding navigation with up and down arrows below the
+ * legend.
+ */
+handleOverflow: function (legendHeight) {
+        var legend = this,
+                chart = this.chart,
+                renderer = chart.renderer,
+                options = this.options,
+                optionsY = options.y,
+                alignTop = options.verticalAlign === 'top',
+                spaceHeight = chart.spacingBox.height + (alignTop ? -optionsY : optionsY) - this.padding,
+                maxHeight = options.maxHeight,
+                clipHeight,
+                clipRect = this.clipRect,
+                navOptions = options.navigation,
+                animation = pick(navOptions.animation, true),
+                arrowSize = navOptions.arrowSize || 12,
+                nav = this.nav,
+                pages = this.pages,
+                lastY,
+                allItems = this.allItems;
+
+        // Adjust the height
+        if (options.layout === 'horizontal') {
+                spaceHeight /= 2;
+        }
+        if (maxHeight) {
+                spaceHeight = mathMin(spaceHeight, maxHeight);
+        }
+
+        // Reset the legend height and adjust the clipping rectangle
+        pages.length = 0;
+        if (legendHeight > spaceHeight && !options.useHTML) {
+
+                this.clipHeight = clipHeight = spaceHeight - 20 - this.titleHeight - this.padding;
+                this.currentPage = pick(this.currentPage, 1);
+                this.fullHeight = legendHeight;
+
+                // Fill pages with Y positions so that the top of each a legend item defines
+                // the scroll top for each page (#2098)
+                each(allItems, function (item, i) {
+                        var y = item._legendItemPos[1],
+                                h = mathRound(item.legendItem.getBBox().height),
+                                len = pages.length;
+
+                        if (!len || (y - pages[len - 1] > clipHeight && (lastY || y) !== pages[len - 1])) {
+                                pages.push(lastY || y);
+                                len++;
+                        }
+
+                        if (i === allItems.length - 1 && y + h - pages[len - 1] > clipHeight) {
+                                pages.push(y);
+                        }
+                        if (y !== lastY) {
+                                lastY = y;
+                        }
+                });
+
+                // Only apply clipping if needed. Clipping causes blurred legend in PDF export (#1787)
+                if (!clipRect) {
+                        clipRect = legend.clipRect = renderer.clipRect(0, this.padding, 9999, 0);
+                        legend.contentGroup.clip(clipRect);
+                }
+                clipRect.attr({
+                        height: clipHeight
+                });
+
+                // Add navigation elements
+                if (!nav) {
+                        this.nav = nav = renderer.g().attr({ zIndex: 1 }).add(this.group);
+                        this.up = renderer.symbol('triangle', 0, 0, arrowSize, arrowSize)
+                                .on('click', function () {
+                                        legend.scroll(-1, animation);
+                                })
+                                .add(nav);
+                        this.pager = renderer.text('', 15, 10)
+                                .css(navOptions.style)
+                                .add(nav);
+                        this.down = renderer.symbol('triangle-down', 0, 0, arrowSize, arrowSize)
+                                .on('click', function () {
+                                        legend.scroll(1, animation);
+                                })
+                                .add(nav);
+                }
+
+                // Set initial position
+                legend.scroll(0);
+
+                legendHeight = spaceHeight;
+
+        } else if (nav) {
+                clipRect.attr({
+                        height: chart.chartHeight
+                });
+                nav.hide();
+                this.scrollGroup.attr({
+                        translateY: 1
+                });
+                this.clipHeight = 0; // #1379
+        }
+
+        return legendHeight;
+},
+
+/**
+ * Scroll the legend by a number of pages
+ * @param {Object} scrollBy
+ * @param {Object} animation
+ */
+scroll: function (scrollBy, animation) {
+        var pages = this.pages,
+                pageCount = pages.length,
+                currentPage = this.currentPage + scrollBy,
+                clipHeight = this.clipHeight,
+                navOptions = this.options.navigation,
+                activeColor = navOptions.activeColor,
+                inactiveColor = navOptions.inactiveColor,
+                pager = this.pager,
+                padding = this.padding,
+                scrollOffset;
+
+        // When resizing while looking at the last page
+        if (currentPage > pageCount) {
+                currentPage = pageCount;
+        }
+
+        if (currentPage > 0) {
+
+                if (animation !== UNDEFINED) {
+                        setAnimation(animation, this.chart);
+                }
+
+                this.nav.attr({
+                        translateX: padding,
+                        translateY: clipHeight + this.padding + 7 + this.titleHeight,
+                        visibility: VISIBLE
+                });
+                this.up.attr({
+                                fill: currentPage === 1 ? inactiveColor : activeColor
+                        })
+                        .css({
+                                cursor: currentPage === 1 ? 'default' : 'pointer'
+                        });
+                pager.attr({
+                        text: currentPage + '/' + pageCount
+                });
+                this.down.attr({
+                                x: 18 + this.pager.getBBox().width, // adjust to text width
+                                fill: currentPage === pageCount ? inactiveColor : activeColor
+                        })
+                        .css({
+                                cursor: currentPage === pageCount ? 'default' : 'pointer'
+                        });
+
+                scrollOffset = -pages[currentPage - 1] + this.initialItemY;
+
+                this.scrollGroup.animate({
+                        translateY: scrollOffset
+                });                     
+
+                this.currentPage = currentPage;
+                this.positionCheckboxes(scrollOffset);
+        }
+
+}
+ +

};

+ +

/*

+ +
* LegendSymbolMixin
+*/
+ +

var LegendSymbolMixin = Highcharts.LegendSymbolMixin = {

+ +
/**
+ * Get the series' symbol in the legend
+ * 
+ * @param {Object} legend The legend object
+ * @param {Object} item The series (this) or point
+ */
+drawRectangle: function (legend, item) {
+        var symbolHeight = legend.options.symbolHeight || 12;
+
+        item.legendSymbol = this.chart.renderer.rect(
+                0,
+                legend.baseline - 5 - (symbolHeight / 2),
+                legend.symbolWidth,
+                symbolHeight,
+                legend.options.symbolRadius || 0
+        ).attr({
+                zIndex: 3
+        }).add(item.legendGroup);               
+
+},
+
+/**
+ * Get the series' symbol in the legend. This method should be overridable to create custom 
+ * symbols through Highcharts.seriesTypes[type].prototype.drawLegendSymbols.
+ * 
+ * @param {Object} legend The legend object
+ */
+drawLineMarker: function (legend) {
+
+        var options = this.options,
+                markerOptions = options.marker,
+                radius,
+                legendOptions = legend.options,
+                legendSymbol,
+                symbolWidth = legend.symbolWidth,
+                renderer = this.chart.renderer,
+                legendItemGroup = this.legendGroup,
+                verticalCenter = legend.baseline - mathRound(renderer.fontMetrics(legendOptions.itemStyle.fontSize).b * 0.3),
+                attr;
+
+        // Draw the line
+        if (options.lineWidth) {
+                attr = {
+                        'stroke-width': options.lineWidth
+                };
+                if (options.dashStyle) {
+                        attr.dashstyle = options.dashStyle;
+                }
+                this.legendLine = renderer.path([
+                        M,
+                        0,
+                        verticalCenter,
+                        L,
+                        symbolWidth,
+                        verticalCenter
+                ])
+                .attr(attr)
+                .add(legendItemGroup);
+        }
+
+        // Draw the marker
+        if (markerOptions && markerOptions.enabled !== false) {
+                radius = markerOptions.radius;
+                this.legendSymbol = legendSymbol = renderer.symbol(
+                        this.symbol,
+                        (symbolWidth / 2) - radius,
+                        verticalCenter - radius,
+                        2 * radius,
+                        2 * radius
+                )
+                .add(legendItemGroup);
+                legendSymbol.isMarker = true;
+        }
+}
+ +

};

+ +

// Workaround for #2030, horizontal legend items not displaying in IE11 Preview, // and for #2580, a similar drawing flaw in Firefox 26. // TODO: Explore if there’s a general cause for this. The problem may be related // to nested group elements, as the legend item texts are within 4 group elements. if (/Trident\/7\.0/.test(userAgent) || isFirefox) {

+ +
wrap(Legend.prototype, 'positionItem', function (proceed, item) {
+        var legend = this,
+                runPositionItem = function () { // If chart destroyed in sync, this is undefined (#2030)
+                        if (item._legendItemPos) {
+                                proceed.call(legend, item);
+                        }
+                };
+
+        // Do it now, for export and to get checkbox placement
+        runPositionItem();
+
+        // Do it after to work around the core issue
+        setTimeout(runPositionItem);
+});
+ +

} /**

+ +
* The chart class
+* @param {Object} options
+* @param {Function} callback Function to run when the chart has loaded
+*/
+ +

function Chart() {

+ +
this.init.apply(this, arguments);
+
+ +

}

+ +

Chart.prototype = {

+ +
/**
+ * Initialize the chart
+ */
+init: function (userOptions, callback) {
+
+        // Handle regular options
+        var options,
+                seriesOptions = userOptions.series; // skip merging data points to increase performance
+
+        userOptions.series = null;
+        options = merge(defaultOptions, userOptions); // do the merge
+        options.series = userOptions.series = seriesOptions; // set back the series data
+        this.userOptions = userOptions;
+
+        var optionsChart = options.chart;
+
+        // Create margin & spacing array
+        this.margin = this.splashArray('margin', optionsChart);
+        this.spacing = this.splashArray('spacing', optionsChart);
+
+        var chartEvents = optionsChart.events;
+
+        //this.runChartClick = chartEvents && !!chartEvents.click;
+        this.bounds = { h: {}, v: {} }; // Pixel data bounds for touch zoom
+
+        this.callback = callback;
+        this.isResizing = 0;
+        this.options = options;
+        //chartTitleOptions = UNDEFINED;
+        //chartSubtitleOptions = UNDEFINED;
+
+        this.axes = [];
+        this.series = [];
+        this.hasCartesianSeries = optionsChart.showAxes;
+        //this.axisOffset = UNDEFINED;
+        //this.maxTicks = UNDEFINED; // handle the greatest amount of ticks on grouped axes
+        //this.inverted = UNDEFINED;
+        //this.loadingShown = UNDEFINED;
+        //this.container = UNDEFINED;
+        //this.chartWidth = UNDEFINED;
+        //this.chartHeight = UNDEFINED;
+        //this.marginRight = UNDEFINED;
+        //this.marginBottom = UNDEFINED;
+        //this.containerWidth = UNDEFINED;
+        //this.containerHeight = UNDEFINED;
+        //this.oldChartWidth = UNDEFINED;
+        //this.oldChartHeight = UNDEFINED;
+
+        //this.renderTo = UNDEFINED;
+        //this.renderToClone = UNDEFINED;
+
+        //this.spacingBox = UNDEFINED
+
+        //this.legend = UNDEFINED;
+
+        // Elements
+        //this.chartBackground = UNDEFINED;
+        //this.plotBackground = UNDEFINED;
+        //this.plotBGImage = UNDEFINED;
+        //this.plotBorder = UNDEFINED;
+        //this.loadingDiv = UNDEFINED;
+        //this.loadingSpan = UNDEFINED;
+
+        var chart = this,
+                eventType;
+
+        // Add the chart to the global lookup
+        chart.index = charts.length;
+        charts.push(chart);
+        chartCount++;
+
+        // Set up auto resize
+        if (optionsChart.reflow !== false) {
+                addEvent(chart, 'load', function () {
+                        chart.initReflow();
+                });
+        }
+
+        // Chart event handlers
+        if (chartEvents) {
+                for (eventType in chartEvents) {
+                        addEvent(chart, eventType, chartEvents[eventType]);
+                }
+        }
+
+        chart.xAxis = [];
+        chart.yAxis = [];
+
+        // Expose methods and variables
+        chart.animation = useCanVG ? false : pick(optionsChart.animation, true);
+        chart.pointCount = 0;
+        chart.counters = new ChartCounters();
+
+        chart.firstRender();
+},
+
+/**
+ * Initialize an individual series, called internally before render time
+ */
+initSeries: function (options) {
+        var chart = this,
+                optionsChart = chart.options.chart,
+                type = options.type || optionsChart.type || optionsChart.defaultSeriesType,
+                series,
+                constr = seriesTypes[type];
+
+        // No such series type
+        if (!constr) {
+                error(17, true);
+        }
+
+        series = new constr();
+        series.init(this, options);
+        return series;
+},
+
+/**
+ * Check whether a given point is within the plot area
+ *
+ * @param {Number} plotX Pixel x relative to the plot area
+ * @param {Number} plotY Pixel y relative to the plot area
+ * @param {Boolean} inverted Whether the chart is inverted
+ */
+isInsidePlot: function (plotX, plotY, inverted) {
+        var x = inverted ? plotY : plotX,
+                y = inverted ? plotX : plotY;
+
+        return x >= 0 &&
+                x <= this.plotWidth &&
+                y >= 0 &&
+                y <= this.plotHeight;
+},
+
+/**
+ * Adjust all axes tick amounts
+ */
+adjustTickAmounts: function () {
+        if (this.options.chart.alignTicks !== false) {
+                each(this.axes, function (axis) {
+                        axis.adjustTickAmount();
+                });
+        }
+        this.maxTicks = null;
+},
+
+/**
+ * Redraw legend, axes or series based on updated data
+ *
+ * @param {Boolean|Object} animation Whether to apply animation, and optionally animation
+ *    configuration
+ */
+redraw: function (animation) {
+        var chart = this,
+                axes = chart.axes,
+                series = chart.series,
+                pointer = chart.pointer,
+                legend = chart.legend,
+                redrawLegend = chart.isDirtyLegend,
+                hasStackedSeries,
+                hasDirtyStacks,
+                isDirtyBox = chart.isDirtyBox, // todo: check if it has actually changed?
+                seriesLength = series.length,
+                i = seriesLength,
+                serie,
+                renderer = chart.renderer,
+                isHiddenChart = renderer.isHidden(),
+                afterRedraw = [];
+
+        setAnimation(animation, chart);
+
+        if (isHiddenChart) {
+                chart.cloneRenderTo();
+        }
+
+        // Adjust title layout (reflow multiline text)
+        chart.layOutTitles();
+
+        // link stacked series
+        while (i--) {
+                serie = series[i];
+
+                if (serie.options.stacking) {
+                        hasStackedSeries = true;
+
+                        if (serie.isDirty) {
+                                hasDirtyStacks = true;
+                                break;
+                        }
+                }
+        }
+        if (hasDirtyStacks) { // mark others as dirty
+                i = seriesLength;
+                while (i--) {
+                        serie = series[i];
+                        if (serie.options.stacking) {
+                                serie.isDirty = true;
+                        }
+                }
+        }
+
+        // handle updated data in the series
+        each(series, function (serie) {
+                if (serie.isDirty) { // prepare the data so axis can read it
+                        if (serie.options.legendType === 'point') {
+                                redrawLegend = true;
+                        }
+                }
+        });
+
+        // handle added or removed series
+        if (redrawLegend && legend.options.enabled) { // series or pie points are added or removed
+                // draw legend graphics
+                legend.render();
+
+                chart.isDirtyLegend = false;
+        }
+
+        // reset stacks
+        if (hasStackedSeries) {
+                chart.getStacks();
+        }
+
+        if (chart.hasCartesianSeries) {
+                if (!chart.isResizing) {
+
+                        // reset maxTicks
+                        chart.maxTicks = null;
+
+                        // set axes scales
+                        each(axes, function (axis) {
+                                axis.setScale();
+                        });
+                }
+
+                chart.adjustTickAmounts();
+                chart.getMargins();
+
+                // If one axis is dirty, all axes must be redrawn (#792, #2169)
+                each(axes, function (axis) {
+                        if (axis.isDirty) {
+                                isDirtyBox = true;
+                        }
+                });
+
+                // redraw axes
+                each(axes, function (axis) {
+
+                        // Fire 'afterSetExtremes' only if extremes are set
+                        if (axis.isDirtyExtremes) { // #821
+                                axis.isDirtyExtremes = false;
+                                afterRedraw.push(function () { // prevent a recursive call to chart.redraw() (#1119)
+                                        fireEvent(axis, 'afterSetExtremes', extend(axis.eventArgs, axis.getExtremes())); // #747, #751
+                                        delete axis.eventArgs;
+                                });
+                        }
+
+                        if (isDirtyBox || hasStackedSeries) {
+                                axis.redraw();
+                        }
+                });
+
+        }
+        // the plot areas size has changed
+        if (isDirtyBox) {
+                chart.drawChartBox();
+        }
+
+        // redraw affected series
+        each(series, function (serie) {
+                if (serie.isDirty && serie.visible &&
+                                (!serie.isCartesian || serie.xAxis)) { // issue #153
+                        serie.redraw();
+                }
+        });
+
+        // move tooltip or reset
+        if (pointer) {
+                pointer.reset(true);
+        }
+
+        // redraw if canvas
+        renderer.draw();
+
+        // fire the event
+        fireEvent(chart, 'redraw'); // jQuery breaks this when calling it from addEvent. Overwrites chart.redraw
+
+        if (isHiddenChart) {
+                chart.cloneRenderTo(true);
+        }
+
+        // Fire callbacks that are put on hold until after the redraw
+        each(afterRedraw, function (callback) {
+                callback.call();
+        });
+},
+
+/**
+ * Get an axis, series or point object by id.
+ * @param id {String} The id as given in the configuration options
+ */
+get: function (id) {
+        var chart = this,
+                axes = chart.axes,
+                series = chart.series;
+
+        var i,
+                j,
+                points;
+
+        // search axes
+        for (i = 0; i < axes.length; i++) {
+                if (axes[i].options.id === id) {
+                        return axes[i];
+                }
+        }
+
+        // search series
+        for (i = 0; i < series.length; i++) {
+                if (series[i].options.id === id) {
+                        return series[i];
+                }
+        }
+
+        // search points
+        for (i = 0; i < series.length; i++) {
+                points = series[i].points || [];
+                for (j = 0; j < points.length; j++) {
+                        if (points[j].id === id) {
+                                return points[j];
+                        }
+                }
+        }
+        return null;
+},
+
+/**
+ * Create the Axis instances based on the config options
+ */
+getAxes: function () {
+        var chart = this,
+                options = this.options,
+                xAxisOptions = options.xAxis = splat(options.xAxis || {}),
+                yAxisOptions = options.yAxis = splat(options.yAxis || {}),
+                optionsArray,
+                axis;
+
+        // make sure the options are arrays and add some members
+        each(xAxisOptions, function (axis, i) {
+                axis.index = i;
+                axis.isX = true;
+        });
+
+        each(yAxisOptions, function (axis, i) {
+                axis.index = i;
+        });
+
+        // concatenate all axis options into one array
+        optionsArray = xAxisOptions.concat(yAxisOptions);
+
+        each(optionsArray, function (axisOptions) {
+                axis = new Axis(chart, axisOptions);
+        });
+
+        chart.adjustTickAmounts();
+},
+
+/**
+ * Get the currently selected points from all series
+ */
+getSelectedPoints: function () {
+        var points = [];
+        each(this.series, function (serie) {
+                points = points.concat(grep(serie.points || [], function (point) {
+                        return point.selected;
+                }));
+        });
+        return points;
+},
+
+/**
+ * Get the currently selected series
+ */
+getSelectedSeries: function () {
+        return grep(this.series, function (serie) {
+                return serie.selected;
+        });
+},
+
+/**
+ * Generate stacks for each series and calculate stacks total values
+ */
+getStacks: function () {
+        var chart = this;
+
+        // reset stacks for each yAxis
+        each(chart.yAxis, function (axis) {
+                if (axis.stacks && axis.hasVisibleSeries) {
+                        axis.oldStacks = axis.stacks;
+                }
+        });
+
+        each(chart.series, function (series) {
+                if (series.options.stacking && (series.visible === true || chart.options.chart.ignoreHiddenSeries === false)) {
+                        series.stackKey = series.type + pick(series.options.stack, '');
+                }
+        });
+},      
+
+/**
+ * Show the title and subtitle of the chart
+ *
+ * @param titleOptions {Object} New title options
+ * @param subtitleOptions {Object} New subtitle options
+ *
+ */
+setTitle: function (titleOptions, subtitleOptions, redraw) {
+        var chart = this,
+                options = chart.options,
+                chartTitleOptions,
+                chartSubtitleOptions;
+
+        chartTitleOptions = options.title = merge(options.title, titleOptions);
+        chartSubtitleOptions = options.subtitle = merge(options.subtitle, subtitleOptions);
+
+        // add title and subtitle
+        each([
+                ['title', titleOptions, chartTitleOptions],
+                ['subtitle', subtitleOptions, chartSubtitleOptions]
+        ], function (arr) {
+                var name = arr[0],
+                        title = chart[name],
+                        titleOptions = arr[1],
+                        chartTitleOptions = arr[2];
+
+                if (title && titleOptions) {
+                        chart[name] = title = title.destroy(); // remove old
+                }
+
+                if (chartTitleOptions && chartTitleOptions.text && !title) {
+                        chart[name] = chart.renderer.text(
+                                chartTitleOptions.text,
+                                0,
+                                0,
+                                chartTitleOptions.useHTML
+                        )
+                        .attr({
+                                align: chartTitleOptions.align,
+                                'class': PREFIX + name,
+                                zIndex: chartTitleOptions.zIndex || 4
+                        })
+                        .css(chartTitleOptions.style)
+                        .add();
+                }       
+        });
+        chart.layOutTitles(redraw);
+},
+
+/**
+ * Lay out the chart titles and cache the full offset height for use in getMargins
+ */
+layOutTitles: function (redraw) {
+        var titleOffset = 0,
+                title = this.title,
+                subtitle = this.subtitle,
+                options = this.options,
+                titleOptions = options.title,
+                subtitleOptions = options.subtitle,
+                requiresDirtyBox,
+                autoWidth = this.spacingBox.width - 44; // 44 makes room for default context button
+
+        if (title) {
+                title
+                        .css({ width: (titleOptions.width || autoWidth) + PX })
+                        .align(extend({ y: 15 }, titleOptions), false, 'spacingBox');
+
+                if (!titleOptions.floating && !titleOptions.verticalAlign) {
+                        titleOffset = title.getBBox().height;
+                }
+        }
+        if (subtitle) {
+                subtitle
+                        .css({ width: (subtitleOptions.width || autoWidth) + PX })
+                        .align(extend({ y: titleOffset + titleOptions.margin }, subtitleOptions), false, 'spacingBox');
+
+                if (!subtitleOptions.floating && !subtitleOptions.verticalAlign) {
+                        titleOffset = mathCeil(titleOffset + subtitle.getBBox().height);
+                }
+        }
+
+        requiresDirtyBox = this.titleOffset !== titleOffset;                            
+        this.titleOffset = titleOffset; // used in getMargins
+
+        if (!this.isDirtyBox && requiresDirtyBox) {
+                this.isDirtyBox = requiresDirtyBox;
+                // Redraw if necessary (#2719, #2744)           
+                if (this.hasRendered && pick(redraw, true) && this.isDirtyBox) {
+                        this.redraw();
+                }
+        }
+},
+
+/**
+ * Get chart width and height according to options and container size
+ */
+getChartSize: function () {
+        var chart = this,
+                optionsChart = chart.options.chart,
+                widthOption = optionsChart.width,
+                heightOption = optionsChart.height,
+                renderTo = chart.renderToClone || chart.renderTo;
+
+        // get inner width and height from jQuery (#824)
+        if (!defined(widthOption)) {
+                chart.containerWidth = adapterRun(renderTo, 'width');
+        }
+        if (!defined(heightOption)) {
+                chart.containerHeight = adapterRun(renderTo, 'height');
+        }
+
+        chart.chartWidth = mathMax(0, widthOption || chart.containerWidth || 600); // #1393, 1460
+        chart.chartHeight = mathMax(0, pick(heightOption,
+                // the offsetHeight of an empty container is 0 in standard browsers, but 19 in IE7:
+                chart.containerHeight > 19 ? chart.containerHeight : 400));
+},
+
+/**
+ * Create a clone of the chart's renderTo div and place it outside the viewport to allow
+ * size computation on chart.render and chart.redraw
+ */
+cloneRenderTo: function (revert) {
+        var clone = this.renderToClone,
+                container = this.container;
+
+        // Destroy the clone and bring the container back to the real renderTo div
+        if (revert) {
+                if (clone) {
+                        this.renderTo.appendChild(container);
+                        discardElement(clone);
+                        delete this.renderToClone;
+                }
+
+        // Set up the clone
+        } else {
+                if (container && container.parentNode === this.renderTo) {
+                        this.renderTo.removeChild(container); // do not clone this
+                }
+                this.renderToClone = clone = this.renderTo.cloneNode(0);
+                css(clone, {
+                        position: ABSOLUTE,
+                        top: '-9999px',
+                        display: 'block' // #833
+                });
+                if (clone.style.setProperty) { // #2631
+                        clone.style.setProperty('display', 'block', 'important');
+                }
+                doc.body.appendChild(clone);
+                if (container) {
+                        clone.appendChild(container);
+                }
+        }
+},
+
+/**
+ * Get the containing element, determine the size and create the inner container
+ * div to hold the chart
+ */
+getContainer: function () {
+        var chart = this,
+                container,
+                optionsChart = chart.options.chart,
+                chartWidth,
+                chartHeight,
+                renderTo,
+                indexAttrName = 'data-highcharts-chart',
+                oldChartIndex,
+                containerId;
+
+        chart.renderTo = renderTo = optionsChart.renderTo;
+        containerId = PREFIX + idCounter++;
+
+        if (isString(renderTo)) {
+                chart.renderTo = renderTo = doc.getElementById(renderTo);
+        }
+
+        // Display an error if the renderTo is wrong
+        if (!renderTo) {
+                error(13, true);
+        }
+
+        // If the container already holds a chart, destroy it. The check for hasRendered is there
+        // because web pages that are saved to disk from the browser, will preserve the data-highcharts-chart
+        // attribute and the SVG contents, but not an interactive chart. So in this case,
+        // charts[oldChartIndex] will point to the wrong chart if any (#2609).
+        oldChartIndex = pInt(attr(renderTo, indexAttrName));
+        if (!isNaN(oldChartIndex) && charts[oldChartIndex] && charts[oldChartIndex].hasRendered) {
+                charts[oldChartIndex].destroy();
+        }               
+
+        // Make a reference to the chart from the div
+        attr(renderTo, indexAttrName, chart.index);
+
+        // remove previous chart
+        renderTo.innerHTML = '';
+
+        // If the container doesn't have an offsetWidth, it has or is a child of a node
+        // that has display:none. We need to temporarily move it out to a visible
+        // state to determine the size, else the legend and tooltips won't render
+        // properly. The allowClone option is used in sparklines as a micro optimization,
+        // saving about 1-2 ms each chart.
+        if (!optionsChart.skipClone && !renderTo.offsetWidth) {
+                chart.cloneRenderTo();
+        }
+
+        // get the width and height
+        chart.getChartSize();
+        chartWidth = chart.chartWidth;
+        chartHeight = chart.chartHeight;
+
+        // create the inner container
+        chart.container = container = createElement(DIV, {
+                        className: PREFIX + 'container' +
+                                (optionsChart.className ? ' ' + optionsChart.className : ''),
+                        id: containerId
+                }, extend({
+                        position: RELATIVE,
+                        overflow: HIDDEN, // needed for context menu (avoid scrollbars) and
+                                // content overflow in IE
+                        width: chartWidth + PX,
+                        height: chartHeight + PX,
+                        textAlign: 'left',
+                        lineHeight: 'normal', // #427
+                        zIndex: 0, // #1072
+                        '-webkit-tap-highlight-color': 'rgba(0,0,0,0)'
+                }, optionsChart.style),
+                chart.renderToClone || renderTo
+        );
+
+        // cache the cursor (#1650)
+        chart._cursor = container.style.cursor;
+
+        // Initialize the renderer
+        chart.renderer =
+                optionsChart.forExport ? // force SVG, used for SVG export
+                        new SVGRenderer(container, chartWidth, chartHeight, optionsChart.style, true) :
+                        new Renderer(container, chartWidth, chartHeight, optionsChart.style);
+
+        if (useCanVG) {
+                // If we need canvg library, extend and configure the renderer
+                // to get the tracker for translating mouse events
+                chart.renderer.create(chart, container, chartWidth, chartHeight);
+        }
+},
+
+/**
+ * Calculate margins by rendering axis labels in a preliminary position. Title,
+ * subtitle and legend have already been rendered at this stage, but will be
+ * moved into their final positions
+ */
+getMargins: function () {
+        var chart = this,
+                spacing = chart.spacing,
+                axisOffset,
+                legend = chart.legend,
+                margin = chart.margin,
+                legendOptions = chart.options.legend,
+                legendMargin = pick(legendOptions.margin, 20),
+                legendX = legendOptions.x,
+                legendY = legendOptions.y,
+                align = legendOptions.align,
+                verticalAlign = legendOptions.verticalAlign,
+                titleOffset = chart.titleOffset;
+
+        chart.resetMargins();
+        axisOffset = chart.axisOffset;
+
+        // Adjust for title and subtitle
+        if (titleOffset && !defined(margin[0])) {
+                chart.plotTop = mathMax(chart.plotTop, titleOffset + chart.options.title.margin + spacing[0]);
+        }
+
+        // Adjust for legend
+        if (legend.display && !legendOptions.floating) {
+                if (align === 'right') { // horizontal alignment handled first
+                        if (!defined(margin[1])) {
+                                chart.marginRight = mathMax(
+                                        chart.marginRight,
+                                        legend.legendWidth - legendX + legendMargin + spacing[1]
+                                );
+                        }
+                } else if (align === 'left') {
+                        if (!defined(margin[3])) {
+                                chart.plotLeft = mathMax(
+                                        chart.plotLeft,
+                                        legend.legendWidth + legendX + legendMargin + spacing[3]
+                                );
+                        }
+
+                } else if (verticalAlign === 'top') {
+                        if (!defined(margin[0])) {
+                                chart.plotTop = mathMax(
+                                        chart.plotTop,
+                                        legend.legendHeight + legendY + legendMargin + spacing[0]
+                                );
+                        }
+
+                } else if (verticalAlign === 'bottom') {
+                        if (!defined(margin[2])) {
+                                chart.marginBottom = mathMax(
+                                        chart.marginBottom,
+                                        legend.legendHeight - legendY + legendMargin + spacing[2]
+                                );
+                        }
+                }
+        }
+
+        // adjust for scroller
+        if (chart.extraBottomMargin) {
+                chart.marginBottom += chart.extraBottomMargin;
+        }
+        if (chart.extraTopMargin) {
+                chart.plotTop += chart.extraTopMargin;
+        }
+
+        // pre-render axes to get labels offset width
+        if (chart.hasCartesianSeries) {
+                each(chart.axes, function (axis) {
+                        axis.getOffset();
+                });
+        }
+
+        if (!defined(margin[3])) {
+                chart.plotLeft += axisOffset[3];
+        }
+        if (!defined(margin[0])) {
+                chart.plotTop += axisOffset[0];
+        }
+        if (!defined(margin[2])) {
+                chart.marginBottom += axisOffset[2];
+        }
+        if (!defined(margin[1])) {
+                chart.marginRight += axisOffset[1];
+        }
+
+        chart.setChartSize();
+
+},
+
+/**
+ * Resize the chart to its container if size is not explicitly set
+ */
+reflow: function (e) {
+        var chart = this,
+                optionsChart = chart.options.chart,
+                renderTo = chart.renderTo,
+                width = optionsChart.width || adapterRun(renderTo, 'width'),
+                height = optionsChart.height || adapterRun(renderTo, 'height'),
+                target = e ? e.target : win, // #805 - MooTools doesn't supply e
+                doReflow = function () {
+                        if (chart.container) { // It may have been destroyed in the meantime (#1257)
+                                chart.setSize(width, height, false);
+                                chart.hasUserSize = null;
+                        }
+                };
+
+        // Width and height checks for display:none. Target is doc in IE8 and Opera,
+        // win in Firefox, Chrome and IE9.
+        if (!chart.hasUserSize && width && height && (target === win || target === doc)) {
+                if (width !== chart.containerWidth || height !== chart.containerHeight) {
+                        clearTimeout(chart.reflowTimeout);
+                        if (e) { // Called from window.resize
+                                chart.reflowTimeout = setTimeout(doReflow, 100);
+                        } else { // Called directly (#2224)
+                                doReflow();
+                        }
+                }
+                chart.containerWidth = width;
+                chart.containerHeight = height;
+        }
+},
+
+/**
+ * Add the event handlers necessary for auto resizing
+ */
+initReflow: function () {
+        var chart = this,
+                reflow = function (e) {
+                        chart.reflow(e);
+                };
+
+        addEvent(win, 'resize', reflow);
+        addEvent(chart, 'destroy', function () {
+                removeEvent(win, 'resize', reflow);
+        });
+},
+
+/**
+ * Resize the chart to a given width and height
+ * @param {Number} width
+ * @param {Number} height
+ * @param {Object|Boolean} animation
+ */
+setSize: function (width, height, animation) {
+        var chart = this,
+                chartWidth,
+                chartHeight,
+                fireEndResize;
+
+        // Handle the isResizing counter
+        chart.isResizing += 1;
+        fireEndResize = function () {
+                if (chart) {
+                        fireEvent(chart, 'endResize', null, function () {
+                                chart.isResizing -= 1;
+                        });
+                }
+        };
+
+        // set the animation for the current process
+        setAnimation(animation, chart);
+
+        chart.oldChartHeight = chart.chartHeight;
+        chart.oldChartWidth = chart.chartWidth;
+        if (defined(width)) {
+                chart.chartWidth = chartWidth = mathMax(0, mathRound(width));
+                chart.hasUserSize = !!chartWidth;
+        }
+        if (defined(height)) {
+                chart.chartHeight = chartHeight = mathMax(0, mathRound(height));
+        }
+
+        // Resize the container with the global animation applied if enabled (#2503)
+        (globalAnimation ? animate : css)(chart.container, {
+                width: chartWidth + PX,
+                height: chartHeight + PX
+        }, globalAnimation);
+
+        chart.setChartSize(true);
+        chart.renderer.setSize(chartWidth, chartHeight, animation);
+
+        // handle axes
+        chart.maxTicks = null;
+        each(chart.axes, function (axis) {
+                axis.isDirty = true;
+                axis.setScale();
+        });
+
+        // make sure non-cartesian series are also handled
+        each(chart.series, function (serie) {
+                serie.isDirty = true;
+        });
+
+        chart.isDirtyLegend = true; // force legend redraw
+        chart.isDirtyBox = true; // force redraw of plot and chart border
+
+        chart.layOutTitles(); // #2857
+        chart.getMargins();
+
+        chart.redraw(animation);
+
+        chart.oldChartHeight = null;
+        fireEvent(chart, 'resize');
+
+        // fire endResize and set isResizing back
+        // If animation is disabled, fire without delay
+        if (globalAnimation === false) {
+                fireEndResize();
+        } else { // else set a timeout with the animation duration
+                setTimeout(fireEndResize, (globalAnimation && globalAnimation.duration) || 500);
+        }
+},
+
+/**
+ * Set the public chart properties. This is done before and after the pre-render
+ * to determine margin sizes
+ */
+setChartSize: function (skipAxes) {
+        var chart = this,
+                inverted = chart.inverted,
+                renderer = chart.renderer,
+                chartWidth = chart.chartWidth,
+                chartHeight = chart.chartHeight,
+                optionsChart = chart.options.chart,
+                spacing = chart.spacing,
+                clipOffset = chart.clipOffset,
+                clipX,
+                clipY,
+                plotLeft,
+                plotTop,
+                plotWidth,
+                plotHeight,
+                plotBorderWidth;
+
+        chart.plotLeft = plotLeft = mathRound(chart.plotLeft);
+        chart.plotTop = plotTop = mathRound(chart.plotTop);
+        chart.plotWidth = plotWidth = mathMax(0, mathRound(chartWidth - plotLeft - chart.marginRight));
+        chart.plotHeight = plotHeight = mathMax(0, mathRound(chartHeight - plotTop - chart.marginBottom));
+
+        chart.plotSizeX = inverted ? plotHeight : plotWidth;
+        chart.plotSizeY = inverted ? plotWidth : plotHeight;
+
+        chart.plotBorderWidth = optionsChart.plotBorderWidth || 0;
+
+        // Set boxes used for alignment
+        chart.spacingBox = renderer.spacingBox = {
+                x: spacing[3],
+                y: spacing[0],
+                width: chartWidth - spacing[3] - spacing[1],
+                height: chartHeight - spacing[0] - spacing[2]
+        };
+        chart.plotBox = renderer.plotBox = {
+                x: plotLeft,
+                y: plotTop,
+                width: plotWidth,
+                height: plotHeight
+        };
+
+        plotBorderWidth = 2 * mathFloor(chart.plotBorderWidth / 2);
+        clipX = mathCeil(mathMax(plotBorderWidth, clipOffset[3]) / 2);
+        clipY = mathCeil(mathMax(plotBorderWidth, clipOffset[0]) / 2);
+        chart.clipBox = {
+                x: clipX, 
+                y: clipY, 
+                width: mathFloor(chart.plotSizeX - mathMax(plotBorderWidth, clipOffset[1]) / 2 - clipX), 
+                height: mathFloor(chart.plotSizeY - mathMax(plotBorderWidth, clipOffset[2]) / 2 - clipY)
+        };
+
+        if (!skipAxes) {
+                each(chart.axes, function (axis) {
+                        axis.setAxisSize();
+                        axis.setAxisTranslation();
+                });
+        }
+},
+
+/**
+ * Initial margins before auto size margins are applied
+ */
+resetMargins: function () {
+        var chart = this,
+                spacing = chart.spacing,
+                margin = chart.margin;
+
+        chart.plotTop = pick(margin[0], spacing[0]);
+        chart.marginRight = pick(margin[1], spacing[1]);
+        chart.marginBottom = pick(margin[2], spacing[2]);
+        chart.plotLeft = pick(margin[3], spacing[3]);
+        chart.axisOffset = [0, 0, 0, 0]; // top, right, bottom, left
+        chart.clipOffset = [0, 0, 0, 0];
+},
+
+/**
+ * Draw the borders and backgrounds for chart and plot area
+ */
+drawChartBox: function () {
+        var chart = this,
+                optionsChart = chart.options.chart,
+                renderer = chart.renderer,
+                chartWidth = chart.chartWidth,
+                chartHeight = chart.chartHeight,
+                chartBackground = chart.chartBackground,
+                plotBackground = chart.plotBackground,
+                plotBorder = chart.plotBorder,
+                plotBGImage = chart.plotBGImage,
+                chartBorderWidth = optionsChart.borderWidth || 0,
+                chartBackgroundColor = optionsChart.backgroundColor,
+                plotBackgroundColor = optionsChart.plotBackgroundColor,
+                plotBackgroundImage = optionsChart.plotBackgroundImage,
+                plotBorderWidth = optionsChart.plotBorderWidth || 0,
+                mgn,
+                bgAttr,
+                plotLeft = chart.plotLeft,
+                plotTop = chart.plotTop,
+                plotWidth = chart.plotWidth,
+                plotHeight = chart.plotHeight,
+                plotBox = chart.plotBox,
+                clipRect = chart.clipRect,
+                clipBox = chart.clipBox;
+
+        // Chart area
+        mgn = chartBorderWidth + (optionsChart.shadow ? 8 : 0);
+
+        if (chartBorderWidth || chartBackgroundColor) {
+                if (!chartBackground) {
+
+                        bgAttr = {
+                                fill: chartBackgroundColor || NONE
+                        };
+                        if (chartBorderWidth) { // #980
+                                bgAttr.stroke = optionsChart.borderColor;
+                                bgAttr['stroke-width'] = chartBorderWidth;
+                        }
+                        chart.chartBackground = renderer.rect(mgn / 2, mgn / 2, chartWidth - mgn, chartHeight - mgn,
+                                        optionsChart.borderRadius, chartBorderWidth)
+                                .attr(bgAttr)
+                                .addClass(PREFIX + 'background')
+                                .add()
+                                .shadow(optionsChart.shadow);
+
+                } else { // resize
+                        chartBackground.animate(
+                                chartBackground.crisp({ width: chartWidth - mgn, height: chartHeight - mgn })
+                        );
+                }
+        }
+
+        // Plot background
+        if (plotBackgroundColor) {
+                if (!plotBackground) {
+                        chart.plotBackground = renderer.rect(plotLeft, plotTop, plotWidth, plotHeight, 0)
+                                .attr({
+                                        fill: plotBackgroundColor
+                                })
+                                .add()
+                                .shadow(optionsChart.plotShadow);
+                } else {
+                        plotBackground.animate(plotBox);
+                }
+        }
+        if (plotBackgroundImage) {
+                if (!plotBGImage) {
+                        chart.plotBGImage = renderer.image(plotBackgroundImage, plotLeft, plotTop, plotWidth, plotHeight)
+                                .add();
+                } else {
+                        plotBGImage.animate(plotBox);
+                }
+        }
+
+        // Plot clip
+        if (!clipRect) {
+                chart.clipRect = renderer.clipRect(clipBox);
+        } else {
+                clipRect.animate({
+                        width: clipBox.width,
+                        height: clipBox.height
+                });
+        }
+
+        // Plot area border
+        if (plotBorderWidth) {
+                if (!plotBorder) {
+                        chart.plotBorder = renderer.rect(plotLeft, plotTop, plotWidth, plotHeight, 0, -plotBorderWidth)
+                                .attr({
+                                        stroke: optionsChart.plotBorderColor,
+                                        'stroke-width': plotBorderWidth,
+                                        fill: NONE,
+                                        zIndex: 1
+                                })
+                                .add();
+                } else {
+                        plotBorder.animate(
+                                plotBorder.crisp({ x: plotLeft, y: plotTop, width: plotWidth, height: plotHeight })
+                        );
+                }
+        }
+
+        // reset
+        chart.isDirtyBox = false;
+},
+
+/**
+ * Detect whether a certain chart property is needed based on inspecting its options
+ * and series. This mainly applies to the chart.invert property, and in extensions to 
+ * the chart.angular and chart.polar properties.
+ */
+propFromSeries: function () {
+        var chart = this,
+                optionsChart = chart.options.chart,
+                klass,
+                seriesOptions = chart.options.series,
+                i,
+                value;
+
+        each(['inverted', 'angular', 'polar'], function (key) {
+
+                // The default series type's class
+                klass = seriesTypes[optionsChart.type || optionsChart.defaultSeriesType];
+
+                // Get the value from available chart-wide properties
+                value = (
+                        chart[key] || // 1. it is set before
+                        optionsChart[key] || // 2. it is set in the options
+                        (klass && klass.prototype[key]) // 3. it's default series class requires it
+                );
+
+                // 4. Check if any the chart's series require it
+                i = seriesOptions && seriesOptions.length;
+                while (!value && i--) {
+                        klass = seriesTypes[seriesOptions[i].type];
+                        if (klass && klass.prototype[key]) {
+                                value = true;
+                        }
+                }
+
+                // Set the chart property
+                chart[key] = value;     
+        });
+
+},
+
+/**
+ * Link two or more series together. This is done initially from Chart.render,
+ * and after Chart.addSeries and Series.remove.
+ */
+linkSeries: function () {
+        var chart = this,
+                chartSeries = chart.series;
+
+        // Reset links
+        each(chartSeries, function (series) {
+                series.linkedSeries.length = 0;
+        });
+
+        // Apply new links
+        each(chartSeries, function (series) {
+                var linkedTo = series.options.linkedTo;
+                if (isString(linkedTo)) {
+                        if (linkedTo === ':previous') {
+                                linkedTo = chart.series[series.index - 1];
+                        } else {
+                                linkedTo = chart.get(linkedTo);
+                        }
+                        if (linkedTo) {
+                                linkedTo.linkedSeries.push(series);
+                                series.linkedParent = linkedTo;
+                        }
+                }
+        });
+},
+
+/**
+ * Render series for the chart
+ */
+renderSeries: function () {
+        each(this.series, function (serie) {
+                serie.translate();
+                if (serie.setTooltipPoints) {
+                        serie.setTooltipPoints();
+                }
+                serie.render();
+        });
+},
+
+/**
+ * Render all graphics for the chart
+ */
+render: function () {
+        var chart = this,
+                axes = chart.axes,
+                renderer = chart.renderer,
+                options = chart.options;
+
+        var labels = options.labels,
+                credits = options.credits,
+                creditsHref;
+
+        // Title
+        chart.setTitle();
+
+        // Legend
+        chart.legend = new Legend(chart, options.legend);
+
+        chart.getStacks(); // render stacks
+
+        // Get margins by pre-rendering axes
+        // set axes scales
+        each(axes, function (axis) {
+                axis.setScale();
+        });
+
+        chart.getMargins();
+
+        chart.maxTicks = null; // reset for second pass
+        each(axes, function (axis) {
+                axis.setTickPositions(true); // update to reflect the new margins
+                axis.setMaxTicks();
+        });
+        chart.adjustTickAmounts();
+        chart.getMargins(); // second pass to check for new labels
+
+        // Draw the borders and backgrounds
+        chart.drawChartBox();           
+
+        // Axes
+        if (chart.hasCartesianSeries) {
+                each(axes, function (axis) {
+                        axis.render();
+                });
+        }
+
+        // The series
+        if (!chart.seriesGroup) {
+                chart.seriesGroup = renderer.g('series-group')
+                        .attr({ zIndex: 3 })
+                        .add();
+        }
+        chart.renderSeries();
+
+        // Labels
+        if (labels.items) {
+                each(labels.items, function (label) {
+                        var style = extend(labels.style, label.style),
+                                x = pInt(style.left) + chart.plotLeft,
+                                y = pInt(style.top) + chart.plotTop + 12;
+
+                        // delete to prevent rewriting in IE
+                        delete style.left;
+                        delete style.top;
+
+                        renderer.text(
+                                label.html,
+                                x,
+                                y
+                        )
+                        .attr({ zIndex: 2 })
+                        .css(style)
+                        .add();
+
+                });
+        }
+
+        // Credits
+        if (credits.enabled && !chart.credits) {
+                creditsHref = credits.href;
+                chart.credits = renderer.text(
+                        credits.text,
+                        0,
+                        0
+                )
+                .on('click', function () {
+                        if (creditsHref) {
+                                location.href = creditsHref;
+                        }
+                })
+                .attr({
+                        align: credits.position.align,
+                        zIndex: 8
+                })
+                .css(credits.style)
+                .add()
+                .align(credits.position);
+        }
+
+        // Set flag
+        chart.hasRendered = true;
+
+},
+
+/**
+ * Clean up memory usage
+ */
+destroy: function () {
+        var chart = this,
+                axes = chart.axes,
+                series = chart.series,
+                container = chart.container,
+                i,
+                parentNode = container && container.parentNode;
+
+        // fire the chart.destoy event
+        fireEvent(chart, 'destroy');
+
+        // Delete the chart from charts lookup array
+        charts[chart.index] = UNDEFINED;
+        chartCount--;
+        chart.renderTo.removeAttribute('data-highcharts-chart');
+
+        // remove events
+        removeEvent(chart);
+
+        // ==== Destroy collections:
+        // Destroy axes
+        i = axes.length;
+        while (i--) {
+                axes[i] = axes[i].destroy();
+        }
+
+        // Destroy each series
+        i = series.length;
+        while (i--) {
+                series[i] = series[i].destroy();
+        }
+
+        // ==== Destroy chart properties:
+        each(['title', 'subtitle', 'chartBackground', 'plotBackground', 'plotBGImage', 
+                        'plotBorder', 'seriesGroup', 'clipRect', 'credits', 'pointer', 'scroller', 
+                        'rangeSelector', 'legend', 'resetZoomButton', 'tooltip', 'renderer'], function (name) {
+                var prop = chart[name];
+
+                if (prop && prop.destroy) {
+                        chart[name] = prop.destroy();
+                }
+        });
+
+        // remove container and all SVG
+        if (container) { // can break in IE when destroyed before finished loading
+                container.innerHTML = '';
+                removeEvent(container);
+                if (parentNode) {
+                        discardElement(container);
+                }
+
+        }
+
+        // clean it all up
+        for (i in chart) {
+                delete chart[i];
+        }
+
+},
+
+/**
+ * VML namespaces can't be added until after complete. Listening
+ * for Perini's doScroll hack is not enough.
+ */
+isReadyToRender: function () {
+        var chart = this;
+
+        // Note: in spite of JSLint's complaints, win == win.top is required
+        /*jslint eqeq: true*/
+        if ((!hasSVG && (win == win.top && doc.readyState !== 'complete')) || (useCanVG && !win.canvg)) {
+        /*jslint eqeq: false*/
+                if (useCanVG) {
+                        // Delay rendering until canvg library is downloaded and ready
+                        CanVGController.push(function () { chart.firstRender(); }, chart.options.global.canvasToolsURL);
+                } else {
+                        doc.attachEvent('onreadystatechange', function () {
+                                doc.detachEvent('onreadystatechange', chart.firstRender);
+                                if (doc.readyState === 'complete') {
+                                        chart.firstRender();
+                                }
+                        });
+                }
+                return false;
+        }
+        return true;
+},
+
+/**
+ * Prepare for first rendering after all data are loaded
+ */
+firstRender: function () {
+        var chart = this,
+                options = chart.options,
+                callback = chart.callback;
+
+        // Check whether the chart is ready to render
+        if (!chart.isReadyToRender()) {
+                return;
+        }
+
+        // Create the container
+        chart.getContainer();
+
+        // Run an early event after the container and renderer are established
+        fireEvent(chart, 'init');
+
+        chart.resetMargins();
+        chart.setChartSize();
+
+        // Set the common chart properties (mainly invert) from the given series
+        chart.propFromSeries();
+
+        // get axes
+        chart.getAxes();
+
+        // Initialize the series
+        each(options.series || [], function (serieOptions) {
+                chart.initSeries(serieOptions);
+        });
+
+        chart.linkSeries();
+
+        // Run an event after axes and series are initialized, but before render. At this stage,
+        // the series data is indexed and cached in the xData and yData arrays, so we can access
+        // those before rendering. Used in Highstock. 
+        fireEvent(chart, 'beforeRender'); 
+
+        // depends on inverted and on margins being set
+        if (Highcharts.Pointer) {
+                chart.pointer = new Pointer(chart, options);
+        }
+
+        chart.render();
+
+        // add canvas
+        chart.renderer.draw();
+        // run callbacks
+        if (callback) {
+                callback.apply(chart, [chart]);
+        }
+        each(chart.callbacks, function (fn) {
+                fn.apply(chart, [chart]);
+        });
+
+        // If the chart was rendered outside the top container, put it back in
+        chart.cloneRenderTo(true);
+
+        fireEvent(chart, 'load');
+
+},
+
+/**
+* Creates arrays for spacing and margin from given options.
+*/
+splashArray: function (target, options) {
+        var oVar = options[target],
+                tArray = isObject(oVar) ? oVar : [oVar, oVar, oVar, oVar];
+
+        return [pick(options[target + 'Top'], tArray[0]),
+                        pick(options[target + 'Right'], tArray[1]),
+                        pick(options[target + 'Bottom'], tArray[2]),
+                        pick(options[target + 'Left'], tArray[3])];
+}
+ +

}; // end Chart

+ +

// Hook for exporting module Chart.prototype.callbacks = [];

+ +

var CenteredSeriesMixin = Highcharts.CenteredSeriesMixin = {

+ +
/**
+ * Get the center of the pie based on the size and center options relative to the  
+ * plot area. Borrowed by the polar and gauge series types.
+ */
+getCenter: function () {
+
+        var options = this.options,
+                chart = this.chart,
+                slicingRoom = 2 * (options.slicedOffset || 0),
+                handleSlicingRoom,
+                plotWidth = chart.plotWidth - 2 * slicingRoom,
+                plotHeight = chart.plotHeight - 2 * slicingRoom,
+                centerOption = options.center,
+                positions = [pick(centerOption[0], '50%'), pick(centerOption[1], '50%'), options.size || '100%', options.innerSize || 0],
+                smallestSize = mathMin(plotWidth, plotHeight),
+                isPercent;
+
+        return map(positions, function (length, i) {
+                isPercent = /%$/.test(length);
+                handleSlicingRoom = i < 2 || (i === 2 && isPercent);
+                return (isPercent ?
+                        // i == 0: centerX, relative to width
+                        // i == 1: centerY, relative to height
+                        // i == 2: size, relative to smallestSize
+                        // i == 4: innerSize, relative to smallestSize
+                        [plotWidth, plotHeight, smallestSize, smallestSize][i] *
+                                pInt(length) / 100 :
+                        length) + (handleSlicingRoom ? slicingRoom : 0);
+        });
+}
+ +

};

+ +

/**

+ +
* The Point object and prototype. Inheritable and used as base for PiePoint
+*/
+ +

var Point = function () {}; Point.prototype = {

+ +
/**
+ * Initialize the point
+ * @param {Object} series The series object containing this point
+ * @param {Object} options The data in either number, array or object format
+ */
+init: function (series, options, x) {
+
+        var point = this,
+                colors;
+        point.series = series;
+        point.applyOptions(options, x);
+        point.pointAttr = {};
+
+        if (series.options.colorByPoint) {
+                colors = series.options.colors || series.chart.options.colors;
+                point.color = point.color || colors[series.colorCounter++];
+                // loop back to zero
+                if (series.colorCounter === colors.length) {
+                        series.colorCounter = 0;
+                }
+        }
+
+        series.chart.pointCount++;
+        return point;
+},
+/**
+ * Apply the options containing the x and y data and possible some extra properties.
+ * This is called on point init or from point.update.
+ *
+ * @param {Object} options
+ */
+applyOptions: function (options, x) {
+        var point = this,
+                series = point.series,
+                pointValKey = series.pointValKey;
+
+        options = Point.prototype.optionsToObject.call(this, options);
+
+        // copy options directly to point
+        extend(point, options);
+        point.options = point.options ? extend(point.options, options) : options;
+
+        // For higher dimension series types. For instance, for ranges, point.y is mapped to point.low.
+        if (pointValKey) {
+                point.y = point[pointValKey];
+        }
+
+        // If no x is set by now, get auto incremented value. All points must have an
+        // x value, however the y value can be null to create a gap in the series
+        if (point.x === UNDEFINED && series) {
+                point.x = x === UNDEFINED ? series.autoIncrement() : x;
+        }
+
+        return point;
+},
+
+/**
+ * Transform number or array configs into objects
+ */
+optionsToObject: function (options) {
+        var ret = {},
+                series = this.series,
+                pointArrayMap = series.pointArrayMap || ['y'],
+                valueCount = pointArrayMap.length,
+                firstItemType,
+                i = 0,
+                j = 0;
+
+        if (typeof options === 'number' || options === null) {
+                ret[pointArrayMap[0]] = options;
+
+        } else if (isArray(options)) {
+                // with leading x value
+                if (options.length > valueCount) {
+                        firstItemType = typeof options[0];
+                        if (firstItemType === 'string') {
+                                ret.name = options[0];
+                        } else if (firstItemType === 'number') {
+                                ret.x = options[0];
+                        }
+                        i++;
+                }
+                while (j < valueCount) {
+                        ret[pointArrayMap[j++]] = options[i++];
+                }
+        } else if (typeof options === 'object') {
+                ret = options;
+
+                // This is the fastest way to detect if there are individual point dataLabels that need
+                // to be considered in drawDataLabels. These can only occur in object configs.
+                if (options.dataLabels) {
+                        series._hasPointLabels = true;
+                }
+
+                // Same approach as above for markers
+                if (options.marker) {
+                        series._hasPointMarkers = true;
+                }
+        }
+        return ret;
+},
+
+/**
+ * Destroy a point to clear memory. Its reference still stays in series.data.
+ */
+destroy: function () {
+        var point = this,
+                series = point.series,
+                chart = series.chart,
+                hoverPoints = chart.hoverPoints,
+                prop;
+
+        chart.pointCount--;
+
+        if (hoverPoints) {
+                point.setState();
+                erase(hoverPoints, point);
+                if (!hoverPoints.length) {
+                        chart.hoverPoints = null;
+                }
+
+        }
+        if (point === chart.hoverPoint) {
+                point.onMouseOut();
+        }
+
+        // remove all events
+        if (point.graphic || point.dataLabel) { // removeEvent and destroyElements are performance expensive
+                removeEvent(point);
+                point.destroyElements();
+        }
+
+        if (point.legendItem) { // pies have legend items
+                chart.legend.destroyItem(point);
+        }
+
+        for (prop in point) {
+                point[prop] = null;
+        }
+
+},
+
+/**
+ * Destroy SVG elements associated with the point
+ */
+destroyElements: function () {
+        var point = this,
+                props = ['graphic', 'dataLabel', 'dataLabelUpper', 'group', 'connector', 'shadowGroup'],
+                prop,
+                i = 6;
+        while (i--) {
+                prop = props[i];
+                if (point[prop]) {
+                        point[prop] = point[prop].destroy();
+                }
+        }
+},
+
+/**
+ * Return the configuration hash needed for the data label and tooltip formatters
+ */
+getLabelConfig: function () {
+        var point = this;
+        return {
+                x: point.category,
+                y: point.y,
+                key: point.name || point.category,
+                series: point.series,
+                point: point,
+                percentage: point.percentage,
+                total: point.total || point.stackTotal
+        };
+},      
+
+/**
+ * Extendable method for formatting each point's tooltip line
+ *
+ * @return {String} A string to be concatenated in to the common tooltip text
+ */
+tooltipFormatter: function (pointFormat) {
+
+        // Insert options for valueDecimals, valuePrefix, and valueSuffix
+        var series = this.series,
+                seriesTooltipOptions = series.tooltipOptions,
+                valueDecimals = pick(seriesTooltipOptions.valueDecimals, ''),
+                valuePrefix = seriesTooltipOptions.valuePrefix || '',
+                valueSuffix = seriesTooltipOptions.valueSuffix || '';
+
+        // Loop over the point array map and replace unformatted values with sprintf formatting markup
+        each(series.pointArrayMap || ['y'], function (key) {
+                key = '{point.' + key; // without the closing bracket
+                if (valuePrefix || valueSuffix) {
+                        pointFormat = pointFormat.replace(key + '}', valuePrefix + key + '}' + valueSuffix);
+                }
+                pointFormat = pointFormat.replace(key + '}', key + ':,.' + valueDecimals + 'f}');
+        });
+
+        return format(pointFormat, {
+                point: this,
+                series: this.series
+        });
+},
+
+/**
+ * Fire an event on the Point object. Must not be renamed to fireEvent, as this
+ * causes a name clash in MooTools
+ * @param {String} eventType
+ * @param {Object} eventArgs Additional event arguments
+ * @param {Function} defaultFunction Default event handler
+ */
+firePointEvent: function (eventType, eventArgs, defaultFunction) {
+        var point = this,
+                series = this.series,
+                seriesOptions = series.options;
+
+        // load event handlers on demand to save time on mouseover/out
+        if (seriesOptions.point.events[eventType] || (point.options && point.options.events && point.options.events[eventType])) {
+                this.importEvents();
+        }
+
+        // add default handler if in selection mode
+        if (eventType === 'click' && seriesOptions.allowPointSelect) {
+                defaultFunction = function (event) {
+                        // Control key is for Windows, meta (= Cmd key) for Mac, Shift for Opera
+                        point.select(null, event.ctrlKey || event.metaKey || event.shiftKey);
+                };
+        }
+
+        fireEvent(this, eventType, eventArgs, defaultFunction);
+}
+ +

};/**

+ +
* @classDescription The base function which all other series types inherit from. The data in the series is stored
+* in various arrays.
+*
+* - First, series.options.data contains all the original config options for
+* each point whether added by options or methods like series.addPoint.
+* - Next, series.data contains those values converted to points, but in case the series data length
+* exceeds the cropThreshold, or if the data is grouped, series.data doesn't contain all the points. It
+* only contains the points that have been created on demand.
+* - Then there's series.points that contains all currently visible point objects. In case of cropping,
+* the cropped-away points are not part of this array. The series.points array starts at series.cropStart
+* compared to series.data and series.options.data. If however the series data is grouped, these can't
+* be correlated one to one.
+* - series.xData and series.processedXData contain clean x values, equivalent to series.data and series.points.
+* - series.yData and series.processedYData contain clean x values, equivalent to series.data and series.points.
+*
+* @param {Object} chart
+* @param {Object} options
+*/
+ +

var Series = function () {};

+ +

Series.prototype = {

+ +
isCartesian: true,
+type: 'line',
+pointClass: Point,
+sorted: true, // requires the data to be sorted
+requireSorting: true,
+pointAttrToOptions: { // mapping between SVG attributes and the corresponding options
+        stroke: 'lineColor',
+        'stroke-width': 'lineWidth',
+        fill: 'fillColor',
+        r: 'radius'
+},
+axisTypes: ['xAxis', 'yAxis'],
+colorCounter: 0,
+parallelArrays: ['x', 'y'], // each point's x and y values are stored in this.xData and this.yData
+init: function (chart, options) {
+        var series = this,
+                eventType,
+                events,
+                chartSeries = chart.series,
+                sortByIndex = function (a, b) {
+                        return pick(a.options.index, a._i) - pick(b.options.index, b._i);
+                };
+
+        series.chart = chart;
+        series.options = options = series.setOptions(options); // merge with plotOptions
+        series.linkedSeries = [];
+
+        // bind the axes
+        series.bindAxes();
+
+        // set some variables
+        extend(series, {
+                name: options.name,
+                state: NORMAL_STATE,
+                pointAttr: {},
+                visible: options.visible !== false, // true by default
+                selected: options.selected === true // false by default
+        });
+
+        // special
+        if (useCanVG) {
+                options.animation = false;
+        }
+
+        // register event listeners
+        events = options.events;
+        for (eventType in events) {
+                addEvent(series, eventType, events[eventType]);
+        }
+        if (
+                (events && events.click) ||
+                (options.point && options.point.events && options.point.events.click) ||
+                options.allowPointSelect
+        ) {
+                chart.runTrackerClick = true;
+        }
+
+        series.getColor();
+        series.getSymbol();
+
+        // Set the data
+        each(series.parallelArrays, function (key) {
+                series[key + 'Data'] = [];
+        });
+        series.setData(options.data, false);
+
+        // Mark cartesian
+        if (series.isCartesian) {
+                chart.hasCartesianSeries = true;
+        }
+
+        // Register it in the chart
+        chartSeries.push(series);
+        series._i = chartSeries.length - 1;
+
+        // Sort series according to index option (#248, #1123, #2456)
+        stableSort(chartSeries, sortByIndex);
+        if (this.yAxis) {
+                stableSort(this.yAxis.series, sortByIndex);
+        }
+
+        each(chartSeries, function (series, i) {
+                series.index = i;
+                series.name = series.name || 'Series ' + (i + 1);
+        });
+
+},
+
+/**
+ * Set the xAxis and yAxis properties of cartesian series, and register the series
+ * in the axis.series array
+ */
+bindAxes: function () {
+        var series = this,
+                seriesOptions = series.options,
+                chart = series.chart,
+                axisOptions;
+
+        each(series.axisTypes || [], function (AXIS) { // repeat for xAxis and yAxis
+
+                each(chart[AXIS], function (axis) { // loop through the chart's axis objects
+                        axisOptions = axis.options;
+
+                        // apply if the series xAxis or yAxis option mathches the number of the
+                        // axis, or if undefined, use the first axis
+                        if ((seriesOptions[AXIS] === axisOptions.index) ||
+                                        (seriesOptions[AXIS] !== UNDEFINED && seriesOptions[AXIS] === axisOptions.id) ||
+                                        (seriesOptions[AXIS] === UNDEFINED && axisOptions.index === 0)) {
+
+                                // register this series in the axis.series lookup
+                                axis.series.push(series);
+
+                                // set this series.xAxis or series.yAxis reference
+                                series[AXIS] = axis;
+
+                                // mark dirty for redraw
+                                axis.isDirty = true;
+                        }
+                });
+
+                // The series needs an X and an Y axis
+                if (!series[AXIS] && series.optionalAxis !== AXIS) {
+                        error(18, true);
+                }
+
+        });
+},
+
+/**
+ * For simple series types like line and column, the data values are held in arrays like
+ * xData and yData for quick lookup to find extremes and more. For multidimensional series
+ * like bubble and map, this can be extended with arrays like zData and valueData by
+ * adding to the series.parallelArrays array.
+ */
+updateParallelArrays: function (point, i) {
+        var series = point.series,
+                args = arguments,
+                fn = typeof i === 'number' ?
+                         // Insert the value in the given position
+                        function (key) {
+                                var val = key === 'y' && series.toYData ? series.toYData(point) : point[key];
+                                series[key + 'Data'][i] = val;
+                        } :
+                        // Apply the method specified in i with the following arguments as arguments
+                        function (key) {
+                                Array.prototype[i].apply(series[key + 'Data'], Array.prototype.slice.call(args, 2));
+                        };
+
+        each(series.parallelArrays, fn);
+},
+
+/**
+ * Return an auto incremented x value based on the pointStart and pointInterval options.
+ * This is only used if an x value is not given for the point that calls autoIncrement.
+ */
+autoIncrement: function () {
+        var series = this,
+                options = series.options,
+                xIncrement = series.xIncrement;
+
+        xIncrement = pick(xIncrement, options.pointStart, 0);
+
+        series.pointInterval = pick(series.pointInterval, options.pointInterval, 1);
+
+        series.xIncrement = xIncrement + series.pointInterval;
+        return xIncrement;
+},
+
+/**
+ * Divide the series data into segments divided by null values.
+ */
+getSegments: function () {
+        var series = this,
+                lastNull = -1,
+                segments = [],
+                i,
+                points = series.points,
+                pointsLength = points.length;
+
+        if (pointsLength) { // no action required for []
+
+                // if connect nulls, just remove null points
+                if (series.options.connectNulls) {
+                        i = pointsLength;
+                        while (i--) {
+                                if (points[i].y === null) {
+                                        points.splice(i, 1);
+                                }
+                        }
+                        if (points.length) {
+                                segments = [points];
+                        }
+
+                // else, split on null points
+                } else {
+                        each(points, function (point, i) {
+                                if (point.y === null) {
+                                        if (i > lastNull + 1) {
+                                                segments.push(points.slice(lastNull + 1, i));
+                                        }
+                                        lastNull = i;
+                                } else if (i === pointsLength - 1) { // last value
+                                        segments.push(points.slice(lastNull + 1, i + 1));
+                                }
+                        });
+                }
+        }
+
+        // register it
+        series.segments = segments;
+},
+
+/**
+ * Set the series options by merging from the options tree
+ * @param {Object} itemOptions
+ */
+setOptions: function (itemOptions) {
+        var chart = this.chart,
+                chartOptions = chart.options,
+                plotOptions = chartOptions.plotOptions,
+                userOptions = chart.userOptions || {},
+                userPlotOptions = userOptions.plotOptions || {},
+                typeOptions = plotOptions[this.type],
+                options;
+
+        this.userOptions = itemOptions;
+
+        options = merge(
+                typeOptions,
+                plotOptions.series,
+                itemOptions
+        );
+
+        // The tooltip options are merged between global and series specific options
+        this.tooltipOptions = merge(
+                defaultOptions.tooltip,
+                defaultOptions.plotOptions[this.type].tooltip,
+                userOptions.tooltip,
+                userPlotOptions.series && userPlotOptions.series.tooltip,
+                userPlotOptions[this.type] && userPlotOptions[this.type].tooltip,
+                itemOptions.tooltip
+        );
+
+        // Delete marker object if not allowed (#1125)
+        if (typeOptions.marker === null) {
+                delete options.marker;
+        }
+
+        return options;
+
+},
+/**
+ * Get the series' color
+ */
+getColor: function () {
+        var options = this.options,
+                userOptions = this.userOptions,
+                defaultColors = this.chart.options.colors,
+                counters = this.chart.counters,
+                color,
+                colorIndex;
+
+        color = options.color || defaultPlotOptions[this.type].color;
+
+        if (!color && !options.colorByPoint) {
+                if (defined(userOptions._colorIndex)) { // after Series.update()
+                        colorIndex = userOptions._colorIndex;
+                } else {
+                        userOptions._colorIndex = counters.color;
+                        colorIndex = counters.color++;
+                }
+                color = defaultColors[colorIndex];
+        }
+
+        this.color = color;
+        counters.wrapColor(defaultColors.length);
+},
+/**
+ * Get the series' symbol
+ */
+getSymbol: function () {
+        var series = this,
+                userOptions = series.userOptions,
+                seriesMarkerOption = series.options.marker,
+                chart = series.chart,
+                defaultSymbols = chart.options.symbols,
+                counters = chart.counters,
+                symbolIndex;
+
+        series.symbol = seriesMarkerOption.symbol;
+        if (!series.symbol) {
+                if (defined(userOptions._symbolIndex)) { // after Series.update()
+                        symbolIndex = userOptions._symbolIndex;
+                } else {
+                        userOptions._symbolIndex = counters.symbol;
+                        symbolIndex = counters.symbol++;
+                }
+                series.symbol = defaultSymbols[symbolIndex];
+        }
+
+        // don't substract radius in image symbols (#604)
+        if (/^url/.test(series.symbol)) {
+                seriesMarkerOption.radius = 0;
+        }
+        counters.wrapSymbol(defaultSymbols.length);
+},
+
+drawLegendSymbol: LegendSymbolMixin.drawLineMarker,
+
+/**
+ * Replace the series data with a new set of data
+ * @param {Object} data
+ * @param {Object} redraw
+ */
+setData: function (data, redraw, animation, updatePoints) {
+        var series = this,
+                oldData = series.points,
+                oldDataLength = (oldData && oldData.length) || 0,
+                dataLength,
+                options = series.options,
+                chart = series.chart,
+                firstPoint = null,
+                xAxis = series.xAxis,
+                hasCategories = xAxis && !!xAxis.categories,
+                tooltipPoints = series.tooltipPoints,
+                i,
+                turboThreshold = options.turboThreshold,
+                pt,
+                xData = this.xData,
+                yData = this.yData,
+                pointArrayMap = series.pointArrayMap,
+                valueCount = pointArrayMap && pointArrayMap.length;
+
+        data = data || [];
+        dataLength = data.length;
+        redraw = pick(redraw, true);
+
+        // If the point count is the same as is was, just run Point.update which is
+        // cheaper, allows animation, and keeps references to points.
+        if (updatePoints !== false && dataLength && oldDataLength === dataLength && !series.cropped && !series.hasGroupedData) {
+                each(data, function (point, i) {
+                        oldData[i].update(point, false);
+                });
+
+        } else {
+
+                // Reset properties
+                series.xIncrement = null;
+                series.pointRange = hasCategories ? 1 : options.pointRange;
+
+                series.colorCounter = 0; // for series with colorByPoint (#1547)
+
+                // Update parallel arrays
+                each(this.parallelArrays, function (key) {
+                        series[key + 'Data'].length = 0;
+                });
+
+                // In turbo mode, only one- or twodimensional arrays of numbers are allowed. The
+                // first value is tested, and we assume that all the rest are defined the same
+                // way. Although the 'for' loops are similar, they are repeated inside each
+                // if-else conditional for max performance.
+                if (turboThreshold && dataLength > turboThreshold) {
+
+                        // find the first non-null point
+                        i = 0;
+                        while (firstPoint === null && i < dataLength) {
+                                firstPoint = data[i];
+                                i++;
+                        }
+
+                        if (isNumber(firstPoint)) { // assume all points are numbers
+                                var x = pick(options.pointStart, 0),
+                                        pointInterval = pick(options.pointInterval, 1);
+
+                                for (i = 0; i < dataLength; i++) {
+                                        xData[i] = x;
+                                        yData[i] = data[i];
+                                        x += pointInterval;
+                                }
+                                series.xIncrement = x;
+                        } else if (isArray(firstPoint)) { // assume all points are arrays
+                                if (valueCount) { // [x, low, high] or [x, o, h, l, c]
+                                        for (i = 0; i < dataLength; i++) {
+                                                pt = data[i];
+                                                xData[i] = pt[0];
+                                                yData[i] = pt.slice(1, valueCount + 1);
+                                        }
+                                } else { // [x, y]
+                                        for (i = 0; i < dataLength; i++) {
+                                                pt = data[i];
+                                                xData[i] = pt[0];
+                                                yData[i] = pt[1];
+                                        }
+                                }
+                        } else {
+                                error(12); // Highcharts expects configs to be numbers or arrays in turbo mode
+                        }
+                } else {
+                        for (i = 0; i < dataLength; i++) {
+                                if (data[i] !== UNDEFINED) { // stray commas in oldIE
+                                        pt = { series: series };
+                                        series.pointClass.prototype.applyOptions.apply(pt, [data[i]]);
+                                        series.updateParallelArrays(pt, i);
+                                        if (hasCategories && pt.name) {
+                                                xAxis.names[pt.x] = pt.name; // #2046
+                                        }
+                                }
+                        }
+                }
+
+                // Forgetting to cast strings to numbers is a common caveat when handling CSV or JSON
+                if (isString(yData[0])) {
+                        error(14, true);
+                }
+
+                series.data = [];
+                series.options.data = data;
+                //series.zData = zData;
+
+                // destroy old points
+                i = oldDataLength;
+                while (i--) {
+                        if (oldData[i] && oldData[i].destroy) {
+                                oldData[i].destroy();
+                        }
+                }
+                if (tooltipPoints) { // #2594
+                        tooltipPoints.length = 0;
+                }
+
+                // reset minRange (#878)
+                if (xAxis) {
+                        xAxis.minRange = xAxis.userMinRange;
+                }
+
+                // redraw
+                series.isDirty = series.isDirtyData = chart.isDirtyBox = true;
+                animation = false;
+        }
+
+        if (redraw) {
+                chart.redraw(animation);
+        }
+},
+
+/**
+ * Process the data by cropping away unused data points if the series is longer
+ * than the crop threshold. This saves computing time for lage series.
+ */
+processData: function (force) {
+        var series = this,
+                processedXData = series.xData, // copied during slice operation below
+                processedYData = series.yData,
+                dataLength = processedXData.length,
+                croppedData,
+                cropStart = 0,
+                cropped,
+                distance,
+                closestPointRange,
+                xAxis = series.xAxis,
+                i, // loop variable
+                options = series.options,
+                cropThreshold = options.cropThreshold,
+                activePointCount = 0,
+                isCartesian = series.isCartesian,
+                min,
+                max;
+
+        // If the series data or axes haven't changed, don't go through this. Return false to pass
+        // the message on to override methods like in data grouping.
+        if (isCartesian && !series.isDirty && !xAxis.isDirty && !series.yAxis.isDirty && !force) {
+                return false;
+        }
+
+        // optionally filter out points outside the plot area
+        if (isCartesian && series.sorted && (!cropThreshold || dataLength > cropThreshold || series.forceCrop)) {
+
+                min = xAxis.min;
+                max = xAxis.max;
+
+                // it's outside current extremes
+                if (processedXData[dataLength - 1] < min || processedXData[0] > max) {
+                        processedXData = [];
+                        processedYData = [];
+
+                // only crop if it's actually spilling out
+                } else if (processedXData[0] < min || processedXData[dataLength - 1] > max) {
+                        croppedData = this.cropData(series.xData, series.yData, min, max);
+                        processedXData = croppedData.xData;
+                        processedYData = croppedData.yData;
+                        cropStart = croppedData.start;
+                        cropped = true;
+                        activePointCount = processedXData.length;
+                }
+        }
+
+        // Find the closest distance between processed points
+        for (i = processedXData.length - 1; i >= 0; i--) {
+                distance = processedXData[i] - processedXData[i - 1];
+
+                if (!cropped && processedXData[i] > min && processedXData[i] < max) {
+                        activePointCount++;
+                }
+                if (distance > 0 && (closestPointRange === UNDEFINED || distance < closestPointRange)) {
+                        closestPointRange = distance;
+
+                // Unsorted data is not supported by the line tooltip, as well as data grouping and
+                // navigation in Stock charts (#725) and width calculation of columns (#1900)
+                } else if (distance < 0 && series.requireSorting) {
+                        error(15);
+                }
+        }
+
+        // Record the properties
+        series.cropped = cropped; // undefined or true
+        series.cropStart = cropStart;
+        series.processedXData = processedXData;
+        series.processedYData = processedYData;
+        series.activePointCount = activePointCount;
+
+        if (options.pointRange === null) { // null means auto, as for columns, candlesticks and OHLC
+                series.pointRange = closestPointRange || 1;
+        }
+        series.closestPointRange = closestPointRange;
+
+},
+
+/**
+ * Iterate over xData and crop values between min and max. Returns object containing crop start/end
+ * cropped xData with corresponding part of yData, dataMin and dataMax within the cropped range
+ */
+cropData: function (xData, yData, min, max) {
+        var dataLength = xData.length,
+                cropStart = 0,
+                cropEnd = dataLength,
+                cropShoulder = pick(this.cropShoulder, 1), // line-type series need one point outside
+                i;
+
+        // iterate up to find slice start
+        for (i = 0; i < dataLength; i++) {
+                if (xData[i] >= min) {
+                        cropStart = mathMax(0, i - cropShoulder);
+                        break;
+                }
+        }
+
+        // proceed to find slice end
+        for (; i < dataLength; i++) {
+                if (xData[i] > max) {
+                        cropEnd = i + cropShoulder;
+                        break;
+                }
+        }
+
+        return {
+                xData: xData.slice(cropStart, cropEnd),
+                yData: yData.slice(cropStart, cropEnd),
+                start: cropStart,
+                end: cropEnd
+        };
+},
+
+/**
+ * Generate the data point after the data has been processed by cropping away
+ * unused points and optionally grouped in Highcharts Stock.
+ */
+generatePoints: function () {
+        var series = this,
+                options = series.options,
+                dataOptions = options.data,
+                data = series.data,
+                dataLength,
+                processedXData = series.processedXData,
+                processedYData = series.processedYData,
+                pointClass = series.pointClass,
+                processedDataLength = processedXData.length,
+                cropStart = series.cropStart || 0,
+                cursor,
+                hasGroupedData = series.hasGroupedData,
+                point,
+                points = [],
+                i;
+
+        if (!data && !hasGroupedData) {
+                var arr = [];
+                arr.length = dataOptions.length;
+                data = series.data = arr;
+        }
+
+        for (i = 0; i < processedDataLength; i++) {
+                cursor = cropStart + i;
+                if (!hasGroupedData) {
+                        if (data[cursor]) {
+                                point = data[cursor];
+                        } else if (dataOptions[cursor] !== UNDEFINED) { // #970
+                                data[cursor] = point = (new pointClass()).init(series, dataOptions[cursor], processedXData[i]);
+                        }
+                        points[i] = point;
+                } else {
+                        // splat the y data in case of ohlc data array
+                        points[i] = (new pointClass()).init(series, [processedXData[i]].concat(splat(processedYData[i])));
+                }
+        }
+
+        // Hide cropped-away points - this only runs when the number of points is above cropThreshold, or when
+        // swithching view from non-grouped data to grouped data (#637)
+        if (data && (processedDataLength !== (dataLength = data.length) || hasGroupedData)) {
+                for (i = 0; i < dataLength; i++) {
+                        if (i === cropStart && !hasGroupedData) { // when has grouped data, clear all points
+                                i += processedDataLength;
+                        }
+                        if (data[i]) {
+                                data[i].destroyElements();
+                                data[i].plotX = UNDEFINED; // #1003
+                        }
+                }
+        }
+
+        series.data = data;
+        series.points = points;
+},
+
+/**
+ * Calculate Y extremes for visible data
+ */
+getExtremes: function (yData) {
+        var xAxis = this.xAxis,
+                yAxis = this.yAxis,
+                xData = this.processedXData,
+                yDataLength,
+                activeYData = [],
+                activeCounter = 0,
+                xExtremes = xAxis.getExtremes(), // #2117, need to compensate for log X axis
+                xMin = xExtremes.min,
+                xMax = xExtremes.max,
+                validValue,
+                withinRange,
+                dataMin,
+                dataMax,
+                x,
+                y,
+                i,
+                j;
+
+        yData = yData || this.stackedYData || this.processedYData;
+        yDataLength = yData.length;
+
+        for (i = 0; i < yDataLength; i++) {
+
+                x = xData[i];
+                y = yData[i];
+
+                // For points within the visible range, including the first point outside the
+                // visible range, consider y extremes
+                validValue = y !== null && y !== UNDEFINED && (!yAxis.isLog || (y.length || y > 0));
+                withinRange = this.getExtremesFromAll || this.cropped || ((xData[i + 1] || x) >= xMin &&
+                        (xData[i - 1] || x) <= xMax);
+
+                if (validValue && withinRange) {
+
+                        j = y.length;
+                        if (j) { // array, like ohlc or range data
+                                while (j--) {
+                                        if (y[j] !== null) {
+                                                activeYData[activeCounter++] = y[j];
+                                        }
+                                }
+                        } else {
+                                activeYData[activeCounter++] = y;
+                        }
+                }
+        }
+        this.dataMin = pick(dataMin, arrayMin(activeYData));
+        this.dataMax = pick(dataMax, arrayMax(activeYData));
+},
+
+/**
+ * Translate data points from raw data values to chart specific positioning data
+ * needed later in drawPoints, drawGraph and drawTracker.
+ */
+translate: function () {
+        if (!this.processedXData) { // hidden series
+                this.processData();
+        }
+        this.generatePoints();
+        var series = this,
+                options = series.options,
+                stacking = options.stacking,
+                xAxis = series.xAxis,
+                categories = xAxis.categories,
+                yAxis = series.yAxis,
+                points = series.points,
+                dataLength = points.length,
+                hasModifyValue = !!series.modifyValue,
+                i,
+                pointPlacement = options.pointPlacement,
+                dynamicallyPlaced = pointPlacement === 'between' || isNumber(pointPlacement),
+                threshold = options.threshold;
+
+        // Translate each point
+        for (i = 0; i < dataLength; i++) {
+                var point = points[i],
+                        xValue = point.x,
+                        yValue = point.y,
+                        yBottom = point.low,
+                        stack = stacking && yAxis.stacks[(series.negStacks && yValue < threshold ? '-' : '') + series.stackKey],
+                        pointStack,
+                        stackValues;
+
+                // Discard disallowed y values for log axes
+                if (yAxis.isLog && yValue <= 0) {
+                        point.y = yValue = null;
+                }
+
+                // Get the plotX translation
+                point.plotX = xAxis.translate(xValue, 0, 0, 0, 1, pointPlacement, this.type === 'flags'); // Math.round fixes #591
+
+                // Calculate the bottom y value for stacked series
+                if (stacking && series.visible && stack && stack[xValue]) {
+
+                        pointStack = stack[xValue];
+                        stackValues = pointStack.points[series.index + ',' + i];
+                        yBottom = stackValues[0];
+                        yValue = stackValues[1];
+
+                        if (yBottom === 0) {
+                                yBottom = pick(threshold, yAxis.min);
+                        }
+                        if (yAxis.isLog && yBottom <= 0) { // #1200, #1232
+                                yBottom = null;
+                        }
+
+                        point.total = point.stackTotal = pointStack.total;
+                        point.percentage = pointStack.total && (point.y / pointStack.total * 100);
+                        point.stackY = yValue;
+
+                        // Place the stack label
+                        pointStack.setOffset(series.pointXOffset || 0, series.barW || 0);
+
+                }
+
+                // Set translated yBottom or remove it
+                point.yBottom = defined(yBottom) ?
+                        yAxis.translate(yBottom, 0, 1, 0, 1) :
+                        null;
+
+                // general hook, used for Highstock compare mode
+                if (hasModifyValue) {
+                        yValue = series.modifyValue(yValue, point);
+                }
+
+                // Set the the plotY value, reset it for redraws
+                point.plotY = (typeof yValue === 'number' && yValue !== Infinity) ?
+                        //mathRound(yAxis.translate(yValue, 0, 1, 0, 1) * 10) / 10 : // Math.round fixes #591
+                        yAxis.translate(yValue, 0, 1, 0, 1) :
+                        UNDEFINED;
+
+                // Set client related positions for mouse tracking
+                point.clientX = dynamicallyPlaced ? xAxis.translate(xValue, 0, 0, 0, 1) : point.plotX; // #1514
+
+                point.negative = point.y < (threshold || 0);
+
+                // some API data
+                point.category = categories && categories[point.x] !== UNDEFINED ?
+                        categories[point.x] : point.x;
+
+        }
+
+        // now that we have the cropped data, build the segments
+        series.getSegments();
+},
+
+/**
+ * Animate in the series
+ */
+animate: function (init) {
+        var series = this,
+                chart = series.chart,
+                renderer = chart.renderer,
+                clipRect,
+                markerClipRect,
+                animation = series.options.animation,
+                clipBox = series.clipBox || chart.clipBox,
+                inverted = chart.inverted,
+                sharedClipKey;
+
+        // Animation option is set to true
+        if (animation && !isObject(animation)) {
+                animation = defaultPlotOptions[series.type].animation;
+        }
+        sharedClipKey = ['_sharedClip', animation.duration, animation.easing, clipBox.height].join(',');
+
+        // Initialize the animation. Set up the clipping rectangle.
+        if (init) {
+
+                // If a clipping rectangle with the same properties is currently present in the chart, use that.
+                clipRect = chart[sharedClipKey];
+                markerClipRect = chart[sharedClipKey + 'm'];
+                if (!clipRect) {
+                        chart[sharedClipKey] = clipRect = renderer.clipRect(
+                                extend(clipBox, { width: 0 })
+                        );
+
+                        chart[sharedClipKey + 'm'] = markerClipRect = renderer.clipRect(
+                                -99, // include the width of the first marker
+                                inverted ? -chart.plotLeft : -chart.plotTop,
+                                99,
+                                inverted ? chart.chartWidth : chart.chartHeight
+                        );
+                }
+                series.group.clip(clipRect);
+                series.markerGroup.clip(markerClipRect);
+                series.sharedClipKey = sharedClipKey;
+
+        // Run the animation
+        } else {
+                clipRect = chart[sharedClipKey];
+                if (clipRect) {
+                        clipRect.animate({
+                                width: chart.plotSizeX
+                        }, animation);
+                }
+                if (chart[sharedClipKey + 'm']) {
+                        chart[sharedClipKey + 'm'].animate({
+                                width: chart.plotSizeX + 99
+                        }, animation);
+                }
+
+                // Delete this function to allow it only once
+                series.animate = null;
+
+        }
+},
+
+/**
+ * This runs after animation to land on the final plot clipping
+ */
+afterAnimate: function () {
+        var chart = this.chart,
+                sharedClipKey = this.sharedClipKey,
+                group = this.group,
+                clipBox = this.clipBox;
+
+        if (group && this.options.clip !== false) {
+                if (!sharedClipKey || !clipBox) {
+                        group.clip(clipBox ? chart.renderer.clipRect(clipBox) : chart.clipRect);
+                }
+                this.markerGroup.clip(); // no clip
+        }
+
+        fireEvent(this, 'afterAnimate');
+
+        // Remove the shared clipping rectancgle when all series are shown
+        setTimeout(function () {
+                if (sharedClipKey && chart[sharedClipKey]) {
+                        if (!clipBox) {
+                                chart[sharedClipKey] = chart[sharedClipKey].destroy();
+                        }
+                        if (chart[sharedClipKey + 'm']) {
+                                chart[sharedClipKey + 'm'] = chart[sharedClipKey + 'm'].destroy();
+                        }
+                }
+        }, 100);
+},
+
+/**
+ * Draw the markers
+ */
+drawPoints: function () {
+        var series = this,
+                pointAttr,
+                points = series.points,
+                chart = series.chart,
+                plotX,
+                plotY,
+                i,
+                point,
+                radius,
+                symbol,
+                isImage,
+                graphic,
+                options = series.options,
+                seriesMarkerOptions = options.marker,
+                seriesPointAttr = series.pointAttr[''],
+                pointMarkerOptions,
+                enabled,
+                isInside,
+                markerGroup = series.markerGroup,
+                globallyEnabled = pick(
+                        seriesMarkerOptions.enabled, 
+                        series.activePointCount < (0.5 * series.xAxis.len / seriesMarkerOptions.radius)
+                );
+
+        if (seriesMarkerOptions.enabled !== false || series._hasPointMarkers) {
+
+                i = points.length;
+                while (i--) {
+                        point = points[i];
+                        plotX = mathFloor(point.plotX); // #1843
+                        plotY = point.plotY;
+                        graphic = point.graphic;
+                        pointMarkerOptions = point.marker || {};
+                        enabled = (globallyEnabled && pointMarkerOptions.enabled === UNDEFINED) || pointMarkerOptions.enabled;
+                        isInside = chart.isInsidePlot(mathRound(plotX), plotY, chart.inverted); // #1858
+
+                        // only draw the point if y is defined
+                        if (enabled && plotY !== UNDEFINED && !isNaN(plotY) && point.y !== null) {
+
+                                // shortcuts
+                                pointAttr = point.pointAttr[point.selected ? SELECT_STATE : NORMAL_STATE] || seriesPointAttr;
+                                radius = pointAttr.r;
+                                symbol = pick(pointMarkerOptions.symbol, series.symbol);
+                                isImage = symbol.indexOf('url') === 0;
+
+                                if (graphic) { // update
+                                        graphic[isInside ? 'show' : 'hide'](true) // Since the marker group isn't clipped, each individual marker must be toggled
+                                                .animate(extend({
+                                                        x: plotX - radius,
+                                                        y: plotY - radius
+                                                }, graphic.symbolName ? { // don't apply to image symbols #507
+                                                        width: 2 * radius,
+                                                        height: 2 * radius
+                                                } : {}));
+                                } else if (isInside && (radius > 0 || isImage)) {
+                                        point.graphic = graphic = chart.renderer.symbol(
+                                                symbol,
+                                                plotX - radius,
+                                                plotY - radius,
+                                                2 * radius,
+                                                2 * radius
+                                        )
+                                        .attr(pointAttr)
+                                        .add(markerGroup);
+                                }
+
+                        } else if (graphic) {
+                                point.graphic = graphic.destroy(); // #1269
+                        }
+                }
+        }
+
+},
+
+/**
+ * Convert state properties from API naming conventions to SVG attributes
+ *
+ * @param {Object} options API options object
+ * @param {Object} base1 SVG attribute object to inherit from
+ * @param {Object} base2 Second level SVG attribute object to inherit from
+ */
+convertAttribs: function (options, base1, base2, base3) {
+        var conversion = this.pointAttrToOptions,
+                attr,
+                option,
+                obj = {};
+
+        options = options || {};
+        base1 = base1 || {};
+        base2 = base2 || {};
+        base3 = base3 || {};
+
+        for (attr in conversion) {
+                option = conversion[attr];
+                obj[attr] = pick(options[option], base1[attr], base2[attr], base3[attr]);
+        }
+        return obj;
+},
+
+/**
+ * Get the state attributes. Each series type has its own set of attributes
+ * that are allowed to change on a point's state change. Series wide attributes are stored for
+ * all series, and additionally point specific attributes are stored for all
+ * points with individual marker options. If such options are not defined for the point,
+ * a reference to the series wide attributes is stored in point.pointAttr.
+ */
+getAttribs: function () {
+        var series = this,
+                seriesOptions = series.options,
+                normalOptions = defaultPlotOptions[series.type].marker ? seriesOptions.marker : seriesOptions,
+                stateOptions = normalOptions.states,
+                stateOptionsHover = stateOptions[HOVER_STATE],
+                pointStateOptionsHover,
+                seriesColor = series.color,
+                normalDefaults = {
+                        stroke: seriesColor,
+                        fill: seriesColor
+                },
+                points = series.points || [], // #927
+                i,
+                point,
+                seriesPointAttr = [],
+                pointAttr,
+                pointAttrToOptions = series.pointAttrToOptions,
+                hasPointSpecificOptions = series.hasPointSpecificOptions,
+                negativeColor = seriesOptions.negativeColor,
+                defaultLineColor = normalOptions.lineColor,
+                defaultFillColor = normalOptions.fillColor,
+                turboThreshold = seriesOptions.turboThreshold,
+                attr,
+                key;
+
+        // series type specific modifications
+        if (seriesOptions.marker) { // line, spline, area, areaspline, scatter
+
+                // if no hover radius is given, default to normal radius + 2
+                stateOptionsHover.radius = stateOptionsHover.radius || normalOptions.radius + 2;
+                stateOptionsHover.lineWidth = stateOptionsHover.lineWidth || normalOptions.lineWidth + 1;
+
+        } else { // column, bar, pie
+
+                // if no hover color is given, brighten the normal color
+                stateOptionsHover.color = stateOptionsHover.color ||
+                        Color(stateOptionsHover.color || seriesColor)
+                                .brighten(stateOptionsHover.brightness).get();
+        }
+
+        // general point attributes for the series normal state
+        seriesPointAttr[NORMAL_STATE] = series.convertAttribs(normalOptions, normalDefaults);
+
+        // HOVER_STATE and SELECT_STATE states inherit from normal state except the default radius
+        each([HOVER_STATE, SELECT_STATE], function (state) {
+                seriesPointAttr[state] =
+                                series.convertAttribs(stateOptions[state], seriesPointAttr[NORMAL_STATE]);
+        });
+
+        // set it
+        series.pointAttr = seriesPointAttr;
+
+        // Generate the point-specific attribute collections if specific point
+        // options are given. If not, create a referance to the series wide point
+        // attributes
+        i = points.length;
+        if (!turboThreshold || i < turboThreshold || hasPointSpecificOptions) {
+                while (i--) {
+                        point = points[i];
+                        normalOptions = (point.options && point.options.marker) || point.options;
+                        if (normalOptions && normalOptions.enabled === false) {
+                                normalOptions.radius = 0;
+                        }
+
+                        if (point.negative && negativeColor) {
+                                point.color = point.fillColor = negativeColor;
+                        }
+
+                        hasPointSpecificOptions = seriesOptions.colorByPoint || point.color; // #868
+
+                        // check if the point has specific visual options
+                        if (point.options) {
+                                for (key in pointAttrToOptions) {
+                                        if (defined(normalOptions[pointAttrToOptions[key]])) {
+                                                hasPointSpecificOptions = true;
+                                        }
+                                }
+                        }
+
+                        // a specific marker config object is defined for the individual point:
+                        // create it's own attribute collection
+                        if (hasPointSpecificOptions) {
+                                normalOptions = normalOptions || {};
+                                pointAttr = [];
+                                stateOptions = normalOptions.states || {}; // reassign for individual point
+                                pointStateOptionsHover = stateOptions[HOVER_STATE] = stateOptions[HOVER_STATE] || {};
+
+                                // Handle colors for column and pies
+                                if (!seriesOptions.marker) { // column, bar, point
+                                        // If no hover color is given, brighten the normal color. #1619, #2579
+                                        pointStateOptionsHover.color = pointStateOptionsHover.color || (!point.options.color && stateOptionsHover.color) ||
+                                                Color(point.color)
+                                                        .brighten(pointStateOptionsHover.brightness || stateOptionsHover.brightness)
+                                                        .get();
+                                }
+
+                                // normal point state inherits series wide normal state
+                                attr = { color: point.color }; // #868
+                                if (!defaultFillColor) { // Individual point color or negative color markers (#2219)
+                                        attr.fillColor = point.color;
+                                }
+                                if (!defaultLineColor) {
+                                        attr.lineColor = point.color; // Bubbles take point color, line markers use white
+                                }
+                                pointAttr[NORMAL_STATE] = series.convertAttribs(extend(attr, normalOptions), seriesPointAttr[NORMAL_STATE]);
+
+                                // inherit from point normal and series hover
+                                pointAttr[HOVER_STATE] = series.convertAttribs(
+                                        stateOptions[HOVER_STATE],
+                                        seriesPointAttr[HOVER_STATE],
+                                        pointAttr[NORMAL_STATE]
+                                );
+
+                                // inherit from point normal and series hover
+                                pointAttr[SELECT_STATE] = series.convertAttribs(
+                                        stateOptions[SELECT_STATE],
+                                        seriesPointAttr[SELECT_STATE],
+                                        pointAttr[NORMAL_STATE]
+                                );
+
+                        // no marker config object is created: copy a reference to the series-wide
+                        // attribute collection
+                        } else {
+                                pointAttr = seriesPointAttr;
+                        }
+
+                        point.pointAttr = pointAttr;
+                }
+        }
+},
+
+/**
+ * Clear DOM objects and free up memory
+ */
+destroy: function () {
+        var series = this,
+                chart = series.chart,
+                issue134 = /AppleWebKit\/533/.test(userAgent),
+                destroy,
+                i,
+                data = series.data || [],
+                point,
+                prop,
+                axis;
+
+        // add event hook
+        fireEvent(series, 'destroy');
+
+        // remove all events
+        removeEvent(series);
+
+        // erase from axes
+        each(series.axisTypes || [], function (AXIS) {
+                axis = series[AXIS];
+                if (axis) {
+                        erase(axis.series, series);
+                        axis.isDirty = axis.forceRedraw = true;
+                }
+        });
+
+        // remove legend items
+        if (series.legendItem) {
+                series.chart.legend.destroyItem(series);
+        }
+
+        // destroy all points with their elements
+        i = data.length;
+        while (i--) {
+                point = data[i];
+                if (point && point.destroy) {
+                        point.destroy();
+                }
+        }
+        series.points = null;
+
+        // Clear the animation timeout if we are destroying the series during initial animation
+        clearTimeout(series.animationTimeout);
+
+        // destroy all SVGElements associated to the series
+        each(['area', 'graph', 'dataLabelsGroup', 'group', 'markerGroup', 'tracker',
+                        'graphNeg', 'areaNeg', 'posClip', 'negClip'], function (prop) {
+                if (series[prop]) {
+
+                        // issue 134 workaround
+                        destroy = issue134 && prop === 'group' ?
+                                'hide' :
+                                'destroy';
+
+                        series[prop][destroy]();
+                }
+        });
+
+        // remove from hoverSeries
+        if (chart.hoverSeries === series) {
+                chart.hoverSeries = null;
+        }
+        erase(chart.series, series);
+
+        // clear all members
+        for (prop in series) {
+                delete series[prop];
+        }
+},
+
+/**
+ * Return the graph path of a segment
+ */
+getSegmentPath: function (segment) {
+        var series = this,
+                segmentPath = [],
+                step = series.options.step;
+
+        // build the segment line
+        each(segment, function (point, i) {
+
+                var plotX = point.plotX,
+                        plotY = point.plotY,
+                        lastPoint;
+
+                if (series.getPointSpline) { // generate the spline as defined in the SplineSeries object
+                        segmentPath.push.apply(segmentPath, series.getPointSpline(segment, point, i));
+
+                } else {
+
+                        // moveTo or lineTo
+                        segmentPath.push(i ? L : M);
+
+                        // step line?
+                        if (step && i) {
+                                lastPoint = segment[i - 1];
+                                if (step === 'right') {
+                                        segmentPath.push(
+                                                lastPoint.plotX,
+                                                plotY
+                                        );
+
+                                } else if (step === 'center') {
+                                        segmentPath.push(
+                                                (lastPoint.plotX + plotX) / 2,
+                                                lastPoint.plotY,
+                                                (lastPoint.plotX + plotX) / 2,
+                                                plotY
+                                        );
+
+                                } else {
+                                        segmentPath.push(
+                                                plotX,
+                                                lastPoint.plotY
+                                        );
+                                }
+                        }
+
+                        // normal line to next point
+                        segmentPath.push(
+                                point.plotX,
+                                point.plotY
+                        );
+                }
+        });
+
+        return segmentPath;
+},
+
+/**
+ * Get the graph path
+ */
+getGraphPath: function () {
+        var series = this,
+                graphPath = [],
+                segmentPath,
+                singlePoints = []; // used in drawTracker
+
+        // Divide into segments and build graph and area paths
+        each(series.segments, function (segment) {
+
+                segmentPath = series.getSegmentPath(segment);
+
+                // add the segment to the graph, or a single point for tracking
+                if (segment.length > 1) {
+                        graphPath = graphPath.concat(segmentPath);
+                } else {
+                        singlePoints.push(segment[0]);
+                }
+        });
+
+        // Record it for use in drawGraph and drawTracker, and return graphPath
+        series.singlePoints = singlePoints;
+        series.graphPath = graphPath;
+
+        return graphPath;
+
+},
+
+/**
+ * Draw the actual graph
+ */
+drawGraph: function () {
+        var series = this,
+                options = this.options,
+                props = [['graph', options.lineColor || this.color]],
+                lineWidth = options.lineWidth,
+                dashStyle =  options.dashStyle,
+                roundCap = options.linecap !== 'square',
+                graphPath = this.getGraphPath(),
+                negativeColor = options.negativeColor;
+
+        if (negativeColor) {
+                props.push(['graphNeg', negativeColor]);
+        }
+
+        // draw the graph
+        each(props, function (prop, i) {
+                var graphKey = prop[0],
+                        graph = series[graphKey],
+                        attribs;
+
+                if (graph) {
+                        stop(graph); // cancel running animations, #459
+                        graph.animate({ d: graphPath });
+
+                } else if (lineWidth && graphPath.length) { // #1487
+                        attribs = {
+                                stroke: prop[1],
+                                'stroke-width': lineWidth,
+                                fill: NONE,
+                                zIndex: 1 // #1069
+                        };
+                        if (dashStyle) {
+                                attribs.dashstyle = dashStyle;
+                        } else if (roundCap) {
+                                attribs['stroke-linecap'] = attribs['stroke-linejoin'] = 'round';
+                        }
+
+                        series[graphKey] = series.chart.renderer.path(graphPath)
+                                .attr(attribs)
+                                .add(series.group)
+                                .shadow(!i && options.shadow);
+                }
+        });
+},
+
+/**
+ * Clip the graphs into the positive and negative coloured graphs
+ */
+clipNeg: function () {
+        var options = this.options,
+                chart = this.chart,
+                renderer = chart.renderer,
+                negativeColor = options.negativeColor || options.negativeFillColor,
+                translatedThreshold,
+                posAttr,
+                negAttr,
+                graph = this.graph,
+                area = this.area,
+                posClip = this.posClip,
+                negClip = this.negClip,
+                chartWidth = chart.chartWidth,
+                chartHeight = chart.chartHeight,
+                chartSizeMax = mathMax(chartWidth, chartHeight),
+                yAxis = this.yAxis,
+                above,
+                below;
+
+        if (negativeColor && (graph || area)) {
+                translatedThreshold = mathRound(yAxis.toPixels(options.threshold || 0, true));
+                if (translatedThreshold < 0) {
+                        chartSizeMax -= translatedThreshold; // #2534
+                }
+                above = {
+                        x: 0,
+                        y: 0,
+                        width: chartSizeMax,
+                        height: translatedThreshold
+                };
+                below = {
+                        x: 0,
+                        y: translatedThreshold,
+                        width: chartSizeMax,
+                        height: chartSizeMax
+                };
+
+                if (chart.inverted) {
+
+                        above.height = below.y = chart.plotWidth - translatedThreshold;
+                        if (renderer.isVML) {
+                                above = {
+                                        x: chart.plotWidth - translatedThreshold - chart.plotLeft,
+                                        y: 0,
+                                        width: chartWidth,
+                                        height: chartHeight
+                                };
+                                below = {
+                                        x: translatedThreshold + chart.plotLeft - chartWidth,
+                                        y: 0,
+                                        width: chart.plotLeft + translatedThreshold,
+                                        height: chartWidth
+                                };
+                        }
+                }
+
+                if (yAxis.reversed) {
+                        posAttr = below;
+                        negAttr = above;
+                } else {
+                        posAttr = above;
+                        negAttr = below;
+                }
+
+                if (posClip) { // update
+                        posClip.animate(posAttr);
+                        negClip.animate(negAttr);
+                } else {
+
+                        this.posClip = posClip = renderer.clipRect(posAttr);
+                        this.negClip = negClip = renderer.clipRect(negAttr);
+
+                        if (graph && this.graphNeg) {
+                                graph.clip(posClip);
+                                this.graphNeg.clip(negClip);
+                        }
+
+                        if (area) {
+                                area.clip(posClip);
+                                this.areaNeg.clip(negClip);
+                        }
+                }
+        }
+},
+
+/**
+ * Initialize and perform group inversion on series.group and series.markerGroup
+ */
+invertGroups: function () {
+        var series = this,
+                chart = series.chart;
+
+        // Pie, go away (#1736)
+        if (!series.xAxis) {
+                return;
+        }
+
+        // A fixed size is needed for inversion to work
+        function setInvert() {
+                var size = {
+                        width: series.yAxis.len,
+                        height: series.xAxis.len
+                };
+
+                each(['group', 'markerGroup'], function (groupName) {
+                        if (series[groupName]) {
+                                series[groupName].attr(size).invert();
+                        }
+                });
+        }
+
+        addEvent(chart, 'resize', setInvert); // do it on resize
+        addEvent(series, 'destroy', function () {
+                removeEvent(chart, 'resize', setInvert);
+        });
+
+        // Do it now
+        setInvert(); // do it now
+
+        // On subsequent render and redraw, just do setInvert without setting up events again
+        series.invertGroups = setInvert;
+},
+
+/**
+ * General abstraction for creating plot groups like series.group, series.dataLabelsGroup and
+ * series.markerGroup. On subsequent calls, the group will only be adjusted to the updated plot size.
+ */
+plotGroup: function (prop, name, visibility, zIndex, parent) {
+        var group = this[prop],
+                isNew = !group;
+
+        // Generate it on first call
+        if (isNew) {
+                this[prop] = group = this.chart.renderer.g(name)
+                        .attr({
+                                visibility: visibility,
+                                zIndex: zIndex || 0.1 // IE8 needs this
+                        })
+                        .add(parent);
+        }
+        // Place it on first and subsequent (redraw) calls
+        group[isNew ? 'attr' : 'animate'](this.getPlotBox());
+        return group;
+},
+
+/**
+ * Get the translation and scale for the plot area of this series
+ */
+getPlotBox: function () {
+        var chart = this.chart,
+                xAxis = this.xAxis,
+                yAxis = this.yAxis;
+
+        // Swap axes for inverted (#2339)
+        if (chart.inverted) {
+                xAxis = yAxis;
+                yAxis = this.xAxis;
+        }
+        return {
+                translateX: xAxis ? xAxis.left : chart.plotLeft,
+                translateY: yAxis ? yAxis.top : chart.plotTop,
+                scaleX: 1, // #1623
+                scaleY: 1
+        };
+},
+
+/**
+ * Render the graph and markers
+ */
+render: function () {
+        var series = this,
+                chart = series.chart,
+                group,
+                options = series.options,
+                animation = options.animation,
+                // Animation doesn't work in IE8 quirks when the group div is hidden,
+                // and looks bad in other oldIE
+                animDuration = (animation && !!series.animate && chart.renderer.isSVG && pick(animation.duration, 500)) || 0,
+                visibility = series.visible ? VISIBLE : HIDDEN,
+                zIndex = options.zIndex,
+                hasRendered = series.hasRendered,
+                chartSeriesGroup = chart.seriesGroup;
+
+        // the group
+        group = series.plotGroup(
+                'group',
+                'series',
+                visibility,
+                zIndex,
+                chartSeriesGroup
+        );
+
+        series.markerGroup = series.plotGroup(
+                'markerGroup',
+                'markers',
+                visibility,
+                zIndex,
+                chartSeriesGroup
+        );
+
+        // initiate the animation
+        if (animDuration) {
+                series.animate(true);
+        }
+
+        // cache attributes for shapes
+        series.getAttribs();
+
+        // SVGRenderer needs to know this before drawing elements (#1089, #1795)
+        group.inverted = series.isCartesian ? chart.inverted : false;
+
+        // draw the graph if any
+        if (series.drawGraph) {
+                series.drawGraph();
+                series.clipNeg();
+        }
+
+        // draw the data labels (inn pies they go before the points)
+        if (series.drawDataLabels) {
+                series.drawDataLabels();
+        }
+
+        // draw the points
+        if (series.visible) {
+                series.drawPoints();
+        }
+
+        // draw the mouse tracking area
+        if (series.drawTracker && series.options.enableMouseTracking !== false) {
+                series.drawTracker();
+        }
+
+        // Handle inverted series and tracker groups
+        if (chart.inverted) {
+                series.invertGroups();
+        }
+
+        // Initial clipping, must be defined after inverting groups for VML
+        if (options.clip !== false && !series.sharedClipKey && !hasRendered) {
+                group.clip(chart.clipRect);
+        }
+
+        // Run the animation
+        if (animDuration) {
+                series.animate();
+        } 
+
+        // Call the afterAnimate function on animation complete (but don't overwrite the animation.complete option
+        // which should be available to the user).
+        if (!hasRendered) {
+                if (animDuration) {
+                        series.animationTimeout = setTimeout(function () {
+                                series.afterAnimate();
+                        }, animDuration);
+                } else {
+                        series.afterAnimate();
+                }
+        }
+
+        series.isDirty = series.isDirtyData = false; // means data is in accordance with what you see
+        // (See #322) series.isDirty = series.isDirtyData = false; // means data is in accordance with what you see
+        series.hasRendered = true;
+},
+
+/**
+ * Redraw the series after an update in the axes.
+ */
+redraw: function () {
+        var series = this,
+                chart = series.chart,
+                wasDirtyData = series.isDirtyData, // cache it here as it is set to false in render, but used after
+                group = series.group,
+                xAxis = series.xAxis,
+                yAxis = series.yAxis;
+
+        // reposition on resize
+        if (group) {
+                if (chart.inverted) {
+                        group.attr({
+                                width: chart.plotWidth,
+                                height: chart.plotHeight
+                        });
+                }
+
+                group.animate({
+                        translateX: pick(xAxis && xAxis.left, chart.plotLeft),
+                        translateY: pick(yAxis && yAxis.top, chart.plotTop)
+                });
+        }
+
+        series.translate();
+        if (series.setTooltipPoints) {
+                series.setTooltipPoints(true);
+        }
+        series.render();
+
+        if (wasDirtyData) {
+                fireEvent(series, 'updatedData');
+        }
+}
+ +

}; // end Series prototype

+ +

/**

+ +
* The class for stack items
+*/
+ +

function StackItem(axis, options, isNegative, x, stackOption) {

+ +
var inverted = axis.chart.inverted;
+
+this.axis = axis;
+
+// Tells if the stack is negative
+this.isNegative = isNegative;
+
+// Save the options to be able to style the label
+this.options = options;
+
+// Save the x value to be able to position the label later
+this.x = x;
+
+// Initialize total value
+this.total = null;
+
+// This will keep each points' extremes stored by series.index and point index
+this.points = {};
+
+// Save the stack option on the series configuration object, and whether to treat it as percent
+this.stack = stackOption;
+
+// The align options and text align varies on whether the stack is negative and
+// if the chart is inverted or not.
+// First test the user supplied value, then use the dynamic.
+this.alignOptions = {
+        align: options.align || (inverted ? (isNegative ? 'left' : 'right') : 'center'),
+        verticalAlign: options.verticalAlign || (inverted ? 'middle' : (isNegative ? 'bottom' : 'top')),
+        y: pick(options.y, inverted ? 4 : (isNegative ? 14 : -6)),
+        x: pick(options.x, inverted ? (isNegative ? -6 : 6) : 0)
+};
+
+this.textAlign = options.textAlign || (inverted ? (isNegative ? 'right' : 'left') : 'center');
+ +

}

+ +

StackItem.prototype = {

+ +
destroy: function () {
+        destroyObjectProperties(this, this.axis);
+},
+
+/**
+ * Renders the stack total label and adds it to the stack label group.
+ */
+render: function (group) {
+        var options = this.options,
+                formatOption = options.format,
+                str = formatOption ?
+                        format(formatOption, this) : 
+                        options.formatter.call(this);  // format the text in the label
+
+        // Change the text to reflect the new total and set visibility to hidden in case the serie is hidden
+        if (this.label) {
+                this.label.attr({text: str, visibility: HIDDEN});
+        // Create new label
+        } else {
+                this.label =
+                        this.axis.chart.renderer.text(str, null, null, options.useHTML)         // dummy positions, actual position updated with setOffset method in columnseries
+                                .css(options.style)                             // apply style
+                                .attr({
+                                        align: this.textAlign,                          // fix the text-anchor
+                                        rotation: options.rotation,     // rotation
+                                        visibility: HIDDEN                                      // hidden until setOffset is called
+                                })                              
+                                .add(group);                                                    // add to the labels-group
+        }
+},
+
+/**
+ * Sets the offset that the stack has from the x value and repositions the label.
+ */
+setOffset: function (xOffset, xWidth) {
+        var stackItem = this,
+                axis = stackItem.axis,
+                chart = axis.chart,
+                inverted = chart.inverted,
+                neg = this.isNegative,                                                  // special treatment is needed for negative stacks
+                y = axis.translate(axis.usePercentage ? 100 : this.total, 0, 0, 0, 1), // stack value translated mapped to chart coordinates
+                yZero = axis.translate(0),                                              // stack origin
+                h = mathAbs(y - yZero),                                                 // stack height
+                x = chart.xAxis[0].translate(this.x) + xOffset, // stack x position
+                plotHeight = chart.plotHeight,
+                stackBox = {    // this is the box for the complete stack
+                        x: inverted ? (neg ? y : y - h) : x,
+                        y: inverted ? plotHeight - x - xWidth : (neg ? (plotHeight - y - h) : plotHeight - y),
+                        width: inverted ? h : xWidth,
+                        height: inverted ? xWidth : h
+                },
+                label = this.label,
+                alignAttr;
+
+        if (label) {
+                label.align(this.alignOptions, null, stackBox); // align the label to the box
+
+                // Set visibility (#678)
+                alignAttr = label.alignAttr;
+                label[this.options.crop === false || chart.isInsidePlot(alignAttr.x, alignAttr.y) ? 'show' : 'hide'](true);
+        }
+}
+ +

};

+ +

// Stacking methods defined on the Axis prototype

+ +

/**

+ +
* Build the stacks from top down
+*/
+ +

Axis.prototype.buildStacks = function () {

+ +
var series = this.series,
+        reversedStacks = pick(this.options.reversedStacks, true),
+        i = series.length;
+if (!this.isXAxis) {
+        this.usePercentage = false;
+        while (i--) {
+                series[reversedStacks ? i : series.length - i - 1].setStackedPoints();
+        }
+        // Loop up again to compute percent stack
+        if (this.usePercentage) {
+                for (i = 0; i < series.length; i++) {
+                        series[i].setPercentStacks();
+                }
+        }
+}
+ +

};

+ +

Axis.prototype.renderStackTotals = function () {

+ +
var axis = this,
+        chart = axis.chart,
+        renderer = chart.renderer,
+        stacks = axis.stacks,
+        stackKey, 
+        oneStack, 
+        stackCategory,
+        stackTotalGroup = axis.stackTotalGroup;
+
+// Create a separate group for the stack total labels
+if (!stackTotalGroup) {
+        axis.stackTotalGroup = stackTotalGroup =
+                renderer.g('stack-labels')
+                        .attr({
+                                visibility: VISIBLE,
+                                zIndex: 6
+                        })
+                        .add();
+}
+
+// plotLeft/Top will change when y axis gets wider so we need to translate the
+// stackTotalGroup at every render call. See bug #506 and #516
+stackTotalGroup.translate(chart.plotLeft, chart.plotTop);
+
+// Render each stack total
+for (stackKey in stacks) {
+        oneStack = stacks[stackKey];
+        for (stackCategory in oneStack) {
+                oneStack[stackCategory].render(stackTotalGroup);
+        }
+}
+ +

};

+ +

// Stacking methods defnied for Series prototype

+ +

/**

+ +
* Adds series' points value to corresponding stack
+*/
+ +

Series.prototype.setStackedPoints = function () {

+ +
if (!this.options.stacking || (this.visible !== true && this.chart.options.chart.ignoreHiddenSeries !== false)) {
+        return;
+}
+
+var series = this,
+        xData = series.processedXData,
+        yData = series.processedYData,
+        stackedYData = [],
+        yDataLength = yData.length,
+        seriesOptions = series.options,
+        threshold = seriesOptions.threshold,
+        stackOption = seriesOptions.stack,
+        stacking = seriesOptions.stacking,
+        stackKey = series.stackKey,
+        negKey = '-' + stackKey,
+        negStacks = series.negStacks,
+        yAxis = series.yAxis,
+        stacks = yAxis.stacks,
+        oldStacks = yAxis.oldStacks,
+        isNegative,
+        stack,
+        other,
+        key,
+        pointKey,
+        i,
+        x,
+        y;
+
+// loop over the non-null y values and read them into a local array
+for (i = 0; i < yDataLength; i++) {
+        x = xData[i];
+        y = yData[i];
+        pointKey = series.index + ',' + i;
+
+        // Read stacked values into a stack based on the x value,
+        // the sign of y and the stack key. Stacking is also handled for null values (#739)
+        isNegative = negStacks && y < threshold;
+        key = isNegative ? negKey : stackKey;
+
+        // Create empty object for this stack if it doesn't exist yet
+        if (!stacks[key]) {
+                stacks[key] = {};
+        }
+
+        // Initialize StackItem for this x
+        if (!stacks[key][x]) {
+                if (oldStacks[key] && oldStacks[key][x]) {
+                        stacks[key][x] = oldStacks[key][x];
+                        stacks[key][x].total = null;
+                } else {
+                        stacks[key][x] = new StackItem(yAxis, yAxis.options.stackLabels, isNegative, x, stackOption);
+                }
+        }
+
+        // If the StackItem doesn't exist, create it first
+        stack = stacks[key][x];
+        stack.points[pointKey] = [stack.cum || 0];
+
+        // Add value to the stack total
+        if (stacking === 'percent') {
+
+                // Percent stacked column, totals are the same for the positive and negative stacks
+                other = isNegative ? stackKey : negKey;
+                if (negStacks && stacks[other] && stacks[other][x]) {
+                        other = stacks[other][x];
+                        stack.total = other.total = mathMax(other.total, stack.total) + mathAbs(y) || 0;
+
+                // Percent stacked areas
+                } else {
+                        stack.total = correctFloat(stack.total + (mathAbs(y) || 0));
+                }
+        } else {
+                stack.total = correctFloat(stack.total + (y || 0));
+        }
+
+        stack.cum = (stack.cum || 0) + (y || 0);
+
+        stack.points[pointKey].push(stack.cum);
+        stackedYData[i] = stack.cum;
+
+}
+
+if (stacking === 'percent') {
+        yAxis.usePercentage = true;
+}
+
+this.stackedYData = stackedYData; // To be used in getExtremes
+
+// Reset old stacks
+yAxis.oldStacks = {};
+ +

};

+ +

/**

+ +
* Iterate over all stacks and compute the absolute values to percent
+*/
+ +

Series.prototype.setPercentStacks = function () {

+ +
var series = this,
+        stackKey = series.stackKey,
+        stacks = series.yAxis.stacks,
+        processedXData = series.processedXData;
+
+each([stackKey, '-' + stackKey], function (key) {
+        var i = processedXData.length,
+                x,
+                stack,
+                pointExtremes,
+                totalFactor;
+
+        while (i--) {
+                x = processedXData[i];
+                stack = stacks[key] && stacks[key][x];
+                pointExtremes = stack && stack.points[series.index + ',' + i];
+                if (pointExtremes) {
+                        totalFactor = stack.total ? 100 / stack.total : 0;
+                        pointExtremes[0] = correctFloat(pointExtremes[0] * totalFactor); // Y bottom value
+                        pointExtremes[1] = correctFloat(pointExtremes[1] * totalFactor); // Y value
+                        series.stackedYData[i] = pointExtremes[1];
+                }
+        }
+});
+ +

};

+ +

// Extend the Chart prototype for dynamic methods extend(Chart.prototype, {

+ +
   /**
+    * Add a series dynamically after  time
+    *
+    * @param {Object} options The config options
+    * @param {Boolean} redraw Whether to redraw the chart after adding. Defaults to true.
+    * @param {Boolean|Object} animation Whether to apply animation, and optionally animation
+    *    configuration
+    *
+    * @return {Object} series The newly created series object
+    */
+   addSeries: function (options, redraw, animation) {
+           var series,
+                   chart = this;
+
+           if (options) {
+                   redraw = pick(redraw, true); // defaults to true
+
+                   fireEvent(chart, 'addSeries', { options: options }, function () {
+                           series = chart.initSeries(options);
+
+                           chart.isDirtyLegend = true; // the series array is out of sync with the display
+                           chart.linkSeries();
+                           if (redraw) {
+                                   chart.redraw(animation);
+                           }
+                   });
+           }
+
+           return series;
+   },
+
+   /**
+* Add an axis to the chart
+* @param {Object} options The axis option
+* @param {Boolean} isX Whether it is an X axis or a value axis
+*/
+   addAxis: function (options, isX, redraw, animation) {
+           var key = isX ? 'xAxis' : 'yAxis',
+                   chartOptions = this.options,
+                   axis;
+
+           /*jslint unused: false*/
+           axis = new Axis(this, merge(options, {
+                   index: this[key].length,
+                   isX: isX
+           }));
+           /*jslint unused: true*/
+
+           // Push the new axis options to the chart options
+           chartOptions[key] = splat(chartOptions[key] || {});
+           chartOptions[key].push(options);
+
+           if (pick(redraw, true)) {
+                   this.redraw(animation);
+           }
+   },
+
+   /**
+    * Dim the chart and show a loading text or symbol
+    * @param {String} str An optional text to show in the loading label instead of the default one
+    */
+   showLoading: function (str) {
+           var chart = this,
+                   options = chart.options,
+                   loadingDiv = chart.loadingDiv;
+
+           var loadingOptions = options.loading;
+
+           // create the layer at the first call
+           if (!loadingDiv) {
+                   chart.loadingDiv = loadingDiv = createElement(DIV, {
+                           className: PREFIX + 'loading'
+                   }, extend(loadingOptions.style, {
+                           zIndex: 10,
+                           display: NONE
+                   }), chart.container);
+
+                   chart.loadingSpan = createElement(
+                           'span',
+                           null,
+                           loadingOptions.labelStyle,
+                           loadingDiv
+                   );
+
+           }
+
+           // update text
+           chart.loadingSpan.innerHTML = str || options.lang.loading;
+
+           // show it
+           if (!chart.loadingShown) {
+                   css(loadingDiv, {
+                           opacity: 0,
+                           display: '',
+                           left: chart.plotLeft + PX,
+                           top: chart.plotTop + PX,
+                           width: chart.plotWidth + PX,
+                           height: chart.plotHeight + PX
+                   });
+                   animate(loadingDiv, {
+                           opacity: loadingOptions.style.opacity
+                   }, {
+                           duration: loadingOptions.showDuration || 0
+                   });
+                   chart.loadingShown = true;
+           }
+   },
+
+   /**
+    * Hide the loading layer
+    */
+   hideLoading: function () {
+           var options = this.options,
+                   loadingDiv = this.loadingDiv;
+
+           if (loadingDiv) {
+                   animate(loadingDiv, {
+                           opacity: 0
+                   }, {
+                           duration: options.loading.hideDuration || 100,
+                           complete: function () {
+                                   css(loadingDiv, { display: NONE });
+                           }
+                   });
+           }
+           this.loadingShown = false;
+   }
+ +

});

+ +

// extend the Point prototype for dynamic methods extend(Point.prototype, {

+ +
/**
+ * Update the point with new options (typically x/y data) and optionally redraw the series.
+ *
+ * @param {Object} options Point options as defined in the series.data array
+ * @param {Boolean} redraw Whether to redraw the chart or wait for an explicit call
+ * @param {Boolean|Object} animation Whether to apply animation, and optionally animation
+ *    configuration
+ *
+ */
+update: function (options, redraw, animation) {
+        var point = this,
+                series = point.series,
+                graphic = point.graphic,
+                i,
+                data = series.data,
+                chart = series.chart,
+                seriesOptions = series.options;
+
+        redraw = pick(redraw, true);
+
+        // fire the event with a default handler of doing the update
+        point.firePointEvent('update', { options: options }, function () {
+
+                point.applyOptions(options);
+
+                // update visuals
+                if (isObject(options)) {
+                        series.getAttribs();
+                        if (graphic) {
+                                if (options && options.marker && options.marker.symbol) {
+                                        point.graphic = graphic.destroy();
+                                } else {
+                                        graphic.attr(point.pointAttr[point.state || '']);
+                                }
+                        }
+                        if (options && options.dataLabels && point.dataLabel) { // #2468
+                                point.dataLabel = point.dataLabel.destroy();
+                        }
+                }
+
+                // record changes in the parallel arrays
+                i = inArray(point, data);
+                series.updateParallelArrays(point, i);
+
+                seriesOptions.data[i] = point.options;
+
+                // redraw
+                series.isDirty = series.isDirtyData = true;
+                if (!series.fixedBox && series.hasCartesianSeries) { // #1906, #2320
+                        chart.isDirtyBox = true;
+                }
+
+                if (seriesOptions.legendType === 'point') { // #1831, #1885
+                        chart.legend.destroyItem(point);
+                }
+                if (redraw) {
+                        chart.redraw(animation);
+                }
+        });
+},
+
+/**
+ * Remove a point and optionally redraw the series and if necessary the axes
+ * @param {Boolean} redraw Whether to redraw the chart or wait for an explicit call
+ * @param {Boolean|Object} animation Whether to apply animation, and optionally animation
+ *    configuration
+ */
+remove: function (redraw, animation) {
+        var point = this,
+                series = point.series,
+                points = series.points,
+                chart = series.chart,
+                i,
+                data = series.data;
+
+        setAnimation(animation, chart);
+        redraw = pick(redraw, true);
+
+        // fire the event with a default handler of removing the point
+        point.firePointEvent('remove', null, function () {
+
+                // splice all the parallel arrays
+                i = inArray(point, data);
+                if (data.length === points.length) {
+                        points.splice(i, 1);
+                }
+                data.splice(i, 1);
+                series.options.data.splice(i, 1);
+                series.updateParallelArrays(point, 'splice', i, 1);
+
+                point.destroy();
+
+                // redraw
+                series.isDirty = true;
+                series.isDirtyData = true;
+                if (redraw) {
+                        chart.redraw();
+                }
+        });
+}
+ +

});

+ +

// Extend the series prototype for dynamic methods extend(Series.prototype, {

+ +
/**
+ * Add a point dynamically after chart load time
+ * @param {Object} options Point options as given in series.data
+ * @param {Boolean} redraw Whether to redraw the chart or wait for an explicit call
+ * @param {Boolean} shift If shift is true, a point is shifted off the start
+ *    of the series as one is appended to the end.
+ * @param {Boolean|Object} animation Whether to apply animation, and optionally animation
+ *    configuration
+ */
+addPoint: function (options, redraw, shift, animation) {
+        var series = this,
+                seriesOptions = series.options,
+                data = series.data,
+                graph = series.graph,
+                area = series.area,
+                chart = series.chart,
+                names = series.xAxis && series.xAxis.names,
+                currentShift = (graph && graph.shift) || 0,
+                dataOptions = seriesOptions.data,
+                point,
+                isInTheMiddle,
+                xData = series.xData,
+                x,
+                i;
+
+        setAnimation(animation, chart);
+
+        // Make graph animate sideways
+        if (shift) {
+                each([graph, area, series.graphNeg, series.areaNeg], function (shape) {
+                        if (shape) {
+                                shape.shift = currentShift + 1;
+                        }
+                });
+        }
+        if (area) {
+                area.isArea = true; // needed in animation, both with and without shift
+        }
+
+        // Optional redraw, defaults to true
+        redraw = pick(redraw, true);
+
+        // Get options and push the point to xData, yData and series.options. In series.generatePoints
+        // the Point instance will be created on demand and pushed to the series.data array.
+        point = { series: series };
+        series.pointClass.prototype.applyOptions.apply(point, [options]);
+        x = point.x;
+
+        // Get the insertion point
+        i = xData.length;
+        if (series.requireSorting && x < xData[i - 1]) {
+                isInTheMiddle = true;
+                while (i && xData[i - 1] > x) {
+                        i--;
+                }
+        }
+
+        series.updateParallelArrays(point, 'splice', i, 0, 0); // insert undefined item
+        series.updateParallelArrays(point, i); // update it
+
+        if (names) {
+                names[x] = point.name;
+        }
+        dataOptions.splice(i, 0, options);
+
+        if (isInTheMiddle) {
+                series.data.splice(i, 0, null);
+                series.processData();
+        }
+
+        // Generate points to be added to the legend (#1329)
+        if (seriesOptions.legendType === 'point') {
+                series.generatePoints();
+        }
+
+        // Shift the first point off the parallel arrays
+        // todo: consider series.removePoint(i) method
+        if (shift) {
+                if (data[0] && data[0].remove) {
+                        data[0].remove(false);
+                } else {
+                        data.shift();
+                        series.updateParallelArrays(point, 'shift');
+
+                        dataOptions.shift();
+                }
+        }
+
+        // redraw
+        series.isDirty = true;
+        series.isDirtyData = true;
+        if (redraw) {
+                series.getAttribs(); // #1937
+                chart.redraw();
+        }
+},
+
+/**
+ * Remove a series and optionally redraw the chart
+ *
+ * @param {Boolean} redraw Whether to redraw the chart or wait for an explicit call
+ * @param {Boolean|Object} animation Whether to apply animation, and optionally animation
+ *    configuration
+ */
+
+remove: function (redraw, animation) {
+        var series = this,
+                chart = series.chart;
+        redraw = pick(redraw, true);
+
+        if (!series.isRemoving) {  /* prevent triggering native event in jQuery
+                        (calling the remove function from the remove event) */
+                series.isRemoving = true;
+
+                // fire the event with a default handler of removing the point
+                fireEvent(series, 'remove', null, function () {
+
+                        // destroy elements
+                        series.destroy();
+
+                        // redraw
+                        chart.isDirtyLegend = chart.isDirtyBox = true;
+                        chart.linkSeries();
+
+                        if (redraw) {
+                                chart.redraw(animation);
+                        }
+                });
+
+        }
+        series.isRemoving = false;
+},
+
+/**
+ * Update the series with a new set of options
+ */
+update: function (newOptions, redraw) {
+        var chart = this.chart,
+                // must use user options when changing type because this.options is merged
+                // in with type specific plotOptions
+                oldOptions = this.userOptions,
+                oldType = this.type,
+                proto = seriesTypes[oldType].prototype,
+                n;
+
+        // Do the merge, with some forced options
+        newOptions = merge(oldOptions, {
+                animation: false,
+                index: this.index,
+                pointStart: this.xData[0] // when updating after addPoint
+        }, { data: this.options.data }, newOptions);
+
+        // Destroy the series and reinsert methods from the type prototype
+        this.remove(false);
+        for (n in proto) { // Overwrite series-type specific methods (#2270)
+                if (proto.hasOwnProperty(n)) {
+                        this[n] = UNDEFINED;
+                }
+        }
+        extend(this, seriesTypes[newOptions.type || oldType].prototype);
+
+        this.init(chart, newOptions);
+        if (pick(redraw, true)) {
+                chart.redraw(false);
+        }
+}
+ +

});

+ +

// Extend the Axis.prototype for dynamic methods extend(Axis.prototype, {

+ +
   /**
+    * Update the axis with a new options structure
+    */
+   update: function (newOptions, redraw) {
+           var chart = this.chart;
+
+           newOptions = chart.options[this.coll][this.options.index] = merge(this.userOptions, newOptions);
+
+           this.destroy(true);
+           this._addedPlotLB = UNDEFINED; // #1611, #2887
+
+           this.init(chart, extend(newOptions, { events: UNDEFINED }));
+
+           chart.isDirtyBox = true;
+           if (pick(redraw, true)) {
+                   chart.redraw();
+           }
+   },
+
+   /**
+* Remove the axis from the chart
+*/
+   remove: function (redraw) {
+           var chart = this.chart,
+                   key = this.coll, // xAxis or yAxis
+                   axisSeries = this.series,
+                   i = axisSeries.length;
+
+           // Remove associated series (#2687)
+           while (i--) {
+                   if (axisSeries[i]) {
+                           axisSeries[i].remove(false);
+                   }
+           }
+
+           // Remove the axis
+           erase(chart.axes, this);
+           erase(chart[key], this);
+           chart.options[key].splice(this.options.index, 1);
+           each(chart[key], function (axis, i) { // Re-index, #1706
+                   axis.options.index = i;
+           });
+           this.destroy();
+           chart.isDirtyBox = true;
+
+           if (pick(redraw, true)) {
+                   chart.redraw();
+           }
+   },
+
+   /**
+    * Update the axis title by options
+    */
+   setTitle: function (newTitleOptions, redraw) {
+           this.update({ title: newTitleOptions }, redraw);
+   },
+
+   /**
+    * Set new axis categories and optionally redraw
+    * @param {Array} categories
+    * @param {Boolean} redraw
+    */
+   setCategories: function (categories, redraw) {
+           this.update({ categories: categories }, redraw);
+   }
+ +

});

+ +

/**

+ +
* LineSeries object
+*/
+ +

var LineSeries = extendClass(Series); seriesTypes.line = LineSeries;

+ +

/**

+ +
* Set the default options for area
+*/
+ +

defaultPlotOptions.area = merge(defaultSeriesOptions, {

+ +
threshold: 0
+// trackByArea: false,
+// lineColor: null, // overrides color, but lets fillColor be unaltered
+// fillOpacity: 0.75,
+// fillColor: null
+ +

});

+ +

/**

+ +
* AreaSeries object
+*/
+ +

var AreaSeries = extendClass(Series, {

+ +
type: 'area',
+/**
+ * For stacks, don't split segments on null values. Instead, draw null values with 
+ * no marker. Also insert dummy points for any X position that exists in other series
+ * in the stack.
+ */ 
+getSegments: function () {
+        var segments = [],
+                segment = [],
+                keys = [],
+                xAxis = this.xAxis,
+                yAxis = this.yAxis,
+                stack = yAxis.stacks[this.stackKey],
+                pointMap = {},
+                plotX,
+                plotY,
+                points = this.points,
+                connectNulls = this.options.connectNulls,
+                val,
+                i,
+                x;
+
+        if (this.options.stacking && !this.cropped) { // cropped causes artefacts in Stock, and perf issue
+                // Create a map where we can quickly look up the points by their X value.
+                for (i = 0; i < points.length; i++) {
+                        pointMap[points[i].x] = points[i];
+                }
+
+                // Sort the keys (#1651)
+                for (x in stack) {
+                        if (stack[x].total !== null) { // nulled after switching between grouping and not (#1651, #2336)
+                                keys.push(+x);
+                        }
+                }
+                keys.sort(function (a, b) {
+                        return a - b;
+                });
+
+                each(keys, function (x) {
+                        if (connectNulls && (!pointMap[x] || pointMap[x].y === null)) { // #1836
+                                return;
+
+                        // The point exists, push it to the segment
+                        } else if (pointMap[x]) {
+                                segment.push(pointMap[x]);
+
+                        // There is no point for this X value in this series, so we 
+                        // insert a dummy point in order for the areas to be drawn
+                        // correctly.
+                        } else {
+                                plotX = xAxis.translate(x);
+                                val = stack[x].percent ? (stack[x].total ? stack[x].cum * 100 / stack[x].total : 0) : stack[x].cum; // #1991
+                                plotY = yAxis.toPixels(val, true);
+                                segment.push({ 
+                                        y: null, 
+                                        plotX: plotX,
+                                        clientX: plotX, 
+                                        plotY: plotY, 
+                                        yBottom: plotY,
+                                        onMouseOver: noop
+                                });
+                        }
+                });
+
+                if (segment.length) {
+                        segments.push(segment);
+                }
+
+        } else {
+                Series.prototype.getSegments.call(this);
+                segments = this.segments;
+        }
+
+        this.segments = segments;
+},
+
+/**
+ * Extend the base Series getSegmentPath method by adding the path for the area.
+ * This path is pushed to the series.areaPath property.
+ */
+getSegmentPath: function (segment) {
+
+        var segmentPath = Series.prototype.getSegmentPath.call(this, segment), // call base method
+                areaSegmentPath = [].concat(segmentPath), // work on a copy for the area path
+                i,
+                options = this.options,
+                segLength = segmentPath.length,
+                translatedThreshold = this.yAxis.getThreshold(options.threshold), // #2181
+                yBottom;
+
+        if (segLength === 3) { // for animation from 1 to two points
+                areaSegmentPath.push(L, segmentPath[1], segmentPath[2]);
+        }
+        if (options.stacking && !this.closedStacks) {
+
+                // Follow stack back. Todo: implement areaspline. A general solution could be to 
+                // reverse the entire graphPath of the previous series, though may be hard with
+                // splines and with series with different extremes
+                for (i = segment.length - 1; i >= 0; i--) {
+
+                        yBottom = pick(segment[i].yBottom, translatedThreshold);
+
+                        // step line?
+                        if (i < segment.length - 1 && options.step) {
+                                areaSegmentPath.push(segment[i + 1].plotX, yBottom);
+                        }
+
+                        areaSegmentPath.push(segment[i].plotX, yBottom);
+                }
+
+        } else { // follow zero line back
+                this.closeSegment(areaSegmentPath, segment, translatedThreshold);
+        }
+        this.areaPath = this.areaPath.concat(areaSegmentPath);
+        return segmentPath;
+},
+
+/**
+ * Extendable method to close the segment path of an area. This is overridden in polar 
+ * charts.
+ */
+closeSegment: function (path, segment, translatedThreshold) {
+        path.push(
+                L,
+                segment[segment.length - 1].plotX,
+                translatedThreshold,
+                L,
+                segment[0].plotX,
+                translatedThreshold
+        );
+},
+
+/**
+ * Draw the graph and the underlying area. This method calls the Series base
+ * function and adds the area. The areaPath is calculated in the getSegmentPath
+ * method called from Series.prototype.drawGraph.
+ */
+drawGraph: function () {
+
+        // Define or reset areaPath
+        this.areaPath = [];
+
+        // Call the base method
+        Series.prototype.drawGraph.apply(this);
+
+        // Define local variables
+        var series = this,
+                areaPath = this.areaPath,
+                options = this.options,
+                negativeColor = options.negativeColor,
+                negativeFillColor = options.negativeFillColor,
+                props = [['area', this.color, options.fillColor]]; // area name, main color, fill color
+
+        if (negativeColor || negativeFillColor) {
+                props.push(['areaNeg', negativeColor, negativeFillColor]);
+        }
+
+        each(props, function (prop) {
+                var areaKey = prop[0],
+                        area = series[areaKey];
+
+                // Create or update the area
+                if (area) { // update
+                        area.animate({ d: areaPath });
+
+                } else { // create
+                        series[areaKey] = series.chart.renderer.path(areaPath)
+                                .attr({
+                                        fill: pick(
+                                                prop[2],
+                                                Color(prop[1]).setOpacity(pick(options.fillOpacity, 0.75)).get()
+                                        ),
+                                        zIndex: 0 // #1069
+                                }).add(series.group);
+                }
+        });
+},
+
+drawLegendSymbol: LegendSymbolMixin.drawRectangle
+ +

});

+ +

seriesTypes.area = AreaSeries; /**

+ +
* Set the default options for spline
+*/
+ +

defaultPlotOptions.spline = merge(defaultSeriesOptions);

+ +

/**

+ +
* SplineSeries object
+*/
+ +

var SplineSeries = extendClass(Series, {

+ +
type: 'spline',
+
+/**
+ * Get the spline segment from a given point's previous neighbour to the given point
+ */
+getPointSpline: function (segment, point, i) {
+        var smoothing = 1.5, // 1 means control points midway between points, 2 means 1/3 from the point, 3 is 1/4 etc
+                denom = smoothing + 1,
+                plotX = point.plotX,
+                plotY = point.plotY,
+                lastPoint = segment[i - 1],
+                nextPoint = segment[i + 1],
+                leftContX,
+                leftContY,
+                rightContX,
+                rightContY,
+                ret;
+
+        // find control points
+        if (lastPoint && nextPoint) {
+
+                var lastX = lastPoint.plotX,
+                        lastY = lastPoint.plotY,
+                        nextX = nextPoint.plotX,
+                        nextY = nextPoint.plotY,
+                        correction;
+
+                leftContX = (smoothing * plotX + lastX) / denom;
+                leftContY = (smoothing * plotY + lastY) / denom;
+                rightContX = (smoothing * plotX + nextX) / denom;
+                rightContY = (smoothing * plotY + nextY) / denom;
+
+                // have the two control points make a straight line through main point
+                correction = ((rightContY - leftContY) * (rightContX - plotX)) /
+                        (rightContX - leftContX) + plotY - rightContY;
+
+                leftContY += correction;
+                rightContY += correction;
+
+                // to prevent false extremes, check that control points are between
+                // neighbouring points' y values
+                if (leftContY > lastY && leftContY > plotY) {
+                        leftContY = mathMax(lastY, plotY);
+                        rightContY = 2 * plotY - leftContY; // mirror of left control point
+                } else if (leftContY < lastY && leftContY < plotY) {
+                        leftContY = mathMin(lastY, plotY);
+                        rightContY = 2 * plotY - leftContY;
+                }
+                if (rightContY > nextY && rightContY > plotY) {
+                        rightContY = mathMax(nextY, plotY);
+                        leftContY = 2 * plotY - rightContY;
+                } else if (rightContY < nextY && rightContY < plotY) {
+                        rightContY = mathMin(nextY, plotY);
+                        leftContY = 2 * plotY - rightContY;
+                }
+
+                // record for drawing in next point
+                point.rightContX = rightContX;
+                point.rightContY = rightContY;
+
+        }
+
+        // Visualize control points for debugging
+        /*
+        if (leftContX) {
+                this.chart.renderer.circle(leftContX + this.chart.plotLeft, leftContY + this.chart.plotTop, 2)
+                        .attr({
+                                stroke: 'red',
+                                'stroke-width': 1,
+                                fill: 'none'
+                        })
+                        .add();
+                this.chart.renderer.path(['M', leftContX + this.chart.plotLeft, leftContY + this.chart.plotTop,
+                        'L', plotX + this.chart.plotLeft, plotY + this.chart.plotTop])
+                        .attr({
+                                stroke: 'red',
+                                'stroke-width': 1
+                        })
+                        .add();
+                this.chart.renderer.circle(rightContX + this.chart.plotLeft, rightContY + this.chart.plotTop, 2)
+                        .attr({
+                                stroke: 'green',
+                                'stroke-width': 1,
+                                fill: 'none'
+                        })
+                        .add();
+                this.chart.renderer.path(['M', rightContX + this.chart.plotLeft, rightContY + this.chart.plotTop,
+                        'L', plotX + this.chart.plotLeft, plotY + this.chart.plotTop])
+                        .attr({
+                                stroke: 'green',
+                                'stroke-width': 1
+                        })
+                        .add();
+        }
+        */
+
+        // moveTo or lineTo
+        if (!i) {
+                ret = [M, plotX, plotY];
+        } else { // curve from last point to this
+                ret = [
+                        'C',
+                        lastPoint.rightContX || lastPoint.plotX,
+                        lastPoint.rightContY || lastPoint.plotY,
+                        leftContX || plotX,
+                        leftContY || plotY,
+                        plotX,
+                        plotY
+                ];
+                lastPoint.rightContX = lastPoint.rightContY = null; // reset for updating series later
+        }
+        return ret;
+}
+ +

}); seriesTypes.spline = SplineSeries;

+ +

/**

+ +
* Set the default options for areaspline
+*/
+ +

defaultPlotOptions.areaspline = merge(defaultPlotOptions.area);

+ +

/**

+ +
* AreaSplineSeries object
+*/
+ +

var areaProto = AreaSeries.prototype,

+ +
AreaSplineSeries = extendClass(SplineSeries, {
+        type: 'areaspline',
+        closedStacks: true, // instead of following the previous graph back, follow the threshold back
+
+        // Mix in methods from the area series
+        getSegmentPath: areaProto.getSegmentPath,
+        closeSegment: areaProto.closeSegment,
+        drawGraph: areaProto.drawGraph,
+        drawLegendSymbol: LegendSymbolMixin.drawRectangle
+});
+ +

seriesTypes.areaspline = AreaSplineSeries;

+ +

/**

+ +
* Set the default options for column
+*/
+ +

defaultPlotOptions.column = merge(defaultSeriesOptions, {

+ +
borderColor: '#FFFFFF',
+//borderWidth: 1,
+borderRadius: 0,
+//colorByPoint: undefined,
+groupPadding: 0.2,
+//grouping: true,
+marker: null, // point options are specified in the base options
+pointPadding: 0.1,
+//pointWidth: null,
+minPointLength: 0,
+cropThreshold: 50, // when there are more points, they will not animate out of the chart on xAxis.setExtremes
+pointRange: null, // null means auto, meaning 1 in a categorized axis and least distance between points if not categories
+states: {
+        hover: {
+                brightness: 0.1,
+                shadow: false,
+                halo: false
+        },
+        select: {
+                color: '#C0C0C0',
+                borderColor: '#000000',
+                shadow: false
+        }
+},
+dataLabels: {
+        align: null, // auto
+        verticalAlign: null, // auto
+        y: null
+},
+stickyTracking: false,
+tooltip: {
+        distance: 6
+},
+threshold: 0
+ +

});

+ +

/**

+ +
* ColumnSeries object
+*/
+ +

var ColumnSeries = extendClass(Series, {

+ +
type: 'column',
+pointAttrToOptions: { // mapping between SVG attributes and the corresponding options
+        stroke: 'borderColor',
+        fill: 'color',
+        r: 'borderRadius'
+},
+cropShoulder: 0,
+trackerGroups: ['group', 'dataLabelsGroup'],
+negStacks: true, // use separate negative stacks, unlike area stacks where a negative 
+        // point is substracted from previous (#1910)
+
+/**
+ * Initialize the series
+ */
+init: function () {
+        Series.prototype.init.apply(this, arguments);
+
+        var series = this,
+                chart = series.chart;
+
+        // if the series is added dynamically, force redraw of other
+        // series affected by a new column
+        if (chart.hasRendered) {
+                each(chart.series, function (otherSeries) {
+                        if (otherSeries.type === series.type) {
+                                otherSeries.isDirty = true;
+                        }
+                });
+        }
+},
+
+/**
+ * Return the width and x offset of the columns adjusted for grouping, groupPadding, pointPadding,
+ * pointWidth etc. 
+ */
+getColumnMetrics: function () {
+
+        var series = this,
+                options = series.options,
+                xAxis = series.xAxis,
+                yAxis = series.yAxis,
+                reversedXAxis = xAxis.reversed,
+                stackKey,
+                stackGroups = {},
+                columnIndex,
+                columnCount = 0;
+
+        // Get the total number of column type series.
+        // This is called on every series. Consider moving this logic to a
+        // chart.orderStacks() function and call it on init, addSeries and removeSeries
+        if (options.grouping === false) {
+                columnCount = 1;
+        } else {
+                each(series.chart.series, function (otherSeries) {
+                        var otherOptions = otherSeries.options,
+                                otherYAxis = otherSeries.yAxis;
+                        if (otherSeries.type === series.type && otherSeries.visible &&
+                                        yAxis.len === otherYAxis.len && yAxis.pos === otherYAxis.pos) {  // #642, #2086
+                                if (otherOptions.stacking) {
+                                        stackKey = otherSeries.stackKey;
+                                        if (stackGroups[stackKey] === UNDEFINED) {
+                                                stackGroups[stackKey] = columnCount++;
+                                        }
+                                        columnIndex = stackGroups[stackKey];
+                                } else if (otherOptions.grouping !== false) { // #1162
+                                        columnIndex = columnCount++;
+                                }
+                                otherSeries.columnIndex = columnIndex;
+                        }
+                });
+        }
+
+        var categoryWidth = mathMin(
+                        mathAbs(xAxis.transA) * (xAxis.ordinalSlope || options.pointRange || xAxis.closestPointRange || xAxis.tickInterval || 1), // #2610
+                        xAxis.len // #1535
+                ),
+                groupPadding = categoryWidth * options.groupPadding,
+                groupWidth = categoryWidth - 2 * groupPadding,
+                pointOffsetWidth = groupWidth / columnCount,
+                optionPointWidth = options.pointWidth,
+                pointPadding = defined(optionPointWidth) ? (pointOffsetWidth - optionPointWidth) / 2 :
+                        pointOffsetWidth * options.pointPadding,
+                pointWidth = pick(optionPointWidth, pointOffsetWidth - 2 * pointPadding), // exact point width, used in polar charts
+                colIndex = (reversedXAxis ? 
+                        columnCount - (series.columnIndex || 0) : // #1251
+                        series.columnIndex) || 0,
+                pointXOffset = pointPadding + (groupPadding + colIndex *
+                        pointOffsetWidth - (categoryWidth / 2)) *
+                        (reversedXAxis ? -1 : 1);
+
+        // Save it for reading in linked series (Error bars particularly)
+        return (series.columnMetrics = { 
+                width: pointWidth, 
+                offset: pointXOffset 
+        });
+
+},
+
+/**
+ * Translate each point to the plot area coordinate system and find shape positions
+ */
+translate: function () {
+        var series = this,
+                chart = series.chart,
+                options = series.options,
+                borderWidth = series.borderWidth = pick(
+                        options.borderWidth, 
+                        series.activePointCount > 0.5 * series.xAxis.len ? 0 : 1
+                ),
+                yAxis = series.yAxis,
+                threshold = options.threshold,
+                translatedThreshold = series.translatedThreshold = yAxis.getThreshold(threshold),
+                minPointLength = pick(options.minPointLength, 5),
+                metrics = series.getColumnMetrics(),
+                pointWidth = metrics.width,
+                seriesBarW = series.barW = mathCeil(mathMax(pointWidth, 1 + 2 * borderWidth)), // rounded and postprocessed for border width
+                pointXOffset = series.pointXOffset = metrics.offset,
+                xCrisp = -(borderWidth % 2 ? 0.5 : 0),
+                yCrisp = borderWidth % 2 ? 0.5 : 1;
+
+        if (chart.renderer.isVML && chart.inverted) {
+                yCrisp += 1;
+        }
+
+        Series.prototype.translate.apply(series);
+
+        // record the new values
+        each(series.points, function (point) {
+                var yBottom = pick(point.yBottom, translatedThreshold),
+                        plotY = mathMin(mathMax(-999 - yBottom, point.plotY), yAxis.len + 999 + yBottom), // Don't draw too far outside plot area (#1303, #2241)
+                        barX = point.plotX + pointXOffset,
+                        barW = seriesBarW,
+                        barY = mathMin(plotY, yBottom),
+                        right,
+                        bottom,
+                        fromTop,
+                        fromLeft,
+                        barH = mathMax(plotY, yBottom) - barY;
+
+                // Handle options.minPointLength
+                if (mathAbs(barH) < minPointLength) {
+                        if (minPointLength) {
+                                barH = minPointLength;
+                                barY =
+                                        mathRound(mathAbs(barY - translatedThreshold) > minPointLength ? // stacked
+                                                yBottom - minPointLength : // keep position
+                                                translatedThreshold - (yAxis.translate(point.y, 0, 1, 0, 1) <= translatedThreshold ? minPointLength : 0)); // use exact yAxis.translation (#1485)
+                        }
+                }
+
+                // Cache for access in polar
+                point.barX = barX;
+                point.pointWidth = pointWidth;
+
+                // Fix the tooltip on center of grouped columns (#1216)
+                point.tooltipPos = chart.inverted ? [yAxis.len - plotY, series.xAxis.len - barX - barW / 2] : [barX + barW / 2, plotY];
+
+                // Round off to obtain crisp edges
+                fromLeft = mathAbs(barX) < 0.5;
+                right = mathRound(barX + barW) + xCrisp;
+                barX = mathRound(barX) + xCrisp;
+                barW = right - barX;
+
+                fromTop = mathAbs(barY) < 0.5;
+                bottom = mathRound(barY + barH) + yCrisp;
+                barY = mathRound(barY) + yCrisp;
+                barH = bottom - barY;
+
+                // Top and left edges are exceptions
+                if (fromLeft) {
+                        barX += 1;
+                        barW -= 1;
+                }
+                if (fromTop) {
+                        barY -= 1;
+                        barH += 1;
+                }
+
+                // Register shape type and arguments to be used in drawPoints
+                point.shapeType = 'rect';
+                point.shapeArgs = {
+                        x: barX,
+                        y: barY,
+                        width: barW,
+                        height: barH
+                };
+        });
+
+},
+
+getSymbol: noop,
+
+/**
+ * Use a solid rectangle like the area series types
+ */
+drawLegendSymbol: LegendSymbolMixin.drawRectangle,
+
+/**
+ * Columns have no graph
+ */
+drawGraph: noop,
+
+/**
+ * Draw the columns. For bars, the series.group is rotated, so the same coordinates
+ * apply for columns and bars. This method is inherited by scatter series.
+ *
+ */
+drawPoints: function () {
+        var series = this,
+                chart = this.chart,
+                options = series.options,
+                renderer = chart.renderer,
+                animationLimit = options.animationLimit || 250,
+                shapeArgs,
+                pointAttr,
+                borderAttr;
+
+        // draw the columns
+        each(series.points, function (point) {
+                var plotY = point.plotY,
+                        graphic = point.graphic;
+
+                if (plotY !== UNDEFINED && !isNaN(plotY) && point.y !== null) {
+                        shapeArgs = point.shapeArgs;
+                        borderAttr = defined(series.borderWidth) ? {
+                                'stroke-width': series.borderWidth
+                        } : {};
+                        pointAttr = point.pointAttr[point.selected ? SELECT_STATE : NORMAL_STATE] || series.pointAttr[NORMAL_STATE];
+                        if (graphic) { // update
+                                stop(graphic);
+                                graphic.attr(borderAttr)[chart.pointCount < animationLimit ? 'animate' : 'attr'](merge(shapeArgs));
+
+                        } else {
+                                point.graphic = graphic = renderer[point.shapeType](shapeArgs)
+                                        .attr(pointAttr)
+                                        .attr(borderAttr)
+                                        .add(series.group)
+                                        .shadow(options.shadow, null, options.stacking && !options.borderRadius);
+                        }
+
+                } else if (graphic) {
+                        point.graphic = graphic.destroy(); // #1269
+                }
+        });
+},
+
+/**
+ * Animate the column heights one by one from zero
+ * @param {Boolean} init Whether to initialize the animation or run it
+ */
+animate: function (init) {
+        var series = this,
+                yAxis = this.yAxis,
+                options = series.options,
+                inverted = this.chart.inverted,
+                attr = {},
+                translatedThreshold;
+
+        if (hasSVG) { // VML is too slow anyway
+                if (init) {
+                        attr.scaleY = 0.001;
+                        translatedThreshold = mathMin(yAxis.pos + yAxis.len, mathMax(yAxis.pos, yAxis.toPixels(options.threshold)));
+                        if (inverted) {
+                                attr.translateX = translatedThreshold - yAxis.len;
+                        } else {
+                                attr.translateY = translatedThreshold;
+                        }
+                        series.group.attr(attr);
+
+                } else { // run the animation
+
+                        attr.scaleY = 1;
+                        attr[inverted ? 'translateX' : 'translateY'] = yAxis.pos;
+                        series.group.animate(attr, series.options.animation);
+
+                        // delete this function to allow it only once
+                        series.animate = null;
+                }
+        }
+},
+
+/**
+ * Remove this series from the chart
+ */
+remove: function () {
+        var series = this,
+                chart = series.chart;
+
+        // column and bar series affects other series of the same type
+        // as they are either stacked or grouped
+        if (chart.hasRendered) {
+                each(chart.series, function (otherSeries) {
+                        if (otherSeries.type === series.type) {
+                                otherSeries.isDirty = true;
+                        }
+                });
+        }
+
+        Series.prototype.remove.apply(series, arguments);
+}
+ +

}); seriesTypes.column = ColumnSeries; /**

+ +
* Set the default options for bar
+*/
+ +

defaultPlotOptions.bar = merge(defaultPlotOptions.column); /**

+ +
* The Bar series class
+*/
+ +

var BarSeries = extendClass(ColumnSeries, {

+ +
type: 'bar',
+inverted: true
+ +

}); seriesTypes.bar = BarSeries;

+ +

/**

+ +
* Set the default options for scatter
+*/
+ +

defaultPlotOptions.scatter = merge(defaultSeriesOptions, {

+ +
lineWidth: 0,
+tooltip: {
+        headerFormat: '<span style="color:{series.color}">\u25CF</span> <span style="font-size: 10px;"> {series.name}</span><br/>', // docs
+        pointFormat: 'x: <b>{point.x}</b><br/>y: <b>{point.y}</b><br/>'
+},
+stickyTracking: false
+ +

});

+ +

/**

+ +
* The scatter series class
+*/
+ +

var ScatterSeries = extendClass(Series, {

+ +
type: 'scatter',
+sorted: false,
+requireSorting: false,
+noSharedTooltip: true,
+trackerGroups: ['markerGroup'],
+takeOrdinalPosition: false, // #2342
+singularTooltips: true,
+drawGraph: function () {
+        if (this.options.lineWidth) {
+                Series.prototype.drawGraph.call(this);
+        }
+}
+ +

});

+ +

seriesTypes.scatter = ScatterSeries;

+ +

/**

+ +
* Set the default options for pie
+*/
+ +

defaultPlotOptions.pie = merge(defaultSeriesOptions, {

+ +
borderColor: '#FFFFFF',
+borderWidth: 1,
+center: [null, null],
+clip: false,
+colorByPoint: true, // always true for pies
+dataLabels: {
+        // align: null,
+        // connectorWidth: 1,
+        // connectorColor: point.color,
+        // connectorPadding: 5,
+        distance: 30,
+        enabled: true,
+        formatter: function () {
+                return this.point.name;
+        }
+        // softConnector: true,
+        //y: 0
+},
+ignoreHiddenPoint: true,
+//innerSize: 0,
+legendType: 'point',
+marker: null, // point options are specified in the base options
+size: null,
+showInLegend: false,
+slicedOffset: 10,
+states: {
+        hover: {
+                brightness: 0.1,
+                shadow: false
+        }
+},
+stickyTracking: false,
+tooltip: {
+        followPointer: true
+}
+ +

});

+ +

/**

+ +
* Extended point object for pies
+*/
+ +

var PiePoint = extendClass(Point, {

+ +
/**
+ * Initiate the pie slice
+ */
+init: function () {
+
+        Point.prototype.init.apply(this, arguments);
+
+        var point = this,
+                toggleSlice;
+
+        // Disallow negative values (#1530)
+        if (point.y < 0) {
+                point.y = null;
+        }
+
+        //visible: options.visible !== false,
+        extend(point, {
+                visible: point.visible !== false,
+                name: pick(point.name, 'Slice')
+        });
+
+        // add event listener for select
+        toggleSlice = function (e) {
+                point.slice(e.type === 'select');
+        };
+        addEvent(point, 'select', toggleSlice);
+        addEvent(point, 'unselect', toggleSlice);
+
+        return point;
+},
+
+/**
+ * Toggle the visibility of the pie slice
+ * @param {Boolean} vis Whether to show the slice or not. If undefined, the
+ *    visibility is toggled
+ */
+setVisible: function (vis) {
+        var point = this,
+                series = point.series,
+                chart = series.chart;
+
+        // if called without an argument, toggle visibility
+        point.visible = point.options.visible = vis = vis === UNDEFINED ? !point.visible : vis;
+        series.options.data[inArray(point, series.data)] = point.options; // update userOptions.data
+
+        // Show and hide associated elements
+        each(['graphic', 'dataLabel', 'connector', 'shadowGroup'], function (key) {
+                if (point[key]) {
+                        point[key][vis ? 'show' : 'hide'](true);
+                }
+        });
+
+        if (point.legendItem) {
+                chart.legend.colorizeItem(point, vis);
+        }
+
+        // Handle ignore hidden slices
+        if (!series.isDirty && series.options.ignoreHiddenPoint) {
+                series.isDirty = true;
+                chart.redraw();
+        }
+},
+
+/**
+ * Set or toggle whether the slice is cut out from the pie
+ * @param {Boolean} sliced When undefined, the slice state is toggled
+ * @param {Boolean} redraw Whether to redraw the chart. True by default.
+ */
+slice: function (sliced, redraw, animation) {
+        var point = this,
+                series = point.series,
+                chart = series.chart,
+                translation;
+
+        setAnimation(animation, chart);
+
+        // redraw is true by default
+        redraw = pick(redraw, true);
+
+        // if called without an argument, toggle
+        point.sliced = point.options.sliced = sliced = defined(sliced) ? sliced : !point.sliced;
+        series.options.data[inArray(point, series.data)] = point.options; // update userOptions.data
+
+        translation = sliced ? point.slicedTranslation : {
+                translateX: 0,
+                translateY: 0
+        };
+
+        point.graphic.animate(translation);
+
+        if (point.shadowGroup) {
+                point.shadowGroup.animate(translation);
+        }
+
+},
+
+haloPath: function (size) {
+        var shapeArgs = this.shapeArgs,
+                chart = this.series.chart;
+
+        return this.series.chart.renderer.symbols.arc(chart.plotLeft + shapeArgs.x, chart.plotTop + shapeArgs.y, shapeArgs.r + size, shapeArgs.r + size, {
+                innerR: this.shapeArgs.r,
+                start: shapeArgs.start,
+                end: shapeArgs.end
+        });
+}
+ +

});

+ +

/**

+ +
* The Pie series class
+*/
+ +

var PieSeries = {

+ +
type: 'pie',
+isCartesian: false,
+pointClass: PiePoint,
+requireSorting: false,
+noSharedTooltip: true,
+trackerGroups: ['group', 'dataLabelsGroup'],
+axisTypes: [],
+pointAttrToOptions: { // mapping between SVG attributes and the corresponding options
+        stroke: 'borderColor',
+        'stroke-width': 'borderWidth',
+        fill: 'color'
+},
+singularTooltips: true,
+
+/**
+ * Pies have one color each point
+ */
+getColor: noop,
+
+/**
+ * Animate the pies in
+ */
+animate: function (init) {
+        var series = this,
+                points = series.points,
+                startAngleRad = series.startAngleRad;
+
+        if (!init) {
+                each(points, function (point) {
+                        var graphic = point.graphic,
+                                args = point.shapeArgs;
+
+                        if (graphic) {
+                                // start values
+                                graphic.attr({
+                                        r: series.center[3] / 2, // animate from inner radius (#779)
+                                        start: startAngleRad,
+                                        end: startAngleRad
+                                });
+
+                                // animate
+                                graphic.animate({
+                                        r: args.r,
+                                        start: args.start,
+                                        end: args.end
+                                }, series.options.animation);
+                        }
+                });
+
+                // delete this function to allow it only once
+                series.animate = null;
+        }
+},
+
+/**
+ * Extend the basic setData method by running processData and generatePoints immediately,
+ * in order to access the points from the legend.
+ */
+setData: function (data, redraw, animation, updatePoints) {
+        Series.prototype.setData.call(this, data, false, animation, updatePoints);
+        this.processData();
+        this.generatePoints();
+        if (pick(redraw, true)) {
+                this.chart.redraw(animation);
+        } 
+},
+
+/**
+ * Extend the generatePoints method by adding total and percentage properties to each point
+ */
+generatePoints: function () {
+        var i,
+                total = 0,
+                points,
+                len,
+                point,
+                ignoreHiddenPoint = this.options.ignoreHiddenPoint;
+
+        Series.prototype.generatePoints.call(this);
+
+        // Populate local vars
+        points = this.points;
+        len = points.length;
+
+        // Get the total sum
+        for (i = 0; i < len; i++) {
+                point = points[i];
+                total += (ignoreHiddenPoint && !point.visible) ? 0 : point.y;
+        }
+        this.total = total;
+
+        // Set each point's properties
+        for (i = 0; i < len; i++) {
+                point = points[i];
+                point.percentage = total > 0 ? (point.y / total) * 100 : 0;
+                point.total = total;
+        }
+
+},
+
+/**
+ * Do translation for pie slices
+ */
+translate: function (positions) {
+        this.generatePoints();
+
+        var series = this,
+                cumulative = 0,
+                precision = 1000, // issue #172
+                options = series.options,
+                slicedOffset = options.slicedOffset,
+                connectorOffset = slicedOffset + options.borderWidth,
+                start,
+                end,
+                angle,
+                startAngle = options.startAngle || 0,
+                startAngleRad = series.startAngleRad = mathPI / 180 * (startAngle - 90),
+                endAngleRad = series.endAngleRad = mathPI / 180 * ((pick(options.endAngle, startAngle + 360)) - 90),
+                circ = endAngleRad - startAngleRad, //2 * mathPI,
+                points = series.points,
+                radiusX, // the x component of the radius vector for a given point
+                radiusY,
+                labelDistance = options.dataLabels.distance,
+                ignoreHiddenPoint = options.ignoreHiddenPoint,
+                i,
+                len = points.length,
+                point;
+
+        // Get positions - either an integer or a percentage string must be given.
+        // If positions are passed as a parameter, we're in a recursive loop for adjusting
+        // space for data labels.
+        if (!positions) {
+                series.center = positions = series.getCenter();
+        }
+
+        // utility for getting the x value from a given y, used for anticollision logic in data labels
+        series.getX = function (y, left) {
+
+                angle = math.asin(mathMin((y - positions[1]) / (positions[2] / 2 + labelDistance), 1));
+
+                return positions[0] +
+                        (left ? -1 : 1) *
+                        (mathCos(angle) * (positions[2] / 2 + labelDistance));
+        };
+
+        // Calculate the geometry for each point
+        for (i = 0; i < len; i++) {
+
+                point = points[i];
+
+                // set start and end angle
+                start = startAngleRad + (cumulative * circ);
+                if (!ignoreHiddenPoint || point.visible) {
+                        cumulative += point.percentage / 100;
+                }
+                end = startAngleRad + (cumulative * circ);
+
+                // set the shape
+                point.shapeType = 'arc';
+                point.shapeArgs = {
+                        x: positions[0],
+                        y: positions[1],
+                        r: positions[2] / 2,
+                        innerR: positions[3] / 2,
+                        start: mathRound(start * precision) / precision,
+                        end: mathRound(end * precision) / precision
+                };
+
+                // The angle must stay within -90 and 270 (#2645)
+                angle = (end + start) / 2;
+                if (angle > 1.5 * mathPI) {
+                        angle -= 2 * mathPI;
+                } else if (angle < -mathPI / 2) {
+                        angle += 2 * mathPI;
+                }
+
+                // Center for the sliced out slice
+                point.slicedTranslation = {
+                        translateX: mathRound(mathCos(angle) * slicedOffset),
+                        translateY: mathRound(mathSin(angle) * slicedOffset)
+                };
+
+                // set the anchor point for tooltips
+                radiusX = mathCos(angle) * positions[2] / 2;
+                radiusY = mathSin(angle) * positions[2] / 2;
+                point.tooltipPos = [
+                        positions[0] + radiusX * 0.7,
+                        positions[1] + radiusY * 0.7
+                ];
+
+                point.half = angle < -mathPI / 2 || angle > mathPI / 2 ? 1 : 0;
+                point.angle = angle;
+
+                // set the anchor point for data labels
+                connectorOffset = mathMin(connectorOffset, labelDistance / 2); // #1678
+                point.labelPos = [
+                        positions[0] + radiusX + mathCos(angle) * labelDistance, // first break of connector
+                        positions[1] + radiusY + mathSin(angle) * labelDistance, // a/a
+                        positions[0] + radiusX + mathCos(angle) * connectorOffset, // second break, right outside pie
+                        positions[1] + radiusY + mathSin(angle) * connectorOffset, // a/a
+                        positions[0] + radiusX, // landing point for connector
+                        positions[1] + radiusY, // a/a
+                        labelDistance < 0 ? // alignment
+                                'center' :
+                                point.half ? 'right' : 'left', // alignment
+                        angle // center angle
+                ];
+
+        }
+},
+
+drawGraph: null,
+
+/**
+ * Draw the data points
+ */
+drawPoints: function () {
+        var series = this,
+                chart = series.chart,
+                renderer = chart.renderer,
+                groupTranslation,
+                //center,
+                graphic,
+                //group,
+                shadow = series.options.shadow,
+                shadowGroup,
+                shapeArgs;
+
+        if (shadow && !series.shadowGroup) {
+                series.shadowGroup = renderer.g('shadow')
+                        .add(series.group);
+        }
+
+        // draw the slices
+        each(series.points, function (point) {
+                graphic = point.graphic;
+                shapeArgs = point.shapeArgs;
+                shadowGroup = point.shadowGroup;
+
+                // put the shadow behind all points
+                if (shadow && !shadowGroup) {
+                        shadowGroup = point.shadowGroup = renderer.g('shadow')
+                                .add(series.shadowGroup);
+                }
+
+                // if the point is sliced, use special translation, else use plot area traslation
+                groupTranslation = point.sliced ? point.slicedTranslation : {
+                        translateX: 0,
+                        translateY: 0
+                };
+
+                //group.translate(groupTranslation[0], groupTranslation[1]);
+                if (shadowGroup) {
+                        shadowGroup.attr(groupTranslation);
+                }
+
+                // draw the slice
+                if (graphic) {
+                        graphic.animate(extend(shapeArgs, groupTranslation));
+                } else {
+                        point.graphic = graphic = renderer[point.shapeType](shapeArgs)
+                                .setRadialReference(series.center)
+                                .attr(
+                                        point.pointAttr[point.selected ? SELECT_STATE : NORMAL_STATE]
+                                )
+                                .attr({ 
+                                        'stroke-linejoin': 'round'
+                                        //zIndex: 1 // #2722 (reversed)
+                                })
+                                .attr(groupTranslation)
+                                .add(series.group)
+                                .shadow(shadow, shadowGroup);   
+                }
+
+                // detect point specific visibility (#2430)
+                if (point.visible !== undefined) {
+                        point.setVisible(point.visible);
+                }
+
+        });
+
+},
+
+/**
+ * Utility for sorting data labels
+ */
+sortByAngle: function (points, sign) {
+        points.sort(function (a, b) {
+                return a.angle !== undefined && (b.angle - a.angle) * sign;
+        });
+},              
+
+/**
+ * Use a simple symbol from LegendSymbolMixin
+ */
+drawLegendSymbol: LegendSymbolMixin.drawRectangle,
+
+/**
+ * Use the getCenter method from drawLegendSymbol
+ */
+getCenter: CenteredSeriesMixin.getCenter,
+
+/**
+ * Pies don't have point marker symbols
+ */
+getSymbol: noop
+ +

}; PieSeries = extendClass(Series, PieSeries); seriesTypes.pie = PieSeries;

+ +

/**

+ +
* Draw the data labels
+*/
+ +

Series.prototype.drawDataLabels = function () {

+ +
var series = this,
+        seriesOptions = series.options,
+        cursor = seriesOptions.cursor,
+        options = seriesOptions.dataLabels,
+        points = series.points,
+        pointOptions,
+        generalOptions,
+        str,
+        dataLabelsGroup;
+
+if (options.enabled || series._hasPointLabels) {
+
+        // Process default alignment of data labels for columns
+        if (series.dlProcessOptions) {
+                series.dlProcessOptions(options);
+        }
+
+        // Create a separate group for the data labels to avoid rotation
+        dataLabelsGroup = series.plotGroup(
+                'dataLabelsGroup',
+                'data-labels',
+                HIDDEN,
+                options.zIndex || 6
+        );
+
+        if (!series.hasRendered && pick(options.defer, true)) {
+                dataLabelsGroup.attr({ opacity: 0 });
+                addEvent(series, 'afterAnimate', function () {
+                        series.dataLabelsGroup.show()[seriesOptions.animation ? 'animate' : 'attr']({ opacity: 1 }, { duration: 200 });
+                });
+        }
+
+        // Make the labels for each point
+        generalOptions = options;
+        each(points, function (point) {
+
+                var enabled,
+                        dataLabel = point.dataLabel,
+                        labelConfig,
+                        attr,
+                        name,
+                        rotation,
+                        connector = point.connector,
+                        isNew = true;
+
+                // Determine if each data label is enabled
+                pointOptions = point.options && point.options.dataLabels;
+                enabled = pick(pointOptions && pointOptions.enabled, generalOptions.enabled); // #2282
+
+                // If the point is outside the plot area, destroy it. #678, #820
+                if (dataLabel && !enabled) {
+                        point.dataLabel = dataLabel.destroy();
+
+                // Individual labels are disabled if the are explicitly disabled
+                // in the point options, or if they fall outside the plot area.
+                } else if (enabled) {
+
+                        // Create individual options structure that can be extended without
+                        // affecting others
+                        options = merge(generalOptions, pointOptions);
+
+                        rotation = options.rotation;
+
+                        // Get the string
+                        labelConfig = point.getLabelConfig();
+                        str = options.format ?
+                                format(options.format, labelConfig) :
+                                options.formatter.call(labelConfig, options);
+
+                        // Determine the color
+                        options.style.color = pick(options.color, options.style.color, series.color, 'black');
+
+                        // update existing label
+                        if (dataLabel) {
+
+                                if (defined(str)) {
+                                        dataLabel
+                                                .attr({
+                                                        text: str
+                                                });
+                                        isNew = false;
+
+                                } else { // #1437 - the label is shown conditionally
+                                        point.dataLabel = dataLabel = dataLabel.destroy();
+                                        if (connector) {
+                                                point.connector = connector.destroy();
+                                        }
+                                }
+
+                        // create new label
+                        } else if (defined(str)) {
+                                attr = {
+                                        //align: align,
+                                        fill: options.backgroundColor,
+                                        stroke: options.borderColor,
+                                        'stroke-width': options.borderWidth,
+                                        r: options.borderRadius || 0,
+                                        rotation: rotation,
+                                        padding: options.padding,
+                                        zIndex: 1
+                                };
+                                // Remove unused attributes (#947)
+                                for (name in attr) {
+                                        if (attr[name] === UNDEFINED) {
+                                                delete attr[name];
+                                        }
+                                }
+
+                                dataLabel = point.dataLabel = series.chart.renderer[rotation ? 'text' : 'label']( // labels don't support rotation
+                                        str,
+                                        0,
+                                        -999,
+                                        null,
+                                        null,
+                                        null,
+                                        options.useHTML
+                                )
+                                .attr(attr)
+                                .css(extend(options.style, cursor && { cursor: cursor }))
+                                .add(dataLabelsGroup)
+                                .shadow(options.shadow);
+
+                        }
+
+                        if (dataLabel) {
+                                // Now the data label is created and placed at 0,0, so we need to align it
+                                series.alignDataLabel(point, dataLabel, options, null, isNew);
+                        }
+                }
+        });
+}
+ +

};

+ +

/**

+ +
* Align each individual data label
+*/
+ +

Series.prototype.alignDataLabel = function (point, dataLabel, options, alignTo, isNew) {

+ +
var chart = this.chart,
+        inverted = chart.inverted,
+        plotX = pick(point.plotX, -999),
+        plotY = pick(point.plotY, -999),
+        bBox = dataLabel.getBBox(),
+        // Math.round for rounding errors (#2683), alignTo to allow column labels (#2700)
+        visible = this.visible && (point.series.forceDL || chart.isInsidePlot(plotX, mathRound(plotY), inverted) ||
+                (alignTo && chart.isInsidePlot(plotX, inverted ? alignTo.x + 1 : alignTo.y + alignTo.height - 1, inverted))),
+        alignAttr; // the final position;
+
+if (visible) {
+
+        // The alignment box is a singular point
+        alignTo = extend({
+                x: inverted ? chart.plotWidth - plotY : plotX,
+                y: mathRound(inverted ? chart.plotHeight - plotX : plotY),
+                width: 0,
+                height: 0
+        }, alignTo);
+
+        // Add the text size for alignment calculation
+        extend(options, {
+                width: bBox.width,
+                height: bBox.height
+        });
+
+        // Allow a hook for changing alignment in the last moment, then do the alignment
+        if (options.rotation) { // Fancy box alignment isn't supported for rotated text
+                alignAttr = {
+                        align: options.align,
+                        x: alignTo.x + options.x + alignTo.width / 2,
+                        y: alignTo.y + options.y + alignTo.height / 2
+                };
+                dataLabel[isNew ? 'attr' : 'animate'](alignAttr);
+        } else {
+                dataLabel.align(options, null, alignTo);
+                alignAttr = dataLabel.alignAttr;
+
+                // Handle justify or crop
+                if (pick(options.overflow, 'justify') === 'justify') {
+                        this.justifyDataLabel(dataLabel, options, alignAttr, bBox, alignTo, isNew);
+
+                } else if (pick(options.crop, true)) {
+                        // Now check that the data label is within the plot area
+                        visible = chart.isInsidePlot(alignAttr.x, alignAttr.y) && chart.isInsidePlot(alignAttr.x + bBox.width, alignAttr.y + bBox.height);
+
+                }
+        }
+}
+
+// Show or hide based on the final aligned position
+if (!visible) {
+        dataLabel.attr({ y: -999 });
+        dataLabel.placed = false; // don't animate back in
+}
+ +

};

+ +

/**

+ +
* If data labels fall partly outside the plot area, align them back in, in a way that
+* doesn't hide the point.
+*/
+ +

Series.prototype.justifyDataLabel = function (dataLabel, options, alignAttr, bBox, alignTo, isNew) {

+ +
var chart = this.chart,
+        align = options.align,
+        verticalAlign = options.verticalAlign,
+        off,
+        justified;
+
+// Off left
+off = alignAttr.x;
+if (off < 0) {
+        if (align === 'right') {
+                options.align = 'left';
+        } else {
+                options.x = -off;
+        }
+        justified = true;
+}
+
+// Off right
+off = alignAttr.x + bBox.width;
+if (off > chart.plotWidth) {
+        if (align === 'left') {
+                options.align = 'right';
+        } else {
+                options.x = chart.plotWidth - off;
+        }
+        justified = true;
+}
+
+// Off top
+off = alignAttr.y;
+if (off < 0) {
+        if (verticalAlign === 'bottom') {
+                options.verticalAlign = 'top';
+        } else {
+                options.y = -off;
+        }
+        justified = true;
+}
+
+// Off bottom
+off = alignAttr.y + bBox.height;
+if (off > chart.plotHeight) {
+        if (verticalAlign === 'top') {
+                options.verticalAlign = 'bottom';
+        } else {
+                options.y = chart.plotHeight - off;
+        }
+        justified = true;
+}
+
+if (justified) {
+        dataLabel.placed = !isNew;
+        dataLabel.align(options, null, alignTo);
+}
+ +

};

+ +

/**

+ +
* Override the base drawDataLabels method by pie specific functionality
+*/
+ +

if (seriesTypes.pie) {

+ +
seriesTypes.pie.prototype.drawDataLabels = function () {
+        var series = this,
+                data = series.data,
+                point,
+                chart = series.chart,
+                options = series.options.dataLabels,
+                connectorPadding = pick(options.connectorPadding, 10),
+                connectorWidth = pick(options.connectorWidth, 1),
+                plotWidth = chart.plotWidth,
+                plotHeight = chart.plotHeight,
+                connector,
+                connectorPath,
+                softConnector = pick(options.softConnector, true),
+                distanceOption = options.distance,
+                seriesCenter = series.center,
+                radius = seriesCenter[2] / 2,
+                centerY = seriesCenter[1],
+                outside = distanceOption > 0,
+                dataLabel,
+                dataLabelWidth,
+                labelPos,
+                labelHeight,
+                halves = [// divide the points into right and left halves for anti collision
+                        [], // right
+                        []  // left
+                ],
+                x,
+                y,
+                visibility,
+                rankArr,
+                i,
+                j,
+                overflow = [0, 0, 0, 0], // top, right, bottom, left
+                sort = function (a, b) {
+                        return b.y - a.y;
+                };
+
+        // get out if not enabled
+        if (!series.visible || (!options.enabled && !series._hasPointLabels)) {
+                return;
+        }
+
+        // run parent method
+        Series.prototype.drawDataLabels.apply(series);
+
+        // arrange points for detection collision
+        each(data, function (point) {
+                if (point.dataLabel && point.visible) { // #407, #2510
+                        halves[point.half].push(point);
+                }
+        });
+
+        // assume equal label heights
+        i = 0;
+        while (!labelHeight && data[i]) { // #1569
+                labelHeight = data[i] && data[i].dataLabel && (data[i].dataLabel.getBBox().height || 21); // 21 is for #968
+                i++;
+        }
+
+        /* Loop over the points in each half, starting from the top and bottom
+         * of the pie to detect overlapping labels.
+         */
+        i = 2;
+        while (i--) {
+
+                var slots = [],
+                        slotsLength,
+                        usedSlots = [],
+                        points = halves[i],
+                        pos,
+                        length = points.length,
+                        slotIndex;
+
+                // Sort by angle
+                series.sortByAngle(points, i - 0.5);
+
+                // Only do anti-collision when we are outside the pie and have connectors (#856)
+                if (distanceOption > 0) {
+
+                        // build the slots
+                        for (pos = centerY - radius - distanceOption; pos <= centerY + radius + distanceOption; pos += labelHeight) {
+                                slots.push(pos);
+
+                                // visualize the slot
+                                /*
+                                var slotX = series.getX(pos, i) + chart.plotLeft - (i ? 100 : 0),
+                                        slotY = pos + chart.plotTop;
+                                if (!isNaN(slotX)) {
+                                        chart.renderer.rect(slotX, slotY - 7, 100, labelHeight, 1)
+                                                .attr({
+                                                        'stroke-width': 1,
+                                                        stroke: 'silver'
+                                                })
+                                                .add();
+                                        chart.renderer.text('Slot '+ (slots.length - 1), slotX, slotY + 4)
+                                                .attr({
+                                                        fill: 'silver'
+                                                }).add();
+                                }
+                                */
+                        }
+                        slotsLength = slots.length;
+
+                        // if there are more values than available slots, remove lowest values
+                        if (length > slotsLength) {
+                                // create an array for sorting and ranking the points within each quarter
+                                rankArr = [].concat(points);
+                                rankArr.sort(sort);
+                                j = length;
+                                while (j--) {
+                                        rankArr[j].rank = j;
+                                }
+                                j = length;
+                                while (j--) {
+                                        if (points[j].rank >= slotsLength) {
+                                                points.splice(j, 1);
+                                        }
+                                }
+                                length = points.length;
+                        }
+
+                        // The label goes to the nearest open slot, but not closer to the edge than
+                        // the label's index.
+                        for (j = 0; j < length; j++) {
+
+                                point = points[j];
+                                labelPos = point.labelPos;
+
+                                var closest = 9999,
+                                        distance,
+                                        slotI;
+
+                                // find the closest slot index
+                                for (slotI = 0; slotI < slotsLength; slotI++) {
+                                        distance = mathAbs(slots[slotI] - labelPos[1]);
+                                        if (distance < closest) {
+                                                closest = distance;
+                                                slotIndex = slotI;
+                                        }
+                                }
+
+                                // if that slot index is closer to the edges of the slots, move it
+                                // to the closest appropriate slot
+                                if (slotIndex < j && slots[j] !== null) { // cluster at the top
+                                        slotIndex = j;
+                                } else if (slotsLength  < length - j + slotIndex && slots[j] !== null) { // cluster at the bottom
+                                        slotIndex = slotsLength - length + j;
+                                        while (slots[slotIndex] === null) { // make sure it is not taken
+                                                slotIndex++;
+                                        }
+                                } else {
+                                        // Slot is taken, find next free slot below. In the next run, the next slice will find the
+                                        // slot above these, because it is the closest one
+                                        while (slots[slotIndex] === null) { // make sure it is not taken
+                                                slotIndex++;
+                                        }
+                                }
+
+                                usedSlots.push({ i: slotIndex, y: slots[slotIndex] });
+                                slots[slotIndex] = null; // mark as taken
+                        }
+                        // sort them in order to fill in from the top
+                        usedSlots.sort(sort);
+                }
+
+                // now the used slots are sorted, fill them up sequentially
+                for (j = 0; j < length; j++) {
+
+                        var slot, naturalY;
+
+                        point = points[j];
+                        labelPos = point.labelPos;
+                        dataLabel = point.dataLabel;
+                        visibility = point.visible === false ? HIDDEN : VISIBLE;
+                        naturalY = labelPos[1];
+
+                        if (distanceOption > 0) {
+                                slot = usedSlots.pop();
+                                slotIndex = slot.i;
+
+                                // if the slot next to currrent slot is free, the y value is allowed
+                                // to fall back to the natural position
+                                y = slot.y;
+                                if ((naturalY > y && slots[slotIndex + 1] !== null) ||
+                                                (naturalY < y &&  slots[slotIndex - 1] !== null)) {
+                                        y = naturalY;
+                                }
+
+                        } else {
+                                y = naturalY;
+                        }
+
+                        // get the x - use the natural x position for first and last slot, to prevent the top
+                        // and botton slice connectors from touching each other on either side
+                        x = options.justify ?
+                                seriesCenter[0] + (i ? -1 : 1) * (radius + distanceOption) :
+                                series.getX(slotIndex === 0 || slotIndex === slots.length - 1 ? naturalY : y, i);
+
+                        // Record the placement and visibility
+                        dataLabel._attr = {
+                                visibility: visibility,
+                                align: labelPos[6]
+                        };
+                        dataLabel._pos = {
+                                x: x + options.x +
+                                        ({ left: connectorPadding, right: -connectorPadding }[labelPos[6]] || 0),
+                                y: y + options.y - 10 // 10 is for the baseline (label vs text)
+                        };
+                        dataLabel.connX = x;
+                        dataLabel.connY = y;
+
+                        // Detect overflowing data labels
+                        if (this.options.size === null) {
+                                dataLabelWidth = dataLabel.width;
+                                // Overflow left
+                                if (x - dataLabelWidth < connectorPadding) {
+                                        overflow[3] = mathMax(mathRound(dataLabelWidth - x + connectorPadding), overflow[3]);
+
+                                // Overflow right
+                                } else if (x + dataLabelWidth > plotWidth - connectorPadding) {
+                                        overflow[1] = mathMax(mathRound(x + dataLabelWidth - plotWidth + connectorPadding), overflow[1]);
+                                }
+
+                                // Overflow top
+                                if (y - labelHeight / 2 < 0) {
+                                        overflow[0] = mathMax(mathRound(-y + labelHeight / 2), overflow[0]);
+
+                                // Overflow left
+                                } else if (y + labelHeight / 2 > plotHeight) {
+                                        overflow[2] = mathMax(mathRound(y + labelHeight / 2 - plotHeight), overflow[2]);
+                                }
+                        }
+                } // for each point
+        } // for each half
+
+        // Do not apply the final placement and draw the connectors until we have verified
+        // that labels are not spilling over.
+        if (arrayMax(overflow) === 0 || this.verifyDataLabelOverflow(overflow)) {
+
+                // Place the labels in the final position
+                this.placeDataLabels();
+
+                // Draw the connectors
+                if (outside && connectorWidth) {
+                        each(this.points, function (point) {
+                                connector = point.connector;
+                                labelPos = point.labelPos;
+                                dataLabel = point.dataLabel;
+
+                                if (dataLabel && dataLabel._pos) {
+                                        visibility = dataLabel._attr.visibility;
+                                        x = dataLabel.connX;
+                                        y = dataLabel.connY;
+                                        connectorPath = softConnector ? [
+                                                M,
+                                                x + (labelPos[6] === 'left' ? 5 : -5), y, // end of the string at the label
+                                                'C',
+                                                x, y, // first break, next to the label
+                                                2 * labelPos[2] - labelPos[4], 2 * labelPos[3] - labelPos[5],
+                                                labelPos[2], labelPos[3], // second break
+                                                L,
+                                                labelPos[4], labelPos[5] // base
+                                        ] : [
+                                                M,
+                                                x + (labelPos[6] === 'left' ? 5 : -5), y, // end of the string at the label
+                                                L,
+                                                labelPos[2], labelPos[3], // second break
+                                                L,
+                                                labelPos[4], labelPos[5] // base
+                                        ];
+
+                                        if (connector) {
+                                                connector.animate({ d: connectorPath });
+                                                connector.attr('visibility', visibility);
+
+                                        } else {
+                                                point.connector = connector = series.chart.renderer.path(connectorPath).attr({
+                                                        'stroke-width': connectorWidth,
+                                                        stroke: options.connectorColor || point.color || '#606060',
+                                                        visibility: visibility
+                                                        //zIndex: 0 // #2722 (reversed)
+                                                })
+                                                .add(series.dataLabelsGroup);
+                                        }
+                                } else if (connector) {
+                                        point.connector = connector.destroy();
+                                }
+                        });
+                }
+        }
+};
+/**
+ * Perform the final placement of the data labels after we have verified that they
+ * fall within the plot area.
+ */
+seriesTypes.pie.prototype.placeDataLabels = function () {
+        each(this.points, function (point) {
+                var dataLabel = point.dataLabel,
+                        _pos;
+
+                if (dataLabel) {
+                        _pos = dataLabel._pos;
+                        if (_pos) {
+                                dataLabel.attr(dataLabel._attr);
+                                dataLabel[dataLabel.moved ? 'animate' : 'attr'](_pos);
+                                dataLabel.moved = true;
+                        } else if (dataLabel) {
+                                dataLabel.attr({ y: -999 });
+                        }
+                }
+        });
+};
+
+seriesTypes.pie.prototype.alignDataLabel =  noop;
+
+/**
+ * Verify whether the data labels are allowed to draw, or we should run more translation and data
+ * label positioning to keep them inside the plot area. Returns true when data labels are ready
+ * to draw.
+ */
+seriesTypes.pie.prototype.verifyDataLabelOverflow = function (overflow) {
+
+        var center = this.center,
+                options = this.options,
+                centerOption = options.center,
+                minSize = options.minSize || 80,
+                newSize = minSize,
+                ret;
+
+        // Handle horizontal size and center
+        if (centerOption[0] !== null) { // Fixed center
+                newSize = mathMax(center[2] - mathMax(overflow[1], overflow[3]), minSize);
+
+        } else { // Auto center
+                newSize = mathMax(
+                        center[2] - overflow[1] - overflow[3], // horizontal overflow
+                        minSize
+                );
+                center[0] += (overflow[3] - overflow[1]) / 2; // horizontal center
+        }
+
+        // Handle vertical size and center
+        if (centerOption[1] !== null) { // Fixed center
+                newSize = mathMax(mathMin(newSize, center[2] - mathMax(overflow[0], overflow[2])), minSize);
+
+        } else { // Auto center
+                newSize = mathMax(
+                        mathMin(
+                                newSize,
+                                center[2] - overflow[0] - overflow[2] // vertical overflow
+                        ),
+                        minSize
+                );
+                center[1] += (overflow[0] - overflow[2]) / 2; // vertical center
+        }
+
+        // If the size must be decreased, we need to run translate and drawDataLabels again
+        if (newSize < center[2]) {
+                center[2] = newSize;
+                this.translate(center);
+                each(this.points, function (point) {
+                        if (point.dataLabel) {
+                                point.dataLabel._pos = null; // reset
+                        }
+                });
+
+                if (this.drawDataLabels) {
+                        this.drawDataLabels();
+                }
+        // Else, return true to indicate that the pie and its labels is within the plot area
+        } else {
+                ret = true;
+        }
+        return ret;
+};
+ +

}

+ +

if (seriesTypes.column) {

+ +
/**
+ * Override the basic data label alignment by adjusting for the position of the column
+ */
+seriesTypes.column.prototype.alignDataLabel = function (point, dataLabel, options,  alignTo, isNew) {
+        var chart = this.chart,
+                inverted = chart.inverted,
+                dlBox = point.dlBox || point.shapeArgs, // data label box for alignment
+                below = point.below || (point.plotY > pick(this.translatedThreshold, chart.plotSizeY)),
+                inside = pick(options.inside, !!this.options.stacking); // draw it inside the box?
+
+        // Align to the column itself, or the top of it
+        if (dlBox) { // Area range uses this method but not alignTo
+                alignTo = merge(dlBox);
+
+                if (inverted) {
+                        alignTo = {
+                                x: chart.plotWidth - alignTo.y - alignTo.height,
+                                y: chart.plotHeight - alignTo.x - alignTo.width,
+                                width: alignTo.height,
+                                height: alignTo.width
+                        };
+                }
+
+                // Compute the alignment box
+                if (!inside) {
+                        if (inverted) {
+                                alignTo.x += below ? 0 : alignTo.width;
+                                alignTo.width = 0;
+                        } else {
+                                alignTo.y += below ? alignTo.height : 0;
+                                alignTo.height = 0;
+                        }
+                }
+        }
+
+        // When alignment is undefined (typically columns and bars), display the individual
+        // point below or above the point depending on the threshold
+        options.align = pick(
+                options.align,
+                !inverted || inside ? 'center' : below ? 'right' : 'left'
+        );
+        options.verticalAlign = pick(
+                options.verticalAlign,
+                inverted || inside ? 'middle' : below ? 'top' : 'bottom'
+        );
+
+        // Call the parent method
+        Series.prototype.alignDataLabel.call(this, point, dataLabel, options, alignTo, isNew);
+};
+ +

}

+ +

/**

+ +
* TrackerMixin for points and graphs
+*/
+ +

var TrackerMixin = Highcharts.TrackerMixin = {

+ +
drawTrackerPoint: function () {
+        var series = this,
+                chart = series.chart,
+                pointer = chart.pointer,
+                cursor = series.options.cursor,
+                css = cursor && { cursor: cursor },
+                onMouseOver = function (e) {
+                        var target = e.target,
+                        point;
+
+                        if (chart.hoverSeries !== series) {
+                                series.onMouseOver();
+                        }
+
+                        while (target && !point) {
+                                point = target.point;
+                                target = target.parentNode;
+                        }
+
+                        if (point !== UNDEFINED && point !== chart.hoverPoint) { // undefined on graph in scatterchart
+                                point.onMouseOver(e);
+                        }
+                };
+
+        // Add reference to the point
+        each(series.points, function (point) {
+                if (point.graphic) {
+                        point.graphic.element.point = point;
+                }
+                if (point.dataLabel) {
+                        point.dataLabel.element.point = point;
+                }
+        });
+
+        // Add the event listeners, we need to do this only once
+        if (!series._hasTracking) {
+                each(series.trackerGroups, function (key) {
+                        if (series[key]) { // we don't always have dataLabelsGroup
+                                series[key]
+                                        .addClass(PREFIX + 'tracker')
+                                        .on('mouseover', onMouseOver)
+                                        .on('mouseout', function (e) { pointer.onTrackerMouseOut(e); })
+                                        .css(css);
+                                if (hasTouch) {
+                                        series[key].on('touchstart', onMouseOver);
+                                }
+                        }
+                });
+                series._hasTracking = true;
+        }
+},
+
+/**
+ * Draw the tracker object that sits above all data labels and markers to
+ * track mouse events on the graph or points. For the line type charts
+ * the tracker uses the same graphPath, but with a greater stroke width
+ * for better control.
+ */
+drawTrackerGraph: function () {
+        var series = this,
+                options = series.options,
+                trackByArea = options.trackByArea,
+                trackerPath = [].concat(trackByArea ? series.areaPath : series.graphPath),
+                trackerPathLength = trackerPath.length,
+                chart = series.chart,
+                pointer = chart.pointer,
+                renderer = chart.renderer,
+                snap = chart.options.tooltip.snap,
+                tracker = series.tracker,
+                cursor = options.cursor,
+                css = cursor && { cursor: cursor },
+                singlePoints = series.singlePoints,
+                singlePoint,
+                i,
+                onMouseOver = function () {
+                        if (chart.hoverSeries !== series) {
+                                series.onMouseOver();
+                        }
+                },
+                /*
+                 * Empirical lowest possible opacities for TRACKER_FILL for an element to stay invisible but clickable
+                 * IE6: 0.002
+                 * IE7: 0.002
+                 * IE8: 0.002
+                 * IE9: 0.00000000001 (unlimited)
+                 * IE10: 0.0001 (exporting only)
+                 * FF: 0.00000000001 (unlimited)
+                 * Chrome: 0.000001
+                 * Safari: 0.000001
+                 * Opera: 0.00000000001 (unlimited)
+                 */
+                TRACKER_FILL = 'rgba(192,192,192,' + (hasSVG ? 0.0001 : 0.002) + ')';
+
+        // Extend end points. A better way would be to use round linecaps,
+        // but those are not clickable in VML.
+        if (trackerPathLength && !trackByArea) {
+                i = trackerPathLength + 1;
+                while (i--) {
+                        if (trackerPath[i] === M) { // extend left side
+                                trackerPath.splice(i + 1, 0, trackerPath[i + 1] - snap, trackerPath[i + 2], L);
+                        }
+                        if ((i && trackerPath[i] === M) || i === trackerPathLength) { // extend right side
+                                trackerPath.splice(i, 0, L, trackerPath[i - 2] + snap, trackerPath[i - 1]);
+                        }
+                }
+        }
+
+        // handle single points
+        for (i = 0; i < singlePoints.length; i++) {
+                singlePoint = singlePoints[i];
+                trackerPath.push(M, singlePoint.plotX - snap, singlePoint.plotY,
+                L, singlePoint.plotX + snap, singlePoint.plotY);
+        }
+
+        // draw the tracker
+        if (tracker) {
+                tracker.attr({ d: trackerPath });
+        } else { // create
+
+                series.tracker = renderer.path(trackerPath)
+                .attr({
+                        'stroke-linejoin': 'round', // #1225
+                        visibility: series.visible ? VISIBLE : HIDDEN,
+                        stroke: TRACKER_FILL,
+                        fill: trackByArea ? TRACKER_FILL : NONE,
+                        'stroke-width' : options.lineWidth + (trackByArea ? 0 : 2 * snap),
+                        zIndex: 2
+                })
+                .add(series.group);
+
+                // The tracker is added to the series group, which is clipped, but is covered
+                // by the marker group. So the marker group also needs to capture events.
+                each([series.tracker, series.markerGroup], function (tracker) {
+                        tracker.addClass(PREFIX + 'tracker')
+                                .on('mouseover', onMouseOver)
+                                .on('mouseout', function (e) { pointer.onTrackerMouseOut(e); })
+                                .css(css);
+
+                        if (hasTouch) {
+                                tracker.on('touchstart', onMouseOver);
+                        }
+                });
+        }
+}
+ +

}; /* End TrackerMixin */

+ +

/**

+ +
* Add tracking event listener to the series group, so the point graphics
+* themselves act as trackers
+*/
+ +

if (seriesTypes.column) {

+ +
ColumnSeries.prototype.drawTracker = TrackerMixin.drawTrackerPoint;
+
+ +

}

+ +

if (seriesTypes.pie) {

+ +
seriesTypes.pie.prototype.drawTracker = TrackerMixin.drawTrackerPoint;
+
+ +

}

+ +

if (seriesTypes.scatter) {

+ +
ScatterSeries.prototype.drawTracker = TrackerMixin.drawTrackerPoint;
+
+ +

}

+ +

/*

+ +
* Extend Legend for item events 
+*/
+ +

extend(Legend.prototype, {

+ +
setItemEvents: function (item, legendItem, useHTML, itemStyle, itemHiddenStyle) {
+var legend = this;
+// Set the events on the item group, or in case of useHTML, the item itself (#1249)
+(useHTML ? legendItem : item.legendGroup).on('mouseover', function () {
+                item.setState(HOVER_STATE);
+                legendItem.css(legend.options.itemHoverStyle);
+        })
+        .on('mouseout', function () {
+                legendItem.css(item.visible ? itemStyle : itemHiddenStyle);
+                item.setState();
+        })
+        .on('click', function (event) {
+                var strLegendItemClick = 'legendItemClick',
+                        fnLegendItemClick = function () {
+                                item.setVisible();
+                        };
+
+                // Pass over the click/touch event. #4.
+                event = {
+                        browserEvent: event
+                };
+
+                // click the name or symbol
+                if (item.firePointEvent) { // point
+                        item.firePointEvent(strLegendItemClick, event, fnLegendItemClick);
+                } else {
+                        fireEvent(item, strLegendItemClick, event, fnLegendItemClick);
+                }
+        });
+},
+
+createCheckboxForItem: function (item) {
+        var legend = this;
+
+        item.checkbox = createElement('input', {
+                type: 'checkbox',
+                checked: item.selected,
+                defaultChecked: item.selected // required by IE7
+        }, legend.options.itemCheckboxStyle, legend.chart.container);
+
+        addEvent(item.checkbox, 'click', function (event) {
+                var target = event.target;
+                fireEvent(item, 'checkboxClick', {
+                                checked: target.checked
+                        },
+                        function () {
+                                item.select();
+                        }
+                );
+        });
+}
+ +

});

+ +

/*

+ +
* Add pointer cursor to legend itemstyle in defaultOptions
+*/
+ +

defaultOptions.legend.itemStyle.cursor = ‘pointer’;

+ +

/*

+ +
* Extend the Chart object with interaction
+*/
+ +

extend(Chart.prototype, {

+ +
/**
+ * Display the zoom button
+ */
+showResetZoom: function () {
+        var chart = this,
+                lang = defaultOptions.lang,
+                btnOptions = chart.options.chart.resetZoomButton,
+                theme = btnOptions.theme,
+                states = theme.states,
+                alignTo = btnOptions.relativeTo === 'chart' ? null : 'plotBox';
+
+        this.resetZoomButton = chart.renderer.button(lang.resetZoom, null, null, function () { chart.zoomOut(); }, theme, states && states.hover)
+                .attr({
+                        align: btnOptions.position.align,
+                        title: lang.resetZoomTitle
+                })
+                .add()
+                .align(btnOptions.position, false, alignTo);
+
+},
+
+/**
+ * Zoom out to 1:1
+ */
+zoomOut: function () {
+        var chart = this;
+        fireEvent(chart, 'selection', { resetSelection: true }, function () { 
+                chart.zoom();
+        });
+},
+
+/**
+ * Zoom into a given portion of the chart given by axis coordinates
+ * @param {Object} event
+ */
+zoom: function (event) {
+        var chart = this,
+                hasZoomed,
+                pointer = chart.pointer,
+                displayButton = false,
+                resetZoomButton;
+
+        // If zoom is called with no arguments, reset the axes
+        if (!event || event.resetSelection) {
+                each(chart.axes, function (axis) {
+                        hasZoomed = axis.zoom();
+                });
+        } else { // else, zoom in on all axes
+                each(event.xAxis.concat(event.yAxis), function (axisData) {
+                        var axis = axisData.axis,
+                                isXAxis = axis.isXAxis;
+
+                        // don't zoom more than minRange
+                        if (pointer[isXAxis ? 'zoomX' : 'zoomY'] || pointer[isXAxis ? 'pinchX' : 'pinchY']) {
+                                hasZoomed = axis.zoom(axisData.min, axisData.max);
+                                if (axis.displayBtn) {
+                                        displayButton = true;
+                                }
+                        }
+                });
+        }
+
+        // Show or hide the Reset zoom button
+        resetZoomButton = chart.resetZoomButton;
+        if (displayButton && !resetZoomButton) {
+                chart.showResetZoom();
+        } else if (!displayButton && isObject(resetZoomButton)) {
+                chart.resetZoomButton = resetZoomButton.destroy();
+        }
+
+        // Redraw
+        if (hasZoomed) {
+                chart.redraw(
+                        pick(chart.options.chart.animation, event && event.animation, chart.pointCount < 100) // animation
+                );
+        }
+},
+
+/**
+ * Pan the chart by dragging the mouse across the pane. This function is called
+ * on mouse move, and the distance to pan is computed from chartX compared to
+ * the first chartX position in the dragging operation.
+ */
+pan: function (e, panning) {
+
+        var chart = this,
+                hoverPoints = chart.hoverPoints,
+                doRedraw;
+
+        // remove active points for shared tooltip
+        if (hoverPoints) {
+                each(hoverPoints, function (point) {
+                        point.setState();
+                });
+        }
+
+        each(panning === 'xy' ? [1, 0] : [1], function (isX) { // xy is used in maps
+                var mousePos = e[isX ? 'chartX' : 'chartY'],
+                        axis = chart[isX ? 'xAxis' : 'yAxis'][0],
+                        startPos = chart[isX ? 'mouseDownX' : 'mouseDownY'],
+                        halfPointRange = (axis.pointRange || 0) / 2,
+                        extremes = axis.getExtremes(),
+                        newMin = axis.toValue(startPos - mousePos, true) + halfPointRange,
+                        newMax = axis.toValue(startPos + chart[isX ? 'plotWidth' : 'plotHeight'] - mousePos, true) - halfPointRange;
+
+                if (axis.series.length && newMin > mathMin(extremes.dataMin, extremes.min) && newMax < mathMax(extremes.dataMax, extremes.max)) {
+                        axis.setExtremes(newMin, newMax, false, false, { trigger: 'pan' });
+                        doRedraw = true;
+                }
+
+                chart[isX ? 'mouseDownX' : 'mouseDownY'] = mousePos; // set new reference for next run
+        });
+
+        if (doRedraw) {
+                chart.redraw(false);
+        }
+        css(chart.container, { cursor: 'move' });
+}
+ +

});

+ +

/*

+ +
* Extend the Point object with interaction
+*/
+ +

extend(Point.prototype, {

+ +
/**
+ * Toggle the selection status of a point
+ * @param {Boolean} selected Whether to select or unselect the point.
+ * @param {Boolean} accumulate Whether to add to the previous selection. By default,
+ *               this happens if the control key (Cmd on Mac) was pressed during clicking.
+ */
+select: function (selected, accumulate) {
+        var point = this,
+                series = point.series,
+                chart = series.chart;
+
+        selected = pick(selected, !point.selected);
+
+        // fire the event with the defalut handler
+        point.firePointEvent(selected ? 'select' : 'unselect', { accumulate: accumulate }, function () {
+                point.selected = point.options.selected = selected;
+                series.options.data[inArray(point, series.data)] = point.options;
+
+                point.setState(selected && SELECT_STATE);
+
+                // unselect all other points unless Ctrl or Cmd + click
+                if (!accumulate) {
+                        each(chart.getSelectedPoints(), function (loopPoint) {
+                                if (loopPoint.selected && loopPoint !== point) {
+                                        loopPoint.selected = loopPoint.options.selected = false;
+                                        series.options.data[inArray(loopPoint, series.data)] = loopPoint.options;
+                                        loopPoint.setState(NORMAL_STATE);
+                                                loopPoint.firePointEvent('unselect');
+                                }
+                        });
+                }
+        });
+},
+
+/**
+ * Runs on mouse over the point
+ */
+onMouseOver: function (e) {
+        var point = this,
+                series = point.series,
+                chart = series.chart,
+                tooltip = chart.tooltip,
+                hoverPoint = chart.hoverPoint;
+
+        // set normal state to previous series
+        if (hoverPoint && hoverPoint !== point) {
+                hoverPoint.onMouseOut();
+        }
+
+        // trigger the event
+        point.firePointEvent('mouseOver');
+
+        // update the tooltip
+        if (tooltip && (!tooltip.shared || series.noSharedTooltip)) {
+                tooltip.refresh(point, e);
+        }
+
+        // hover this
+        point.setState(HOVER_STATE);
+        chart.hoverPoint = point;
+},
+
+/**
+ * Runs on mouse out from the point
+ */
+onMouseOut: function () {
+        var chart = this.series.chart,
+                hoverPoints = chart.hoverPoints;
+
+        if (!hoverPoints || inArray(this, hoverPoints) === -1) { // #887
+                this.firePointEvent('mouseOut');
+
+                this.setState();
+                chart.hoverPoint = null;
+        }
+},
+
+/**
+ * Import events from the series' and point's options. Only do it on
+ * demand, to save processing time on hovering.
+ */
+importEvents: function () {
+        if (!this.hasImportedEvents) {
+                var point = this,
+                        options = merge(point.series.options.point, point.options),
+                        events = options.events,
+                        eventType;
+
+                point.events = events;
+
+                for (eventType in events) {
+                        addEvent(point, eventType, events[eventType]);
+                }
+                this.hasImportedEvents = true;
+
+        }
+},
+
+/**
+ * Set the point's state
+ * @param {String} state
+ */
+setState: function (state, move) {
+        var point = this,
+                plotX = point.plotX,
+                plotY = point.plotY,
+                series = point.series,
+                stateOptions = series.options.states,
+                markerOptions = defaultPlotOptions[series.type].marker && series.options.marker,
+                normalDisabled = markerOptions && !markerOptions.enabled,
+                markerStateOptions = markerOptions && markerOptions.states[state],
+                stateDisabled = markerStateOptions && markerStateOptions.enabled === false,
+                stateMarkerGraphic = series.stateMarkerGraphic,
+                pointMarker = point.marker || {},
+                chart = series.chart,
+                radius,
+                halo = series.halo,
+                haloOptions,
+                newSymbol,
+                pointAttr;
+
+        state = state || NORMAL_STATE; // empty string
+        pointAttr = point.pointAttr[state] || series.pointAttr[state];
+
+        if (
+                        // already has this state
+                        (state === point.state && !move) ||
+                        // selected points don't respond to hover
+                        (point.selected && state !== SELECT_STATE) ||
+                        // series' state options is disabled
+                        (stateOptions[state] && stateOptions[state].enabled === false) ||
+                        // general point marker's state options is disabled
+                        (state && (stateDisabled || (normalDisabled && markerStateOptions.enabled === false))) ||
+                        // individual point marker's state options is disabled
+                        (state && pointMarker.states && pointMarker.states[state] && pointMarker.states[state].enabled === false) // #1610
+
+                ) {
+                return;
+        }
+
+        // apply hover styles to the existing point
+        if (point.graphic) {
+                radius = markerOptions && point.graphic.symbolName && pointAttr.r;
+                point.graphic.attr(merge(
+                        pointAttr,
+                        radius ? { // new symbol attributes (#507, #612)
+                                x: plotX - radius,
+                                y: plotY - radius,
+                                width: 2 * radius,
+                                height: 2 * radius
+                        } : {}
+                ));
+
+                // Zooming in from a range with no markers to a range with markers
+                if (stateMarkerGraphic) {
+                        stateMarkerGraphic.hide();
+                }
+        } else {
+                // if a graphic is not applied to each point in the normal state, create a shared
+                // graphic for the hover state
+                if (state && markerStateOptions) {
+                        radius = markerStateOptions.radius;
+                        newSymbol = pointMarker.symbol || series.symbol;
+
+                        // If the point has another symbol than the previous one, throw away the
+                        // state marker graphic and force a new one (#1459)
+                        if (stateMarkerGraphic && stateMarkerGraphic.currentSymbol !== newSymbol) {
+                                stateMarkerGraphic = stateMarkerGraphic.destroy();
+                        }
+
+                        // Add a new state marker graphic
+                        if (!stateMarkerGraphic) {
+                                if (newSymbol) {
+                                        series.stateMarkerGraphic = stateMarkerGraphic = chart.renderer.symbol(
+                                                newSymbol,
+                                                plotX - radius,
+                                                plotY - radius,
+                                                2 * radius,
+                                                2 * radius
+                                        )
+                                        .attr(pointAttr)
+                                        .add(series.markerGroup);
+                                        stateMarkerGraphic.currentSymbol = newSymbol;
+                                }
+
+                        // Move the existing graphic
+                        } else {
+                                stateMarkerGraphic[move ? 'animate' : 'attr']({ // #1054
+                                        x: plotX - radius,
+                                        y: plotY - radius
+                                });
+                        }
+                }
+
+                if (stateMarkerGraphic) {
+                        stateMarkerGraphic[state && chart.isInsidePlot(plotX, plotY, chart.inverted) ? 'show' : 'hide'](); // #2450
+                }
+        }
+
+        // Show me your halo
+        haloOptions = stateOptions[state] && stateOptions[state].halo;
+        if (haloOptions && haloOptions.size) {
+                if (!halo) {
+                        series.halo = halo = chart.renderer.path()
+                                .add(series.seriesGroup);
+                }
+                halo.attr(extend({
+                        fill: Color(point.color || series.color).setOpacity(haloOptions.opacity).get()
+                }, haloOptions.attributes))[move ? 'animate' : 'attr']({
+                        d: point.haloPath(haloOptions.size)
+                });
+        } else if (halo) {
+                halo.attr({ d: [] });
+        }
+
+        point.state = state;
+},
+
+haloPath: function (size) {
+        var series = this.series,
+                chart = series.chart,
+                plotBox = series.getPlotBox(),
+                inverted = chart.inverted;
+
+        return chart.renderer.symbols.circle(
+                plotBox.translateX + (inverted ? series.yAxis.len - this.plotY : this.plotX) - size, 
+                plotBox.translateY + (inverted ? series.xAxis.len - this.plotX : this.plotY) - size, 
+                size * 2, 
+                size * 2
+        );
+}
+ +

});

+ +

/*

+ +
* Extend the Series object with interaction
+*/
+ +

extend(Series.prototype, {

+ +
/**
+ * Series mouse over handler
+ */
+onMouseOver: function () {
+        var series = this,
+                chart = series.chart,
+                hoverSeries = chart.hoverSeries;
+
+        // set normal state to previous series
+        if (hoverSeries && hoverSeries !== series) {
+                hoverSeries.onMouseOut();
+        }
+
+        // trigger the event, but to save processing time,
+        // only if defined
+        if (series.options.events.mouseOver) {
+                fireEvent(series, 'mouseOver');
+        }
+
+        // hover this
+        series.setState(HOVER_STATE);
+        chart.hoverSeries = series;
+},
+
+/**
+ * Series mouse out handler
+ */
+onMouseOut: function () {
+        // trigger the event only if listeners exist
+        var series = this,
+                options = series.options,
+                chart = series.chart,
+                tooltip = chart.tooltip,
+                hoverPoint = chart.hoverPoint;
+
+        // trigger mouse out on the point, which must be in this series
+        if (hoverPoint) {
+                hoverPoint.onMouseOut();
+        }
+
+        // fire the mouse out event
+        if (series && options.events.mouseOut) {
+                fireEvent(series, 'mouseOut');
+        }
+
+        // hide the tooltip
+        if (tooltip && !options.stickyTracking && (!tooltip.shared || series.noSharedTooltip)) {
+                tooltip.hide();
+        }
+
+        // set normal state
+        series.setState();
+        chart.hoverSeries = null;
+},
+
+/**
+ * Set the state of the graph
+ */
+setState: function (state) {
+        var series = this,
+                options = series.options,
+                graph = series.graph,
+                graphNeg = series.graphNeg,
+                stateOptions = options.states,
+                lineWidth = options.lineWidth,
+                attribs;
+
+        state = state || NORMAL_STATE;
+
+        if (series.state !== state) {
+                series.state = state;
+
+                if (stateOptions[state] && stateOptions[state].enabled === false) {
+                        return;
+                }
+
+                if (state) {
+                        lineWidth = stateOptions[state].lineWidth || lineWidth + 1;
+                }
+
+                if (graph && !graph.dashstyle) { // hover is turned off for dashed lines in VML
+                        attribs = {
+                                'stroke-width': lineWidth
+                        };
+                        // use attr because animate will cause any other animation on the graph to stop
+                        graph.attr(attribs);
+                        if (graphNeg) {
+                                graphNeg.attr(attribs);
+                        }
+                }
+        }
+},
+
+/**
+ * Set the visibility of the graph
+ *
+ * @param vis {Boolean} True to show the series, false to hide. If UNDEFINED,
+ *                              the visibility is toggled.
+ */
+setVisible: function (vis, redraw) {
+        var series = this,
+                chart = series.chart,
+                legendItem = series.legendItem,
+                showOrHide,
+                ignoreHiddenSeries = chart.options.chart.ignoreHiddenSeries,
+                oldVisibility = series.visible;
+
+        // if called without an argument, toggle visibility
+        series.visible = vis = series.userOptions.visible = vis === UNDEFINED ? !oldVisibility : vis;
+        showOrHide = vis ? 'show' : 'hide';
+
+        // show or hide elements
+        each(['group', 'dataLabelsGroup', 'markerGroup', 'tracker'], function (key) {
+                if (series[key]) {
+                        series[key][showOrHide]();
+                }
+        });
+
+        // hide tooltip (#1361)
+        if (chart.hoverSeries === series) {
+                series.onMouseOut();
+        }
+
+        if (legendItem) {
+                chart.legend.colorizeItem(series, vis);
+        }
+
+        // rescale or adapt to resized chart
+        series.isDirty = true;
+        // in a stack, all other series are affected
+        if (series.options.stacking) {
+                each(chart.series, function (otherSeries) {
+                        if (otherSeries.options.stacking && otherSeries.visible) {
+                                otherSeries.isDirty = true;
+                        }
+                });
+        }
+
+        // show or hide linked series
+        each(series.linkedSeries, function (otherSeries) {
+                otherSeries.setVisible(vis, false);
+        });
+
+        if (ignoreHiddenSeries) {
+                chart.isDirtyBox = true;
+        }
+        if (redraw !== false) {
+                chart.redraw();
+        }
+
+        fireEvent(series, showOrHide);
+},
+
+/**
+ * Memorize tooltip texts and positions
+ */
+setTooltipPoints: function (renew) {
+        var series = this,
+                points = [],
+                pointsLength,
+                low,
+                high,
+                xAxis = series.xAxis,
+                xExtremes = xAxis && xAxis.getExtremes(),
+                axisLength = xAxis ? (xAxis.tooltipLen || xAxis.len) : series.chart.plotSizeX, // tooltipLen and tooltipPosName used in polar
+                point,
+                pointX,
+                nextPoint,
+                i,
+                tooltipPoints = []; // a lookup array for each pixel in the x dimension
+
+        // don't waste resources if tracker is disabled
+        if (series.options.enableMouseTracking === false || series.singularTooltips) {
+                return;
+        }
+
+        // renew
+        if (renew) {
+                series.tooltipPoints = null;
+        }
+
+        // concat segments to overcome null values
+        each(series.segments || series.points, function (segment) {
+                points = points.concat(segment);
+        });
+
+        // Reverse the points in case the X axis is reversed
+        if (xAxis && xAxis.reversed) {
+                points = points.reverse();
+        }
+
+        // Polar needs additional shaping
+        if (series.orderTooltipPoints) {
+                series.orderTooltipPoints(points);
+        }
+
+        // Assign each pixel position to the nearest point
+        pointsLength = points.length;
+        for (i = 0; i < pointsLength; i++) {
+                point = points[i];
+                pointX = point.x;
+                if (pointX >= xExtremes.min && pointX <= xExtremes.max) { // #1149
+                        nextPoint = points[i + 1];
+
+                        // Set this range's low to the last range's high plus one
+                        low = high === UNDEFINED ? 0 : high + 1;
+                        // Now find the new high
+                        high = points[i + 1] ?
+                                mathMin(mathMax(0, mathFloor( // #2070
+                                        (point.clientX + (nextPoint ? (nextPoint.wrappedClientX || nextPoint.clientX) : axisLength)) / 2
+                                )), axisLength) :
+                                axisLength;
+
+                        while (low >= 0 && low <= high) {
+                                tooltipPoints[low++] = point;
+                        }
+                }
+        }
+        series.tooltipPoints = tooltipPoints;
+},
+
+/**
+ * Show the graph
+ */
+show: function () {
+        this.setVisible(true);
+},
+
+/**
+ * Hide the graph
+ */
+hide: function () {
+        this.setVisible(false);
+},
+
+/**
+ * Set the selected state of the graph
+ *
+ * @param selected {Boolean} True to select the series, false to unselect. If
+ *                              UNDEFINED, the selection state is toggled.
+ */
+select: function (selected) {
+        var series = this;
+        // if called without an argument, toggle
+        series.selected = selected = (selected === UNDEFINED) ? !series.selected : selected;
+
+        if (series.checkbox) {
+                series.checkbox.checked = selected;
+        }
+
+        fireEvent(series, selected ? 'select' : 'unselect');
+},
+
+drawTracker: TrackerMixin.drawTrackerGraph
+ +

}); // global variables extend(Highcharts, {

+ +
// Constructors
+Axis: Axis,
+Chart: Chart,
+Color: Color,
+Point: Point,
+Tick: Tick,     
+Renderer: Renderer,
+Series: Series,
+SVGElement: SVGElement,
+SVGRenderer: SVGRenderer,
+
+// Various
+arrayMin: arrayMin,
+arrayMax: arrayMax,
+charts: charts,
+dateFormat: dateFormat,
+format: format,
+pathAnim: pathAnim,
+getOptions: getOptions,
+hasBidiBug: hasBidiBug,
+isTouchDevice: isTouchDevice,
+numberFormat: numberFormat,
+seriesTypes: seriesTypes,
+setOptions: setOptions,
+addEvent: addEvent,
+removeEvent: removeEvent,
+createElement: createElement,
+discardElement: discardElement,
+css: css,
+each: each,
+extend: extend,
+map: map,
+merge: merge,
+pick: pick,
+splat: splat,
+extendClass: extendClass,
+pInt: pInt,
+wrap: wrap,
+svg: hasSVG,
+canvas: useCanVG,
+vml: !hasSVG && !useCanVG,
+product: PRODUCT,
+version: VERSION
+ +

});

+ +

}());

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/assets/vendor/javascripts/jquery_filtertable_min_js.html b/doc/tmp/rubycritic/assets/vendor/javascripts/jquery_filtertable_min_js.html new file mode 100644 index 0000000000..4a33b8f6f7 --- /dev/null +++ b/doc/tmp/rubycritic/assets/vendor/javascripts/jquery_filtertable_min_js.html @@ -0,0 +1,1644 @@ + + + + + + + +jquery.filtertable.min.js - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

/**

+ +
* jquery.filterTable
+*
+* This plugin will add a search filter to tables. When typing in the filter,
+* any rows that do not contain the filter will be hidden.
+*
+* Utilizes bindWithDelay() if available. https://github.com/bgrins/bindWithDelay
+*
+* @version v1.5.6
+* @author Sunny Walker, swalker@hawaii.edu
+* @license MIT
+*/
+ +

!function($){var e=$.fn.jquery.split(“.”),t=parseFloat(e),n=parseFloat(e);2>t&&8>n?($.expr[“:”].filterTableFind=function(e,t,n){return $(e).text().toUpperCase().indexOf(n.toUpperCase().replace(/“”“/g,‘”’).replace(/“\”/g,“\”))>=0},$.expr[“:”].filterTableFindAny=function(e,t,n){var i=n.split(/[\s,]/),r=[];return $.each(i,function(e,t){var n=t.replace(/^\s+|\s$/g,“”);n&&r.push(n)}),r.length?function(e){var t=!1;return $.each(r,function(n,i){return $(e).text().toUpperCase().indexOf(i.toUpperCase().replace(/“”“/g,‘”’).replace(/“\”/g,“\”))>=0?(t=!0,!1):void 0}),t}:!1},$.expr[“:”].filterTableFindAll=function(e,t,n){var i=n.split(/[\s,]/),r=[];return $.each(i,function(e,t){var n=t.replace(/^\s+|\s$/g,“”);n&&r.push(n)}),r.length?function(e){var t=0;return $.each(r,function(n,i){$(e).text().toUpperCase().indexOf(i.toUpperCase().replace(/“”“/g,‘”’).replace(/“\”/g,“\”))>=0&&t++}),t===r.length}:!1}):($.expr[“:”].filterTableFind=jQuery.expr.createPseudo(function(e){return function(t){return $(t).text().toUpperCase().indexOf(e.toUpperCase().replace(/“”“/g,‘”’).replace(/“\”/g,“\”))>=0}}),$.expr[“:”].filterTableFindAny=jQuery.expr.createPseudo(function(e){var t=e.split(/[\s,]/),n=[];return $.each(t,function(e,t){var i=t.replace(/^\s+|\s$/g,“”);i&&n.push(i)}),n.length?function(e){var t=!1;return $.each(n,function(n,i){return $(e).text().toUpperCase().indexOf(i.toUpperCase().replace(/“”“/g,‘”’).replace(/“\”/g,“\”))>=0?(t=!0,!1):void 0}),t}:!1}),$.expr[“:”].filterTableFindAll=jQuery.expr.createPseudo(function(e){var t=e.split(/[\s,]/),n=[];return $.each(t,function(e,t){var i=t.replace(/^\s+|\s$/g,“”);i&&n.push(i)}),n.length?function(e){var t=0;return $.each(n,function(n,i){$(e).text().toUpperCase().indexOf(i.toUpperCase().replace(/“”“/g,‘”’).replace(/“\”/g,“\”))>=0&&t++}),t===n.length}:!1})),$.fn.filterTable=function(e){var t={autofocus:!1,callback:null,containerClass:“filter-table”,containerTag:“p”,filterExpression:“filterTableFind”,hideTFootOnFilter:!1,highlightClass:“alt”,ignoreClass:“”,ignoreColumns:[],inputSelector:null,inputName:“”,inputType:“search”,label:“Filter:”,minChars:1,minRows:8,placeholder:“search this table”,preventReturnKey:!0,quickList:[],quickListClass:“quick”,quickListGroupTag:“”,quickListTag:“a”,visibleClass:“visible”},n=function(e){return e.replace(/&/g,“&amp;”).replace(/“/g,”&quot;“).replace(/</g,”&lt;“).replace(/>/g,”&gt;“)},i=$.extend({},t,e),r=function(e,t){var n=e.find(”tbody“);if(”“===t||t.length<i.minChars)n.find(”tr“).show().addClass(i.visibleClass),n.find(”td“).removeClass(i.highlightClass),i.hideTFootOnFilter&&e.find(”tfoot“).show();else{var r=n.find(”td“);if(n.find(”tr“).hide().removeClass(i.visibleClass),r.removeClass(i.highlightClass),i.hideTFootOnFilter&&e.find(”tfoot“).hide(),i.ignoreColumns.length){var a=[];i.ignoreClass&&(r=r.not(”.“+i.ignoreClass)),a=r.filter(”:“i.filterExpression‘(”’t‘“)’),a.each(function(){var e=$(this),t=e.parent().children().index(e);-1===$.inArray(t,i.ignoreColumns)&&e.addClass(i.highlightClass).closest(”tr“).show().addClass(i.visibleClass)})}else i.ignoreClass&&(r=r.not(”.“+i.ignoreClass)),r.filter(”:“i.filterExpression‘(”’t‘“)’).addClass(i.highlightClass).closest(”tr“).show().addClass(i.visibleClass)}i.callback&&i.callback(t,e)};return this.each(function(){var e=$(this),t=e.find(”tbody“),a=null,l=null,s=null,o=!0;”TABLE“===e.nodeName&&t.length>0&&(0===i.minRows||i.minRows>0&&t.find(”tr“).length>=i.minRows)&&!e.prev().hasClass(i.containerClass)&&(i.inputSelector&&1===$(i.inputSelector).length?(s=$(i.inputSelector),a=s.parent(),o=!1):(a=$(”<“i.containerTag” />“),”“!==i.containerClass&&a.addClass(i.containerClass),a.prepend(i.label+” “),s=$(‘<input type=”’i.inputType‘“ placeholder=”’i.placeholder‘“ name=”’i.inputName‘“ />’),i.preventReturnKey&&s.on(”keydown“,function(e){return 13===(e.keyCode||e.which)?(e.preventDefault(),!1):void 0})),i.autofocus&&s.attr(”autofocus“,!0),$.fn.bindWithDelay?s.bindWithDelay(”keyup“,function(){r(e,$(this).val())},200):s.bind(”keyup“,function(){r(e,$(this).val())}),s.bind(”click search input paste blur“,function(){r(e,$(this).val())}),o&&a.append(s),i.quickList.length>0&&(l=i.quickListGroupTag?$(”<“i.quickListGroupTag” />“):a,$.each(i.quickList,function(e,t){var r=$(”<“i.quickListTag‘ class=”’i.quickListClass‘“ />’);r.text(n(t)),”A“===r.nodeName&&r.attr(”href“,”#“),r.bind(”click“,function(e){e.preventDefault(),s.val(t).focus().trigger(”click“)}),l.append®}),l!==a&&a.append(l)),o&&e.before(a))})}}(jQuery);

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/assets/vendor/javascripts/jquery_min_js.html b/doc/tmp/rubycritic/assets/vendor/javascripts/jquery_min_js.html new file mode 100644 index 0000000000..dabace1e40 --- /dev/null +++ b/doc/tmp/rubycritic/assets/vendor/javascripts/jquery_min_js.html @@ -0,0 +1,1630 @@ + + + + + + + +jquery.min.js - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

/*! jQuery v3.1.1 | © jQuery Foundation | jquery.org/license */ !function(a,b){“use strict”;“object”==typeof module&&“object”==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error(“jQuery requires a window with a document”);return b(a)}:b(a)}(“undefined”!=typeof window?window:this,function(a,b){“use strict”;var c=[],d=a.document,e=Object.getPrototypeOf,f=c.slice,g=c.concat,h=c.push,i=c.indexOf,j={},k=j.toString,l=j.hasOwnProperty,m=l.toString,n=m.call(Object),o={};function p(a,b){b=b||d;var c=b.createElement(“script”);c.text=a,b.head.appendChild©.parentNode.removeChild©}var q=“3.1.1”,r=function(a,b){return new r.fn.init(a,b)},s=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,t=/^-ms-/,u=/-([a-z])/g,v=function(a,b){return b.toUpperCase()};r.fn=r.prototype={jquery:q,constructor:r,length:0,toArray:function(){return f.call(this)},get:function(a){return null==a?f.call(this):a<0?this:this},pushStack:function(a){var b=r.merge(this.constructor(),a);return b.prevObject=this,b},each:function(a){return r.each(this,a)},map:function(a){return this.pushStack(r.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(f.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=a(a<0?b:0);return this.pushStack(c>=0&&c<b?[this]:[])},end:function(){return this.prevObject||this.constructor()},push:h,sort:c.sort,splice:c.splice},r.extend=r.fn.extend=function(){var a,b,c,d,e,f,g=arguments||{},h=1,i=arguments.length,j=!1;for(“boolean”==typeof g&&(j=g,g=arguments||{},h++),“object”==typeof g||r.isFunction(g)||(g={}),h===i&&(g=this,h–);h<i;h++)if(null!=(a=arguments))for(b in a)c=g,d=a,g!==d&&(j&&d&&(r.isPlainObject(d)||(e=r.isArray(d)))?(e?(e=!1,f=c&&r.isArray©?c:[]):f=c&&r.isPlainObject©?c:{},g=r.extend(j,f,d)):void 0!==d&&(g=d));return g},r.extend({expando:“jQuery”+(q+Math.random()).replace(/D/g,“”),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return“function”===r.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){var b=r.type(a);return(“number”===b||“string”===b)&&!isNaN(a-parseFloat(a))},isPlainObject:function(a){var b,c;return!(!a||“[object Object]”!==k.call(a))&&(!(b=e(a))||(c=l.call(b,“constructor”)&&b.constructor,“function”==typeof c&&m.call©===n))},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+“”:“object”==typeof a||“function”==typeof a?j||“object”:typeof a},globalEval:function(a){p(a)},camelCase:function(a){return a.replace(t,“ms-”).replace(u,v)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b){var c,d=0;if(w(a)){for(c=a.length;d<c;d++)if(b.call(a,d,a)===!1)break}else for(d in a)if(b.call(a,d,a)===!1)break;return a},trim:function(a){return null==a?“”:(a+“”).replace(s,“”)},makeArray:function(a,b){var c=b||[];return null!=a&&(w(Object(a))?r.merge(c,“string”==typeof a?[a]:a):h.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:i.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;d<c;d++)a=b;return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;f<g;f++)d=!b(a,f),d!==h&&e.push(a);return e},map:function(a,b,c){var d,e,f=0,h=[];if(w(a))for(d=a.length;f<d;f++)e=b(a,f,c),null!=e&&h.push(e);else for(f in a)e=b(a,f,c),null!=e&&h.push(e);return g.apply([],h)},guid:1,proxy:function(a,b){var c,d,e;if(“string”==typeof b&&(c=a,b=a,a=c),r.isFunction(a))return d=f.call(arguments,2),e=function(){return a.apply(b||this,d.concat(f.call(arguments)))},e.guid=a.guid=a.guid||r.guid++,e},now:Date.now,support:o}),“function”==typeof Symbol&&(r.fn[Symbol.iterator]=c),r.each(“Boolean Number String Function Array Date RegExp Object Error Symbol”.split(“ ”),function(a,b){j[“[object ”b“]”]=b.toLowerCase()});function w(a){var b=!!a&&“length”in a&&a.length,c=r.type(a);return“function”!==c&&!r.isWindow(a)&&(“array”===c||0===b||“number”==typeof b&&b>0&&b-1 in a)}var x=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u=“sizzle”+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=function(a,b){for(var c=0,d=a.length;c<d;c++)if(a===b)return c;return-1},J=“checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped”,K=“[\x20\t\r\n\f]”,L=“(?:\\.|[\w-]|[^\0-\xa0])+”,M=“\[”K“*(”L“)(?:”K“*([*^$|!~]?=)”K“*(?:‘((?:\\.|[^\\’])*)‘|\”((?:\\.|[^\\\“])*)\”|(“L”))|)“K”*\]“,N=”:(“L”)(?:\(((’((?:\\.|[^\\‘])*)’|\“((?:\\.|[^\\\”])*)\“)|((?:\\.|[^\\()[\]]|”M“)*)|.*)\)|)”,O=new RegExp(K+“+”,“g”),P=new RegExp(“^”K“+|((?:^|[^\\])(?:\\.)*)”K“+$”,“g”),Q=new RegExp(“^”K“*,”K“*”),R=new RegExp(“^”K“*([>+~]|”K“)”K“*”),S=new RegExp(“=”K“*([^\]‘\”]*?)“K”*\]“,”g“),T=new RegExp(N),U=new RegExp(”^“L”$“),V={ID:new RegExp(”^#(“L”)“),CLASS:new RegExp(”^\.(“L”)“),TAG:new RegExp(”^(“L”|[*])“),ATTR:new RegExp(”^“+M),PSEUDO:new RegExp(”^“+N),CHILD:new RegExp(”^:(only|first|last|nth|nth-last)-(child|of-type)(?:\(“K”*(even|odd|(([+-]|)(\d*)n|)“K”*(?:([+-]|)“K”*(\d+)|))“K”*\)|)“,”i“),bool:new RegExp(”^(?:“J”)$“,”i“),needsContext:new RegExp(”^“K”*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\(“K”*((?:-\d)?\d*)“K”*\)|)(?=[^-]|$)“,”i“)},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+{\s*[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=new RegExp(”\\([\da-f]{1,6}“K”?|(“K”)|.)“,”ig“),aa=function(a,b,c){var d=”0x“+b-65536;return d!==d||c?b:d<0?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ba=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ca=function(a,b){return b?”\0“===a?”\ufffd“:a.slice(0,-1)+”\“+a.charCodeAt(a.length-1).toString(16)+” “:”\“+a},da=function(){m()},ea=ta(function(a){return a.disabled===!0&&(”form“in a||”label“in a)},{dir:”parentNode“,next:”legend“});try{G.apply(D=H.call(v.childNodes),v.childNodes),D.nodeType}catch(fa){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a=b);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s=b&&b.ownerDocument,w=b?b.nodeType:9;if(d=d||[],”string“!=typeof a||!a||1!==w&&9!==w&&11!==w)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==w&&(l=Z.exec(a)))if(f=l){if(9===w){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(s&&(j=s.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(l)return G.apply(d,b.getElementsByTagName(a)),d;if((f=l)&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+” “]&&(!q||!q.test(a))){if(1!==w)s=b,r=a;else if(”object“!==b.nodeName.toLowerCase()){(k=b.getAttribute(”id“))?k=k.replace(ba,ca):b.setAttribute(”id“,k=u),o=g(a),h=o.length;while(h–)o=”#“k” “+sa(o);r=o.join(”,“),s=$.test(a)&&qa(b.parentNode)||b}if®try{return G.apply(d,s.querySelectorAll®),d}catch(x){}finally{k===u&&b.removeAttribute(”id“)}}}return i(a.replace(P,”$1“),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+” “)>d.cacheLength&&delete b,b[c+” “]=e}return b}function ia(a){return a=!0,a}function ja(a){var b=n.createElement(”fieldset“);try{return!!a(b)}catch©{return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split(”|“),e=c.length;while(e–)d.attrHandle[c]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&a.sourceIndex-b.sourceIndex;if(d)return d;if©while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return”input“===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return(”input“===c||”button“===c)&&b.type===a}}function oa(a){return function(b){return”form“in b?b.parentNode&&b.disabled===!1?”label“in b?”label“in b.parentNode?b.parentNode.disabled===a:b.disabled===a:b.isDisabled===a||b.isDisabled!==!a&&ea(b)===a:b.disabled===a:”label“in b&&b.disabled===a}}function pa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g–)c[e=f]&&(c=!(d=c))})})}function qa(a){return a&&”undefined“!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return!!b&&”HTML“!==b.nodeName},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),v!==n&&(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener(”unload“,da,!1):e.attachEvent&&e.attachEvent(”onunload“,da)),c.attributes=ja(function(a){return a.className=”i“,!a.getAttribute(”className“)}),c.getElementsByTagName=ja(function(a){return a.appendChild(n.createComment(”“)),!a.getElementsByTagName(”*“).length}),c.getElementsByClassName=Y.test(n.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){return a.getAttribute(”id“)===b}},d.find.ID=function(a,b){if(”undefined“!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}}):(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){var c=”undefined“!=typeof a.getAttributeNode&&a.getAttributeNode(”id“);return c&&c.value===b}},d.find.ID=function(a,b){if(”undefined“!=typeof b.getElementById&&p){var c,d,e,f=b.getElementById(a);if(f){if(c=f.getAttributeNode(”id“),c&&c.value===a)return;e=b.getElementsByName(a),d=0;while(f=e)if(c=f.getAttributeNode(”id“),c&&c.value===a)return}return[]}}),d.find.TAG=c.getElementsByTagName?function(a,b){return”undefined“!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if(”*“===a){while(c=f)1===c.nodeType&&d.push©;return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){if(”undefined“!=typeof b.getElementsByClassName&&p)return b.getElementsByClassName(a)},r=[],q=[],(c.qsa=Y.test(n.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML=”<a id=’“u”‘></a><select id=’“u”-\r\‘ msallowcapture=”><option selected=”></option></select>“,a.querySelectorAll(”[msallowcapture^=”]“).length&&q.push(”[*^$]=“K”*(?:”|\“\”)“),a.querySelectorAll(”[selected]“).length||q.push(”\[“K”*(?:value|“J”)“),a.querySelectorAll(”[id~=“u”-]“).length||q.push(”~=“),a.querySelectorAll(”:checked“).length||q.push(”:checked“),a.querySelectorAll(”a#“u”+*“).length||q.push(”.#.[~]“)}),ja(function(a){a.innerHTML=”<a href=” disabled=’disabled’></a><select disabled=‘disabled’><option/></select>“;var b=n.createElement(”input“);b.setAttribute(”type“,”hidden“),a.appendChild(b).setAttribute(”name“,”D“),a.querySelectorAll(”[name=d]“).length&&q.push(”name“K[^$|!~]?=“),2!==a.querySelectorAll(”:enabled“).length&&q.push(”:enabled“,”:disabled“),o.appendChild(a).disabled=!0,2!==a.querySelectorAll(”:disabled“).length&&q.push(”:enabled“,”:disabled“),a.querySelectorAll(”*,:x“),q.push(”,.*:“)})),(c.matchesSelector=Y.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,”*“),s.call(a,”[s!=”]:x“),r.push(”!=“,N)}),q=q.length&&new RegExp(q.join(”|“)),r=r.length&&new RegExp(r.join(”|“)),b=Y.test(o.compareDocumentPosition),t=b||Y.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?I(k,a)-I(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?I(k,a)-I(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)g.unshift©;c=b;while(c=c.parentNode)h.unshift©;while(g===h)d++;return d?la(g,h):g===v?-1:h===v?1:0},n):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(S,”=‘$1’]“),c.matchesSelector&&p&&!A[b+” “]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.escape=function(a){return(a+”“).replace(ba,ca)},ga.error=function(a){throw new Error(”Syntax error, unrecognized expression: “+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a)b===a&&(e=d.push(f));while(e–)a.splice(d,1)}return k=null,a},e=ga.getText=function(a){var b,c=”“,d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if(”string“==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a)c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:V,attrHandle:{},find:{},relative:{”>“:{dir:”parentNode“,first:!0},” “:{dir:”parentNode“},”+“:{dir:”previousSibling“,first:!0},”~“:{dir:”previousSibling“}},preFilter:{ATTR:function(a){return a=a.replace(_,aa),a=(a||a||a||”“).replace(_,aa),”~=“===a&&(a=” “a[3]” “),a.slice(0,4)},CHILD:function(a){return a=a.toLowerCase(),”nth“===a.slice(0,3)?(a||ga.error(a),a=+(a?a+(a||1):2*(”even“===a||”odd“===a)),a=+(a+a||”odd“===a)):a&&ga.error(a),a},PSEUDO:function(a){var b,c=!a&&a;return V.CHILD.test(a)?null:(a?a=a||a||”“:c&&T.test©&&(b=g(c,!0))&&(b=c.indexOf(”)“,c.length-b)-c.length)&&(a=a.slice(0,b),a=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(_,aa).toLowerCase();return”*“===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+” “];return b||(b=new RegExp(”(^|“K”)“a”(“K”|$)“))&&y(a,function(a){return b.test(”string“==typeof a.className&&a.className||”undefined“!=typeof a.getAttribute&&a.getAttribute(”class“)||”“)})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?”!=“===b:!b||(e+=”“,”=“===b?e===c:”!=“===b?e!==c:”^=“===b?c&&0===e.indexOf©:”*=“===b?c&&e.indexOf©>-1:”$=“===b?c&&e.slice(-c.length)===c:”~=“===b?(” “+e.replace(O,” “)+” “).indexOf©>-1:”|=“===b&&(e===c||e.slice(0,c.length+1)===c+”-“))}},CHILD:function(a,b,c,d,e){var f=”nth“!==a.slice(0,3),g=”last“!==a.slice(-4),h=”of-type“===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?”nextSibling“:”previousSibling“,q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m)if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p=”only“===a&&!o&&”nextSibling“}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m||(m={}),k=l||(l={}),j=k||[],n=j===w&&j,t=n&&j,m=n&&q.childNodes[n];while(m=++n&&m&&m||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k=[w,n,t];break}}else if(s&&(m=b,l=m||(m={}),k=l||(l={}),j=k||[],n=j===w&&j,t=n),t===!1)while(m=++n&&m&&m||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m||(m={}),k=l||(l={}),k=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error(”unsupported pseudo: “+a);return e?e(b):e.length>1?(c=[a,a,”“,b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g–)d=I(a,f),a=!(c=f)}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(P,”$1“));return d?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h–)(f=g)&&(a=!(b=f))}):function(a,e,f){return b=a,d(b,null,f,c),b=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(_,aa),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return U.test(a||”“)||ga.error(”unsupported lang: “+a),a=a.replace(_,aa).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute(”xml:lang“)||b.getAttribute(”lang“))return c=c.toLowerCase(),c===a||0===c.indexOf(a+”-“);while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:oa(!1),disabled:oa(!0),checked:function(a){var b=a.nodeName.toLowerCase();return”input“===b&&!!a.checked||”option“===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return”input“===b&&”button“===a.type||”button“===b},text:function(a){var b;return”input“===a.nodeName.toLowerCase()&&”text“===a.type&&(null==(b=a.getAttribute(”type“))||”text“===b.toLowerCase())},first:pa(function(){return}),last:pa(function(a,b){return}),eq:pa(function(a,b,c){return}),even:pa(function(a,b){for(var c=0;c<b;c+=2)a.push©;return a}),odd:pa(function(a,b){for(var c=1;c<b;c+=2)a.push©;return a}),lt:pa(function(a,b,c){for(var d=c<0?c+b:c;–d>=0;)a.push(d);return a}),gt:pa(function(a,b,c){for(var d=c<0?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=ma(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=na(b);function ra(){}ra.prototype=d.filters=d.pseudos,d.setFilters=new ra,g=ga.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+” “];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){c&&!(e=Q.exec(h))||(e&&(h=h.slice(e.length)||h),i.push(f=[])),c=!1,(e=R.exec(h))&&(c=e.shift(),f.push({value:c,type:e.replace(P,” “)}),h=h.slice(c.length));for(g in d.filter)!(e=V.exec(h))||j&&!(e=j(e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?ga.error(a):z(a,i).slice(0)};function sa(a){for(var b=0,c=a.length,d=”“;b<c;b++)d+=a.value;return d}function ta(a,b,c){var d=b.dir,e=b.next,f=e||d,g=c&&”parentNode“===f,h=x++;return b.first?function(b,c,e){while(b=b)if(1===b.nodeType||g)return a(b,c,e);return!1}:function(b,c,i){var j,k,l,m=[w,h];if(i){while(b=b)if((1===b.nodeType||g)&&a(b,c,i))return!0}else while(b=b)if(1===b.nodeType||g)if(l=b||(b={}),k=l||(l={}),e&&e===b.nodeName.toLowerCase())b=b||b;else{if((j=k)&&j===w&&j===h)return m=j;if(k=m,m=a(b,c,i))return!0}return!1}}function ua(a){return a.length>1?function(b,c,d){var e=a.length;while(e–)if(!a(b,c,d))return!1;return!0}:a}function va(a,b,c){for(var d=0,e=b.length;d<e;d++)ga(a,b,c);return c}function wa(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;h<i;h++)(f=a)&&(c&&!c(f,d,e)||(g.push(f),j&&b.push(h)));return g}function xa(a,b,c,d,e,f){return d&&!d&&(d=xa(d)),e&&!e&&(e=xa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||va(b||”*“,h.nodeType?[h]:h,[]),q=!a||!f&&b?p:wa(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=wa(r,n),d(j,[],h,i),k=j.length;while(k–)(l=j)&&(r[n]=!(q[n]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k–)(l=r)&&j.push(q=l);e(null,r=[],j,i)}k=r.length;while(k–)(l=r)&&(j=e?I(f,l):m)>-1&&(f=!(g=l))}}else r=wa(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ya(a){for(var b,c,e,f=a.length,g=d.relative[a.type],h=g||d.relative[” “],i=g?1:0,k=ta(function(a){return a===b},h,!0),l=ta(function(a){return I(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];i<f;i++)if(c=d.relative[a.type])m=[ta(ua(m),c)];else{if(c=d.filter[a.type].apply(null,a.matches),c){for(e=++i;e<f;e++)if(d.relative[a.type])break;return xa(i>1&&ua(m),i>1&&sa(a.slice(0,i-1).concat({value:” “===a.type?”*“:”“})).replace(P,”$1“),c,i<e&&ya(a.slice(i,e)),e<f&&ya(a=a.slice(e)),e<f&&sa(a))}m.push©}return ua(m)}function za(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s=”0“,t=f&&[],u=[],v=j,x=f||e&&d.find.TAG(”*“,k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a)if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r–,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b)q(t,u,g,h);if(f){if(r>0)while(s–)t||u||(u=E.call(i));u=wa(u)}G.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&ga.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+” “];if(!f){b||(b=g(a)),c=b.length;while(c–)f=ya(b),f?d.push(f):e.push(f);f=A(a,za(e,d)),f.selector=a}return f},i=ga.select=function(a,b,c,e){var f,i,j,k,l,m=”function“==typeof a&&a,n=!e&&g(a=m.selector||a);if(c=c||[],1===n.length){if(i=n=n.slice(0),i.length>2&&”ID“===(j=i).type&&9===b.nodeType&&p&&d.relative[i.type]){if(b=(d.find.ID(j.matches[0].replace(_,aa),b)||[])[0],!b)return c;m&&(b=b.parentNode),a=a.slice(i.shift().value.length)}f=V.needsContext.test(a)?0:i.length;while(f–){if(j=i,d.relative[k=j.type])break;if((l=d.find[k])&&(e=l(j.matches[0].replace(_,aa),$.test(i.type)&&qa(b.parentNode)||b))){if(i.splice(f,1),a=e.length&&sa(i),!a)return G.apply(c,e),c;break}}}return(m||h(a,n))(e,b,!p,c,!b||$.test(a)&&qa(b.parentNode)||b),c},c.sortStable=u.split(”“).sort(B).join(”“)===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement(”fieldset“))}),ja(function(a){return a.innerHTML=”<a href=‘#’></a>“,”#“===a.firstChild.getAttribute(”href“)})||ka(”type|href|height|width“,function(a,b,c){if(!c)return a.getAttribute(b,”type“===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML=”<input/>“,a.firstChild.setAttribute(”value“,”“),”“===a.firstChild.getAttribute(”value“)})||ka(”value“,function(a,b,c){if(!c&&”input“===a.nodeName.toLowerCase())return a.defaultValue}),ja(function(a){return null==a.getAttribute(”disabled“)})||ka(J,function(a,b,c){var d;if(!c)return a===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);r.find=x,r.expr=x.selectors,r.expr[”:“]=r.expr.pseudos,r.uniqueSort=r.unique=x.uniqueSort,r.text=x.getText,r.isXMLDoc=x.isXML,r.contains=x.contains,r.escapeSelector=x.escape;var y=function(a,b,c){var d=[],e=void 0!==c;while((a=a)&&9!==a.nodeType)if(1===a.nodeType){if(e&&r(a).is©)break;d.push(a)}return d},z=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},A=r.expr.match.needsContext,B=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i,C=/^.[^:#[\.,]*$/;function D(a,b,c){return r.isFunction(b)?r.grep(a,function(a,d){return!!b.call(a,d,a)!==c}):b.nodeType?r.grep(a,function(a){return a===b!==c}):”string“!=typeof b?r.grep(a,function(a){return i.call(b,a)>-1!==c}):C.test(b)?r.filter(b,a,c):(b=r.filter(b,a),r.grep(a,function(a){return i.call(b,a)>-1!==c&&1===a.nodeType}))}r.filter=function(a,b,c){var d=b;return c&&(a=”:not(“a”)“),1===b.length&&1===d.nodeType?r.find.matchesSelector(d,a)?[d]:[]:r.find.matches(a,r.grep(b,function(a){return 1===a.nodeType}))},r.fn.extend({find:function(a){var b,c,d=this.length,e=this;if(”string“!=typeof a)return this.pushStack(r(a).filter(function(){for(b=0;b<d;b++)if(r.contains(e,this))return!0}));for(c=this.pushStack([]),b=0;b<d;b++)r.find(a,e,c);return d>1?r.uniqueSort©:c},filter:function(a){return this.pushStack(D(this,a||[],!1))},not:function(a){return this.pushStack(D(this,a||[],!0))},is:function(a){return!!D(this,”string“==typeof a&&A.test(a)?r(a):a||[],!1).length}});var E,F=/^(?:\s*(<[\wW]+>)[^>]*|#([\w-]+))$/,G=r.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||E,”string“==typeof a){if(e=”<“===a&&”>“===a&&a.length>=3?[null,a,null]:F.exec(a),!e||!e&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e){if(b=b instanceof r?b:b,r.merge(this,r.parseHTML(e,b&&b.nodeType?b.ownerDocument||b:d,!0)),B.test(e)&&r.isPlainObject(b))for(e in b)r.isFunction(this)?this(b):this.attr(e,b);return this}return f=d.getElementById(e),f&&(this=f,this.length=1),this}return a.nodeType?(this=a,this.length=1,this):r.isFunction(a)?void 0!==c.ready?c.ready(a):a®:r.makeArray(a,this)};G.prototype=r.fn,E=r(d);var H=/^(?:parents|prev(?:Until|All))/,I={children:!0,contents:!0,next:!0,prev:!0};r.fn.extend({has:function(a){var b=r(a,this),c=b.length;return this.filter(function(){for(var a=0;a<c;a++)if(r.contains(this,b))return!0})},closest:function(a,b){var c,d=0,e=this.length,f=[],g=”string“!=typeof a&&r(a);if(!A.test(a))for(;d<e;d++)for(c=this;c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index©>-1:1===c.nodeType&&r.find.matchesSelector(c,a))){f.push©;break}return this.pushStack(f.length>1?r.uniqueSort(f):f)},index:function(a){return a?”string“==typeof a?i.call(r(a),this):i.call(this,a.jquery?a:a):this&&this.parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(r.uniqueSort(r.merge(this.get(),r(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function J(a,b){while((a=a)&&1!==a.nodeType);return a}r.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return y(a,”parentNode“)},parentsUntil:function(a,b,c){return y(a,”parentNode“,c)},next:function(a){return J(a,”nextSibling“)},prev:function(a){return J(a,”previousSibling“)},nextAll:function(a){return y(a,”nextSibling“)},prevAll:function(a){return y(a,”previousSibling“)},nextUntil:function(a,b,c){return y(a,”nextSibling“,c)},prevUntil:function(a,b,c){return y(a,”previousSibling“,c)},siblings:function(a){return z((a.parentNode||{}).firstChild,a)},children:function(a){return z(a.firstChild)},contents:function(a){return a.contentDocument||r.merge([],a.childNodes)}},function(a,b){r.fn[a]=function(c,d){var e=r.map(this,b,c);return”Until“!==a.slice(-5)&&(d=c),d&&”string“==typeof d&&(e=r.filter(d,e)),this.length>1&&(I||r.uniqueSort(e),H.test(a)&&e.reverse()),this.pushStack(e)}});var K=/[^\x20\t\r\n\f]+/g;function L(a){var b={};return r.each(a.match(K)||[],function(a,c){b=!0}),b}r.Callbacks=function(a){a=”string“==typeof a?L(a):r.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h<f.length)f.apply(c,c)===!1&&a.stopOnFalse&&(h=f.length,c=!1)}a.memory||(c=!1),b=!1,e&&(f=c?[]:”“)},j={add:function(){return f&&(c&&!b&&(h=f.length-1,g.push©),function d(b){r.each(b,function(b,c){r.isFunction©?a.unique&&j.has©||f.push©:c&&c.length&&”string“!==r.type©&&d©})}(arguments),c&&!b&&i()),this},remove:function(){return r.each(arguments,function(a,b){var c;while((c=r.inArray(b,f,c))>-1)f.splice(c,1),c<=h&&h–}),this},has:function(a){return a?r.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c=”“,this},disabled:function(){return!f},lock:function(){return e=g=[],c||b||(f=c=”“),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push©,b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j};function M(a){return a}function N(a){throw a}function O(a,b,c){var d;try{a&&r.isFunction(d=a.promise)?d.call(a).done(b).fail©:a&&r.isFunction(d=a.then)?d.call(a,b,c):b.call(void 0,a)}catch(a){c.call(void 0,a)}}r.extend({Deferred:function(b){var c=[[”notify“,”progress“,r.Callbacks(”memory“),r.Callbacks(”memory“),2],[”resolve“,”done“,r.Callbacks(”once memory“),r.Callbacks(”once memory“),0,”resolved“],[”reject“,”fail“,r.Callbacks(”once memory“),r.Callbacks(”once memory“),1,”rejected“]],d=”pending“,e={state:function(){return d},always:function(){return f.done(arguments).fail(arguments),this},”catch“:function(a){return e.then(null,a)},pipe:function(){var a=arguments;return r.Deferred(function(b){r.each(c,function(c,d){var e=r.isFunction(a[d])&&a[d];f[d](function(){var a=e&&e.apply(this,arguments);a&&r.isFunction(a.promise)?a.promise().progress(b.notify).done(b.resolve).fail(b.reject):b[d+”With“](this,e?[a]:arguments)})}),a=null}).promise()},then:function(b,d,e){var f=0;function g(b,c,d,e){return function(){var h=this,i=arguments,j=function(){var a,j;if(!(b<f)){if(a=d.apply(h,i),a===c.promise())throw new TypeError(”Thenable self-resolution“);j=a&&(”object“==typeof a||”function“==typeof a)&&a.then,r.isFunction(j)?e?j.call(a,g(f,c,M,e),g(f,c,N,e)):(f++,j.call(a,g(f,c,M,e),g(f,c,N,e),g(f,c,M,c.notifyWith))):(d!==M&&(h=void 0,i=[a]),(e||c.resolveWith)(h,i))}},k=e?j:function(){try{j()}catch(a){r.Deferred.exceptionHook&&r.Deferred.exceptionHook(a,k.stackTrace),b+1>=f&&(d!==N&&(h=void 0,i=[a]),c.rejectWith(h,i))}};b?k():(r.Deferred.getStackHook&&(k.stackTrace=r.Deferred.getStackHook()),a.setTimeout(k))}}return r.Deferred(function(a){c[3].add(g(0,a,r.isFunction(e)?e:M,a.notifyWith)),c[3].add(g(0,a,r.isFunction(b)?b:M)),c[3].add(g(0,a,r.isFunction(d)?d:N))}).promise()},promise:function(a){return null!=a?r.extend(a,e):e}},f={};return r.each(c,function(a,b){var g=b,h=b;e[b]=g.add,h&&g.add(function(){d=h},c[2].disable,c[2].lock),g.add(b.fire),f[b]=function(){return f[b+”With“](this===f?void 0:this,arguments),this},f[b+”With“]=g.fireWith}),e.promise(f),b&&b.call(f,f),f},when:function(a){var b=arguments.length,c=b,d=Array©,e=f.call(arguments),g=r.Deferred(),h=function(a){return function©{d=this,e=arguments.length>1?f.call(arguments):c,–b||g.resolveWith(d,e)}};if(b<=1&&(O(a,g.done(h©).resolve,g.reject),”pending“===g.state()||r.isFunction(e&&e.then)))return g.then();while(c–)O(e,h©,g.reject);return g.promise()}});var P=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;r.Deferred.exceptionHook=function(b,c){a.console&&a.console.warn&&b&&P.test(b.name)&&a.console.warn(”jQuery.Deferred exception: “+b.message,b.stack,c)},r.readyException=function(b){a.setTimeout(function(){throw b})};var Q=r.Deferred();r.fn.ready=function(a){return Q.then(a)[”catch“](function(a){r.readyException(a)}),this},r.extend({isReady:!1,readyWait:1,holdReady:function(a){a?r.readyWait++:r.ready(!0)},ready:function(a){(a===!0?–r.readyWait:r.isReady)||(r.isReady=!0,a!==!0&&–r.readyWait>0||Q.resolveWith(d,[r]))}}),r.ready.then=Q.then;function R(){d.removeEventListener(”DOMContentLoaded“,R), a.removeEventListener(”load“,R),r.ready()}”complete“===d.readyState||”loading“!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(r.ready):(d.addEventListener(”DOMContentLoaded“,R),a.addEventListener(”load“,R));var S=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if(”object“===r.type©){e=!0;for(h in c)S(a,b,h,c,!0,f,g)}else if(void 0!==d&&(e=!0,r.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(r(a),c)})),b))for(;h<i;h++)b(a,c,g?d:d.call(a,h,b(a,c)));return e?a:j?b.call(a):i?b(a,c):f},T=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function U(){this.expando=r.expando+U.uid++}U.uid=1,U.prototype={cache:function(a){var b=a;return b||(b={},T(a)&&(a.nodeType?a=b:Object.defineProperty(a,this.expando,{value:b,configurable:!0}))),b},set:function(a,b,c){var d,e=this.cache(a);if(”string“==typeof b)e=c;else for(d in b)e=b;return e},get:function(a,b){return void 0===b?this.cache(a):a&&a[r.camelCase(b)]},access:function(a,b,c){return void 0===b||b&&”string“==typeof b&&void 0===c?this.get(a,b):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d=a;if(void 0!==d){if(void 0!==b){r.isArray(b)?b=b.map(r.camelCase):(b=r.camelCase(b),b=b in d?[b]:b.match(K)||[]),c=b.length;while(c–)delete d[b]}(void 0===b||r.isEmptyObject(d))&&(a.nodeType?a=void 0:delete a)}},hasData:function(a){var b=a;return void 0!==b&&!r.isEmptyObject(b)}};var V=new U,W=new U,X=/^(?:{[\wW]*}|[[\wW]*])$/,Y=/[A-Z]/g;function Z(a){return”true“===a||”false“!==a&&(”null“===a?null:a===a”“?+a:X.test(a)?JSON.parse(a):a)}function $(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d=”data-“+b.replace(Y,”-$&“).toLowerCase(),c=a.getAttribute(d),”string“==typeof c){try{c=Z©}catch(e){}W.set(a,b,c)}else c=void 0;return c}r.extend({hasData:function(a){return W.hasData(a)||V.hasData(a)},data:function(a,b,c){return W.access(a,b,c)},removeData:function(a,b){W.remove(a,b)},_data:function(a,b,c){return V.access(a,b,c)},_removeData:function(a,b){V.remove(a,b)}}),r.fn.extend({data:function(a,b){var c,d,e,f=this,g=f&&f.attributes;if(void 0===a){if(this.length&&(e=W.get(f),1===f.nodeType&&!V.get(f,”hasDataAttrs“))){c=g.length;while(c–)g&&(d=g.name,0===d.indexOf(”data-“)&&(d=r.camelCase(d.slice(5)),$(f,d,e)));V.set(f,”hasDataAttrs“,!0)}return e}return”object“==typeof a?this.each(function(){W.set(this,a)}):S(this,function(b){var c;if(f&&void 0===b){if(c=W.get(f,a),void 0!==c)return c;if(c=$(f,a),void 0!==c)return c}else this.each(function(){W.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){W.remove(this,a)})}}),r.extend({queue:function(a,b,c){var d;if(a)return b=(b||”fx“)+”queue“,d=V.get(a,b),c&&(!d||r.isArray©?d=V.access(a,b,r.makeArray©):d.push©),d||[]},dequeue:function(a,b){b=b||”fx“;var c=r.queue(a,b),d=c.length,e=c.shift(),f=r._queueHooks(a,b),g=function(){r.dequeue(a,b)};”inprogress“===e&&(e=c.shift(),d–),e&&(”fx“===b&&c.unshift(”inprogress“),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+”queueHooks“;return V.get(a,c)||V.access(a,c,{empty:r.Callbacks(”once memory“).add(function(){V.remove(a,[b+”queue“,c])})})}}),r.fn.extend({queue:function(a,b){var c=2;return”string“!=typeof a&&(b=a,a=”fx“,c–),arguments.length<c?r.queue(this,a):void 0===b?this:this.each(function(){var c=r.queue(this,a,b);r._queueHooks(this,a),”fx“===a&&”inprogress“!==c&&r.dequeue(this,a)})},dequeue:function(a){return this.each(function(){r.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||”fx“,[])},promise:function(a,b){var c,d=1,e=r.Deferred(),f=this,g=this.length,h=function(){–d||e.resolveWith(f,[f])};”string“!=typeof a&&(b=a,a=void 0),a=a||”fx“;while(g–)c=V.get(f,a+”queueHooks“),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var _=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,aa=new RegExp(”^(?:([+-])=|)(“_”)([a-z%]*)$“,”i“),ba=[”Top“,”Right“,”Bottom“,”Left“],ca=function(a,b){return a=b||a,”none“===a.style.display||”“===a.style.display&&r.contains(a.ownerDocument,a)&&”none“===r.css(a,”display“)},da=function(a,b,c,d){var e,f,g={};for(f in b)g=a.style[f],a.style[f]=b;e=c.apply(a,d||[]);for(f in b)a.style[f]=g;return e};function ea(a,b,c,d){var e,f=1,g=20,h=d?function(){return d.cur()}:function(){return r.css(a,b,”“)},i=h(),j=c&&c||(r.cssNumber[b]?”“:”px“),k=(r.cssNumber[b]||”px“!==j&&+i)&&aa.exec(r.css(a,b));if(k&&k!==j){j=j||k,c=c||[],k=+i||1;do f=f||”.5“,k/=f,r.style(a,b,k+j);while(f!==(f=h()/i)&&1!==f&&–g)}return c&&(k=+k||+i||0,e=c?k+(c+1)*c:+c,d&&(d.unit=j,d.start=k,d.end=e)),e}var fa={};function ga(a){var b,c=a.ownerDocument,d=a.nodeName,e=fa;return e?e:(b=c.body.appendChild(c.createElement(d)),e=r.css(b,”display“),b.parentNode.removeChild(b),”none“===e&&(e=”block“),fa=e,e)}function ha(a,b){for(var c,d,e=[],f=0,g=a.length;f<g;f++)d=a,d.style&&(c=d.style.display,b?(”none“===c&&(e=V.get(d,”display“)||null,e||(d.style.display=”“)),”“===d.style.display&&ca(d)&&(e=ga(d))):”none“!==c&&(e=”none“,V.set(d,”display“,c)));for(f=0;f<g;f++)null!=e&&(a.style.display=e);return a}r.fn.extend({show:function(){return ha(this,!0)},hide:function(){return ha(this)},toggle:function(a){return”boolean“==typeof a?a?this.show():this.hide():this.each(function(){ca(this)?r(this).show():r(this).hide()})}});var ia=/^(?:checkbox|radio)$/i,ja=/<([a-z][^\/\0>\x20\t\r\n\f]+)/i,ka=/^$|\/(?:java|ecma)script/i,la={option:[1,”<select multiple=‘multiple’>“,”</select>“],thead:[1,”<table>“,”</table>“],col:[2,”<table><colgroup>“,”</colgroup></table>“],tr:[2,”<table><tbody>“,”</tbody></table>“],td:[3,”<table><tbody><tr>“,”</tr></tbody></table>“],_default:[0,”“,”“]};la.optgroup=la.option,la.tbody=la.tfoot=la.colgroup=la.caption=la.thead,la.th=la.td;function ma(a,b){var c;return c=”undefined“!=typeof a.getElementsByTagName?a.getElementsByTagName(b||”*“):”undefined“!=typeof a.querySelectorAll?a.querySelectorAll(b||”*“):[],void 0===b||b&&r.nodeName(a,b)?r.merge([a],c):c}function na(a,b){for(var c=0,d=a.length;c<d;c++)V.set(a,”globalEval“,!b||V.get(b,”globalEval“))}var oa=/<|&#?\w+;/;function pa(a,b,c,d,e){for(var f,g,h,i,j,k,l=b.createDocumentFragment(),m=[],n=0,o=a.length;n<o;n++)if(f=a,f||0===f)if(”object“===r.type(f))r.merge(m,f.nodeType?[f]:f);else if(oa.test(f)){g=g||l.appendChild(b.createElement(”div“)),h=(ja.exec(f)||[”“,”“])[1].toLowerCase(),i=la||la._default,g.innerHTML=i+r.htmlPrefilter(f)+i,k=i;while(k–)g=g.lastChild;r.merge(m,g.childNodes),g=l.firstChild,g.textContent=”“}else m.push(b.createTextNode(f));l.textContent=”“,n=0;while(f=m)if(d&&r.inArray(f,d)>-1)e&&e.push(f);else if(j=r.contains(f.ownerDocument,f),g=ma(l.appendChild(f),”script“),j&&na(g),c){k=0;while(f=g)ka.test(f.type||”“)&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement(”div“)),c=d.createElement(”input“);c.setAttribute(”type“,”radio“),c.setAttribute(”checked“,”checked“),c.setAttribute(”name“,”t“),b.appendChild©,o.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML=”<textarea>x</textarea>“,o.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var qa=d.documentElement,ra=/^key/,sa=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,ta=/^([^.]*)(?:\.(.+)|)/;function ua(){return!0}function va(){return!1}function wa(){try{return d.activeElement}catch(a){}}function xa(a,b,c,d,e,f){var g,h;if(”object“==typeof b){”string“!=typeof c&&(d=d||c,c=void 0);for(h in b)xa(a,h,c,d,b,f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&(”string“==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=va;else if(!e)return a;return 1===f&&(g=e,e=function(a){return r().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=r.guid++)),a.each(function(){r.event.add(this,b,e,d,c)})}r.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=V.get(a);if(q){c.handler&&(f=c,c=f.handler,e=f.selector),e&&r.find.matchesSelector(qa,e),c.guid||(c.guid=r.guid++),(i=q.events)||(i=q.events={}),(g=q.handle)||(g=q.handle=function(b){return”undefined“!=typeof r&&r.event.triggered!==b.type?r.event.dispatch.apply(a,arguments):void 0}),b=(b||”“).match(K)||[”“],j=b.length;while(j–)h=ta.exec(b)||[],n=p=h,o=(h||”“).split(”.“).sort(),n&&(l=r.event.special[n]||{},n=(e?l.delegateType:l.bindType)||n,l=r.event.special[n]||{},k=r.extend({type:n,origType:p,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&r.expr.match.needsContext.test(e),namespace:o.join(”.“)},f),(m=i)||(m=i=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,o,g)!==!1||a.addEventListener&&a.addEventListener(n,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),r.event.global[n]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=V.hasData(a)&&V.get(a);if(q&&(i=q.events)){b=(b||”“).match(K)||[”“],j=b.length;while(j–)if(h=ta.exec(b)||[],n=p=h,o=(h||”“).split(”.“).sort(),n){l=r.event.special[n]||{},n=(d?l.delegateType:l.bindType)||n,m=i||[],h=h&&new RegExp(”(^|\.)“+o.join(”\.(?:.*\.|)“)+”(\.|$)“),g=f=m.length;while(f–)k=m,!e&&p!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&(”**“!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount–,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,o,q.handle)!==!1||r.removeEvent(a,n,q.handle),delete i)}else for(n in i)r.event.remove(a,n+b,c,d,!0);r.isEmptyObject(i)&&V.remove(a,”handle events“)}},dispatch:function(a){var b=r.event.fix(a),c,d,e,f,g,h,i=new Array(arguments.length),j=(V.get(this,”events“)||{})[b.type]||[],k=r.event.special[b.type]||{};for(i=b,c=1;c<arguments.length;c++)i=arguments;if(b.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,b)!==!1){h=r.event.handlers.call(this,b,j),c=0;while((f=h)&&!b.isPropagationStopped()){b.currentTarget=f.elem,d=0;while((g=f.handlers[d++])&&!b.isImmediatePropagationStopped())b.rnamespace&&!b.rnamespace.test(g.namespace)||(b.handleObj=g,b.data=g.data,e=((r.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==e&&(b.result=e)===!1&&(b.preventDefault(),b.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,b),b.result}},handlers:function(a,b){var c,d,e,f,g,h=[],i=b.delegateCount,j=a.target;if(i&&j.nodeType&&!(”click“===a.type&&a.button>=1))for(;j!==this;j=j.parentNode||this)if(1===j.nodeType&&(”click“!==a.type||j.disabled!==!0)){for(f=[],g={},c=0;c<i;c++)d=b,e=d.selector+” “,void 0===g&&(g=d.needsContext?r(e,this).index(j)>-1:r.find(e,this,null,[j]).length),g&&f.push(d);f.length&&h.push({elem:j,handlers:f})}return j=this,i<b.length&&h.push({elem:j,handlers:b.slice(i)}),h},addProp:function(a,b){Object.defineProperty(r.Event.prototype,a,{enumerable:!0,configurable:!0,get:r.isFunction(b)?function(){if(this.originalEvent)return b(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[a]},set:function(b){Object.defineProperty(this,a,{enumerable:!0,configurable:!0,writable:!0,value:b})}})},fix:function(a){return a?a:new r.Event(a)},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==wa()&&this.focus)return this.focus(),!1},delegateType:”focusin“},blur:{trigger:function(){if(this===wa()&&this.blur)return this.blur(),!1},delegateType:”focusout“},click:{trigger:function(){if(”checkbox“===this.type&&this.click&&r.nodeName(this,”input“))return this.click(),!1},_default:function(a){return r.nodeName(a.target,”a“)}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}}},r.removeEvent=function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c)},r.Event=function(a,b){return this instanceof r.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?ua:va,this.target=a.target&&3===a.target.nodeType?a.target.parentNode:a.target,this.currentTarget=a.currentTarget,this.relatedTarget=a.relatedTarget):this.type=a,b&&r.extend(this,b),this.timeStamp=a&&a.timeStamp||r.now(),void(this=!0)):new r.Event(a,b)},r.Event.prototype={constructor:r.Event,isDefaultPrevented:va,isPropagationStopped:va,isImmediatePropagationStopped:va,isSimulated:!1,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=ua,a&&!this.isSimulated&&a.preventDefault()},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=ua,a&&!this.isSimulated&&a.stopPropagation()},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=ua,a&&!this.isSimulated&&a.stopImmediatePropagation(),this.stopPropagation()}},r.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,”char“:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:function(a){var b=a.button;return null==a.which&&ra.test(a.type)?null!=a.charCode?a.charCode:a.keyCode:!a.which&&void 0!==b&&sa.test(a.type)?1&b?1:2&b?3:4&b?2:0:a.which}},r.event.addProp),r.each({mouseenter:”mouseover“,mouseleave:”mouseout“,pointerenter:”pointerover“,pointerleave:”pointerout“},function(a,b){r.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return e&&(e===d||r.contains(d,e))||(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),r.fn.extend({on:function(a,b,c,d){return xa(this,a,b,c,d)},one:function(a,b,c,d){return xa(this,a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,r(a.delegateTarget).off(d.namespace?d.origType+”.“+d.namespace:d.origType,d.selector,d.handler),this;if(”object“==typeof a){for(e in a)this.off(e,b,a);return this}return b!==!1&&”function“!=typeof b||(c=b,b=void 0),c===!1&&(c=va),this.each(function(){r.event.remove(this,a,c,b)})}});var ya=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,za=/<script|<style|<link/i,Aa=/checked\s*(?:[^=]|=\s*.checked.)/i,Ba=/^true\/(.*)/,Ca=/^\s*<!(?:[CDATA[|–)|(?:]]|–)>\s*$/g;function Da(a,b){return r.nodeName(a,”table“)&&r.nodeName(11!==b.nodeType?b:b.firstChild,”tr“)?a.getElementsByTagName(”tbody“)[0]||a:a}function Ea(a){return a.type=(null!==a.getAttribute(”type“))+”/“+a.type,a}function Fa(a){var b=Ba.exec(a.type);return b?a.type=b:a.removeAttribute(”type“),a}function Ga(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(V.hasData(a)&&(f=V.access(a),g=V.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j.length;c<d;c++)r.event.add(b,e,j[c])}W.hasData(a)&&(h=W.access(a),i=r.extend({},h),W.set(b,i))}}function Ha(a,b){var c=b.nodeName.toLowerCase();”input“===c&&ia.test(a.type)?b.checked=a.checked:”input“!==c&&”textarea“!==c||(b.defaultValue=a.defaultValue)}function Ia(a,b,c,d){b=g.apply([],b);var e,f,h,i,j,k,l=0,m=a.length,n=m-1,q=b,s=r.isFunction(q);if(s||m>1&&”string“==typeof q&&!o.checkClone&&Aa.test(q))return a.each(function(e){var f=a.eq(e);s&&(b=q.call(this,e,f.html())),Ia(f,b,c,d)});if(m&&(e=pa(b,a.ownerDocument,!1,a,d),f=e.firstChild,1===e.childNodes.length&&(e=f),f||d)){for(h=r.map(ma(e,”script“),Ea),i=h.length;l<m;l++)j=e,l!==n&&(j=r.clone(j,!0,!0),i&&r.merge(h,ma(j,”script“))),c.call(a,j,l);if(i)for(k=h.ownerDocument,r.map(h,Fa),l=0;l<i;l++)j=h,ka.test(j.type||”“)&&!V.access(j,”globalEval“)&&r.contains(k,j)&&(j.src?r._evalUrl&&r._evalUrl(j.src):p(j.textContent.replace(Ca,”“),k))}return a}function Ja(a,b,c){for(var d,e=b?r.filter(b,a):a,f=0;null!=(d=e);f++)c||1!==d.nodeType||r.cleanData(ma(d)),d.parentNode&&(c&&r.contains(d.ownerDocument,d)&&na(ma(d,”script“)),d.parentNode.removeChild(d));return a}r.extend({htmlPrefilter:function(a){return a.replace(ya,”<$1></$2>“)},clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=r.contains(a.ownerDocument,a);if(!(o.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||r.isXMLDoc(a)))for(g=ma(h),f=ma(a),d=0,e=f.length;d<e;d++)Ha(f,g);if(b)if©for(f=f||ma(a),g=g||ma(h),d=0,e=f.length;d<e;d++)Ga(f,g);else Ga(a,h);return g=ma(h,”script“),g.length>0&&na(g,!i&&ma(a,”script“)),h},cleanData:function(a){for(var b,c,d,e=r.event.special,f=0;void 0!==(c=a);f++)if(T©){if(b=c){if(b.events)for(d in b.events)e?r.event.remove(c,d):r.removeEvent(c,d,b.handle);c=void 0}c&&(c=void 0)}}}),r.fn.extend({detach:function(a){return Ja(this,a,!0)},remove:function(a){return Ja(this,a)},text:function(a){return S(this,function(a){return void 0===a?r.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=a)})},null,a,arguments.length)},append:function(){return Ia(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Da(this,a);b.appendChild(a)}})},prepend:function(){return Ia(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Da(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ia(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ia(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this);b++)1===a.nodeType&&(r.cleanData(ma(a,!1)),a.textContent=”“);return this},clone:function(a,b){return a=null!=a&&a,b=null==b?a:b,this.map(function(){return r.clone(this,a,b)})},html:function(a){return S(this,function(a){var b=this||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if(”string“==typeof a&&!za.test(a)&&!la[(ja.exec(a)||[”“,”“])[1].toLowerCase()]){a=r.htmlPrefilter(a);try{for(;c<d;c++)b=this||{},1===b.nodeType&&(r.cleanData(ma(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=[];return Ia(this,arguments,function(b){var c=this.parentNode;r.inArray(this,a)<0&&(r.cleanData(ma(this)),c&&c.replaceChild(b,this))},a)}}),r.each({appendTo:”append“,prependTo:”prepend“,insertBefore:”before“,insertAfter:”after“,replaceAll:”replaceWith“},function(a,b){r.fn[a]=function(a){for(var c,d=[],e=r(a),f=e.length-1,g=0;g<=f;g++)c=g===f?this:this.clone(!0),r(e)[b]©,h.apply(d,c.get());return this.pushStack(d)}});var Ka=/^margin/,La=new RegExp(”^(“_”)(?!px)[a-z%]+$“,”i“),Ma=function(b){var c=b.ownerDocument.defaultView;return c&&c.opener||(c=a),c.getComputedStyle(b)};!function(){function b(){if(i){i.style.cssText=”box-sizing:border-box;position:relative;display:block;margin:auto;border:1px;padding:1px;top:1%;width:50%“,i.innerHTML=”“,qa.appendChild(h);var b=a.getComputedStyle(i);c=”1%“!==b.top,g=”2px“===b.marginLeft,e=”4px“===b.width,i.style.marginRight=”50%“,f=”4px“===b.marginRight,qa.removeChild(h),i=null}}var c,e,f,g,h=d.createElement(”div“),i=d.createElement(”div“);i.style&&(i.style.backgroundClip=”content-box“,i.cloneNode(!0).style.backgroundClip=”“,o.clearCloneStyle=”content-box“===i.style.backgroundClip,h.style.cssText=”border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute“,h.appendChild(i),r.extend(o,{pixelPosition:function(){return b(),c},boxSizingReliable:function(){return b(),e},pixelMarginRight:function(){return b(),f},reliableMarginLeft:function(){return b(),g}}))}();function Na(a,b,c){var d,e,f,g,h=a.style;return c=c||Ma(a),c&&(g=c.getPropertyValue(b)||c,”“!==g||r.contains(a.ownerDocument,a)||(g=r.style(a,b)),!o.pixelMarginRight()&&La.test(g)&&Ka.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0!==g?g+”“:g}function Oa(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}var Pa=/^(none|table(?!-c).+)/,Qa={position:”absolute“,visibility:”hidden“,display:”block“},Ra={letterSpacing:”0“,fontWeight:”400“},Sa=[”Webkit“,”Moz“,”ms“],Ta=d.createElement(”div“).style;function Ua(a){if(a in Ta)return a;var b=a.toUpperCase()+a.slice(1),c=Sa.length;while(c–)if(a=Sa+b,a in Ta)return a}function Va(a,b,c){var d=aa.exec(b);return d?Math.max(0,d-(c||0))+(d||”px“):b}function Wa(a,b,c,d,e){var f,g=0;for(f=c===(d?”border“:”content“)?4:”width“===b?1:0;f<4;f+=2)”margin“===c&&(g+=r.css(a,c+ba,!0,e)),d?(”content“===c&&(g-=r.css(a,”padding“+ba,!0,e)),”margin“!==c&&(g-=r.css(a,”border“ba[f]”Width“,!0,e))):(g+=r.css(a,”padding“+ba,!0,e),”padding“!==c&&(g+=r.css(a,”border“ba[f]”Width“,!0,e)));return g}function Xa(a,b,c){var d,e=!0,f=Ma(a),g=”border-box“===r.css(a,”boxSizing“,!1,f);if(a.getClientRects().length&&(d=a.getBoundingClientRect()[b]),d<=0||null==d){if(d=Na(a,b,f),(d<0||null==d)&&(d=a.style[b]),La.test(d))return d;e=g&&(o.boxSizingReliable()||d===a.style[b]),d=parseFloat(d)||0}return d+Wa(a,b,c||(g?”border“:”content“),e,f)+”px“}r.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Na(a,”opacity“);return”“===c?”1“:c}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{”float“:”cssFloat“},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=r.camelCase(b),i=a.style;return b=r.cssProps[h]||(r.cssProps[h]=Ua(h)||h),g=r.cssHooks[b]||r.cssHooks[h],void 0===c?g&&”get“in g&&void 0!==(e=g.get(a,!1,d))?e:i:(f=typeof c,”string“===f&&(e=aa.exec©)&&e&&(c=ea(a,b,e),f=”number“),null!=c&&c===c&&(”number“===f&&(c+=e&&e||(r.cssNumber[h]?”“:”px“)),o.clearCloneStyle||”“!==c||0!==b.indexOf(”background“)||(i=”inherit“),g&&”set“in g&&void 0===(c=g.set(a,c,d))||(i=c)),void 0)}},css:function(a,b,c,d){var e,f,g,h=r.camelCase(b);return b=r.cssProps[h]||(r.cssProps[h]=Ua(h)||h),g=r.cssHooks[b]||r.cssHooks[h],g&&”get“in g&&(e=g.get(a,!0,c)),void 0===e&&(e=Na(a,b,d)),”normal“===e&&b in Ra&&(e=Ra),”“===c||c?(f=parseFloat(e),c===!0||isFinite(f)?f||0:e):e}}),r.each([”height“,”width“],function(a,b){r.cssHooks[b]={get:function(a,c,d){if©return!Pa.test(r.css(a,”display“))||a.getClientRects().length&&a.getBoundingClientRect().width?Xa(a,b,d):da(a,Qa,function(){return Xa(a,b,d)})},set:function(a,c,d){var e,f=d&&Ma(a),g=d&&Wa(a,b,d,”border-box“===r.css(a,”boxSizing“,!1,f),f);return g&&(e=aa.exec©)&&”px“!==(e||”px“)&&(a.style[b]=c,c=r.css(a,b)),Va(a,c,g)}}}),r.cssHooks.marginLeft=Oa(o.reliableMarginLeft,function(a,b){if(b)return(parseFloat(Na(a,”marginLeft“))||a.getBoundingClientRect().left-da(a,{marginLeft:0},function(){return a.getBoundingClientRect().left}))+”px“}),r.each({margin:”“,padding:”“,border:”Width“},function(a,b){r.cssHooks[a+b]={expand:function©{for(var d=0,e={},f=”string“==typeof c?c.split(” “):[c];d<4;d++)e[a+ba+b]=f||f||f;return e}},Ka.test(a)||(r.cssHooks[a+b].set=Va)}),r.fn.extend({css:function(a,b){return S(this,function(a,b,c){var d,e,f={},g=0;if(r.isArray(b)){for(d=Ma(a),e=b.length;g<e;g++)f[b]=r.css(a,b,!1,d);return f}return void 0!==c?r.style(a,b,c):r.css(a,b)},a,b,arguments.length>1)}});function Ya(a,b,c,d,e){return new Ya.prototype.init(a,b,c,d,e)}r.Tween=Ya,Ya.prototype={constructor:Ya,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||r.easing._default,this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(r.cssNumber[c]?”“:”px“)},cur:function(){var a=Ya.propHooks[this.prop];return a&&a.get?a.get(this):Ya.propHooks._default.get(this)},run:function(a){var b,c=Ya.propHooks[this.prop];return this.options.duration?this.pos=b=r.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Ya.propHooks._default.set(this),this}},Ya.prototype.init.prototype=Ya.prototype,Ya.propHooks={_default:{get:function(a){var b;return 1!==a.elem.nodeType||null!=a.elem[a.prop]&&null==a.elem.style[a.prop]?a.elem[a.prop]:(b=r.css(a.elem,a.prop,”“),b&&”auto“!==b?b:0)},set:function(a){r.fx.step[a.prop]?r.fx.step[a.prop](a):1!==a.elem.nodeType||null==a.elem.style[r.cssProps[a.prop]]&&!r.cssHooks[a.prop]?a.elem[a.prop]=a.now:r.style(a.elem,a.prop,a.now+a.unit)}}},Ya.propHooks.scrollTop=Ya.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},r.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},_default:”swing“},r.fx=Ya.prototype.init,r.fx.step={};var Za,$a,_a=/^(?:toggle|show|hide)$/,ab=/queueHooks$/;function bb(){$a&&(a.requestAnimationFrame(bb),r.fx.tick())}function cb(){return a.setTimeout(function(){Za=void 0}),Za=r.now()}function db(a,b){var c,d=0,e={height:a};for(b=b?1:0;d<4;d+=2-b)c=ba,e=e=a;return b&&(e.opacity=e.width=a),e}function eb(a,b,c){for(var d,e=(hb.tweeners[b]||[]).concat(hb.tweeners[”*“]),f=0,g=e.length;f<g;f++)if(d=e.call(c,b,a))return d}function fb(a,b,c){var d,e,f,g,h,i,j,k,l=”width“in b||”height“in b,m=this,n={},o=a.style,p=a.nodeType&&ca(a),q=V.get(a,”fxshow“);c.queue||(g=r._queueHooks(a,”fx“),null==g.unqueued&&(g.unqueued=0,h=g.empty.fire,g.empty.fire=function(){g.unqueued||h()}),g.unqueued++,m.always(function(){m.always(function(){g.unqueued–,r.queue(a,”fx“).length||g.empty.fire()})}));for(d in b)if(e=b,_a.test(e)){if(delete b,f=f||”toggle“===e,e===(p?”hide“:”show“)){if(”show“!==e||!q||void 0===q)continue;p=!0}n=q&&q||r.style(a,d)}if(i=!r.isEmptyObject(b),i||!r.isEmptyObject(n)){l&&1===a.nodeType&&(c.overflow=[o.overflow,o.overflowX,o.overflowY],j=q&&q.display,null==j&&(j=V.get(a,”display“)),k=r.css(a,”display“),”none“===k&&(j?k=j:(ha([a],!0),j=a.style.display||j,k=r.css(a,”display“),ha([a]))),(”inline“===k||”inline-block“===k&&null!=j)&&”none“===r.css(a,”float“)&&(i||(m.done(function(){o.display=j}),null==j&&(k=o.display,j=”none“===k?”“:k)),o.display=”inline-block“)),c.overflow&&(o.overflow=”hidden“,m.always(function(){o.overflow=c.overflow[0],o.overflowX=c.overflow[1],o.overflowY=c.overflow[2]})),i=!1;for(d in n)i||(q?”hidden“in q&&(p=q.hidden):q=V.access(a,”fxshow“,{display:j}),f&&(q.hidden=!p),p&&ha([a],!0),m.done(function(){p||ha([a]),V.remove(a,”fxshow“);for(d in n)r.style(a,d,n)})),i=eb(p?q:0,d,m),d in q||(q=i.start,p&&(i.end=i.start,i.start=0))}}function gb(a,b){var c,d,e,f,g;for(c in a)if(d=r.camelCase©,e=b,f=a,r.isArray(f)&&(e=f,f=a=f),c!==d&&(a=f,delete a),g=r.cssHooks[d],g&&”expand“in g){f=g.expand(f),delete a;for(c in f)c in a||(a=f,b=e)}else b=e}function hb(a,b,c){var d,e,f=0,g=hb.prefilters.length,h=r.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=Za||cb(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;g<i;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),f<1&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:r.extend({},b),opts:r.extend(!0,{specialEasing:{},easing:r.easing._default},c),originalProperties:b,originalOptions:c,startTime:Za||cb(),duration:c.duration,tweens:[],createTween:function(b,c){var d=r.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;c<d;c++)j.tweens[c].run(1);return b?(h.notifyWith(a,[j,1,0]),h.resolveWith(a,[j,b])):h.rejectWith(a,[j,b]),this}}),k=j.props;for(gb(k,j.opts.specialEasing);f<g;f++)if(d=hb.prefilters[f].call(j,a,k,j.opts))return r.isFunction(d.stop)&&(r._queueHooks(j.elem,j.opts.queue).stop=r.proxy(d.stop,d)),d;return r.map(k,eb,j),r.isFunction(j.opts.start)&&j.opts.start.call(a,j),r.fx.timer(r.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}r.Animation=r.extend(hb,{tweeners:{”*“:[function(a,b){var c=this.createTween(a,b);return ea(c.elem,a,aa.exec(b),c),c}]},tweener:function(a,b){r.isFunction(a)?(b=a,a=[”*“]):a=a.match(K);for(var c,d=0,e=a.length;d<e;d++)c=a,hb.tweeners[c]=hb.tweeners[c]||[],hb.tweeners[c].unshift(b)},prefilters:[fb],prefilter:function(a,b){b?hb.prefilters.unshift(a):hb.prefilters.push(a)}}),r.speed=function(a,b,c){var e=a&&”object“==typeof a?r.extend({},a):{complete:c||!c&&b||r.isFunction(a)&&a,duration:a,easing:c&&b||b&&!r.isFunction(b)&&b};return r.fx.off||d.hidden?e.duration=0:”number“!=typeof e.duration&&(e.duration in r.fx.speeds?e.duration=r.fx.speeds[e.duration]:e.duration=r.fx.speeds._default),null!=e.queue&&e.queue!==!0||(e.queue=”fx“),e.old=e.complete,e.complete=function(){r.isFunction(e.old)&&e.old.call(this),e.queue&&r.dequeue(this,e.queue)},e},r.fn.extend({fadeTo:function(a,b,c,d){return this.filter(ca).css(”opacity“,0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=r.isEmptyObject(a),f=r.speed(b,c,d),g=function(){var b=hb(this,r.extend({},a),f);(e||V.get(this,”finish“))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b©};return”string“!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||”fx“,[]),this.each(function(){var b=!0,e=null!=a&&a+”queueHooks“,f=r.timers,g=V.get(this);if(e)g&&g.stop&&d(g);else for(e in g)g&&g.stop&&ab.test(e)&&d(g);for(e=f.length;e–;)f.elem!==this||null!=a&&f.queue!==a||(f.anim.stop©,b=!1,f.splice(e,1));!b&&c||r.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||”fx“),this.each(function(){var b,c=V.get(this),d=c,e=c,f=r.timers,g=d?d.length:0;for(c.finish=!0,r.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b–;)f.elem===this&&f.queue===a&&(f.anim.stop(!0),f.splice(b,1));for(b=0;b<g;b++)d&&d.finish&&d.finish.call(this);delete c.finish})}}),r.each([”toggle“,”show“,”hide“],function(a,b){var c=r.fn[b];r.fn[b]=function(a,d,e){return null==a||”boolean“==typeof a?c.apply(this,arguments):this.animate(db(b,!0),a,d,e)}}),r.each({slideDown:db(”show“),slideUp:db(”hide“),slideToggle:db(”toggle“),fadeIn:{opacity:”show“},fadeOut:{opacity:”hide“},fadeToggle:{opacity:”toggle“}},function(a,b){r.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),r.timers=[],r.fx.tick=function(){var a,b=0,c=r.timers;for(Za=r.now();b<c.length;b++)a=c,a()||c!==a||c.splice(b–,1);c.length||r.fx.stop(),Za=void 0},r.fx.timer=function(a){r.timers.push(a),a()?r.fx.start():r.timers.pop()},r.fx.interval=13,r.fx.start=function(){$a||($a=a.requestAnimationFrame?a.requestAnimationFrame(bb):a.setInterval(r.fx.tick,r.fx.interval))},r.fx.stop=function(){a.cancelAnimationFrame?a.cancelAnimationFrame($a):a.clearInterval($a),$a=null},r.fx.speeds={slow:600,fast:200,_default:400},r.fn.delay=function(b,c){return b=r.fx?r.fx.speeds[b]||b:b,c=c||”fx“,this.queue(c,function(c,d){var e=a.setTimeout(c,b);d.stop=function(){a.clearTimeout(e)}})},function(){var a=d.createElement(”input“),b=d.createElement(”select“),c=b.appendChild(d.createElement(”option“));a.type=”checkbox“,o.checkOn=”“!==a.value,o.optSelected=c.selected,a=d.createElement(”input“),a.value=”t“,a.type=”radio“,o.radioValue=”t“===a.value}();var ib,jb=r.expr.attrHandle;r.fn.extend({attr:function(a,b){return S(this,r.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){r.removeAttr(this,a)})}}),r.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return”undefined“==typeof a.getAttribute?r.prop(a,b,c):(1===f&&r.isXMLDoc(a)||(e=r.attrHooks[b.toLowerCase()]||(r.expr.match.bool.test(b)?ib:void 0)), void 0!==c?null===c?void r.removeAttr(a,b):e&&”set“in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+”“),c):e&&”get“in e&&null!==(d=e.get(a,b))?d:(d=r.find.attr(a,b),null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!o.radioValue&&”radio“===b&&r.nodeName(a,”input“)){var c=a.value;return a.setAttribute(”type“,b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d=0,e=b&&b.match(K);if(e&&1===a.nodeType)while(c=e)a.removeAttribute©}}),ib={set:function(a,b,c){return b===!1?r.removeAttr(a,c):a.setAttribute(c,c),c}},r.each(r.expr.match.bool.source.match(/\w+/g),function(a,b){var c=jb||r.find.attr;jb=function(a,b,d){var e,f,g=b.toLowerCase();return d||(f=jb,jb=e,e=null!=c(a,b,d)?g:null,jb=f),e}});var kb=/^(?:input|select|textarea|button)$/i,lb=/^(?:a|area)$/i;r.fn.extend({prop:function(a,b){return S(this,r.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[r.propFix[a]||a]})}}),r.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&r.isXMLDoc(a)||(b=r.propFix[b]||b,e=r.propHooks[b]),void 0!==c?e&&”set“in e&&void 0!==(d=e.set(a,c,b))?d:a=c:e&&”get“in e&&null!==(d=e.get(a,b))?d:a},propHooks:{tabIndex:{get:function(a){var b=r.find.attr(a,”tabindex“);return b?parseInt(b,10):kb.test(a.nodeName)||lb.test(a.nodeName)&&a.href?0:-1}}},propFix:{”for“:”htmlFor“,”class“:”className“}}),o.optSelected||(r.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null},set:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}}),r.each([”tabIndex“,”readOnly“,”maxLength“,”cellSpacing“,”cellPadding“,”rowSpan“,”colSpan“,”useMap“,”frameBorder“,”contentEditable“],function(){r.propFix[this.toLowerCase()]=this});function mb(a){var b=a.match(K)||[];return b.join(” “)}function nb(a){return a.getAttribute&&a.getAttribute(”class“)||”“}r.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).addClass(a.call(this,b,nb(this)))});if(”string“==typeof a&&a){b=a.match(K)||[];while(c=this)if(e=nb©,d=1===c.nodeType&&” “+mb(e)+” “){g=0;while(f=b)d.indexOf(” “f” “)<0&&(d+=f+” “);h=mb(d),e!==h&&c.setAttribute(”class“,h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).removeClass(a.call(this,b,nb(this)))});if(!arguments.length)return this.attr(”class“,”“);if(”string“==typeof a&&a){b=a.match(K)||[];while(c=this)if(e=nb©,d=1===c.nodeType&&” “+mb(e)+” “){g=0;while(f=b)while(d.indexOf(” “f” “)>-1)d=d.replace(” “f” “,” “);h=mb(d),e!==h&&c.setAttribute(”class“,h)}}return this},toggleClass:function(a,b){var c=typeof a;return”boolean“==typeof b&&”string“===c?b?this.addClass(a):this.removeClass(a):r.isFunction(a)?this.each(function©{r(this).toggleClass(a.call(this,c,nb(this),b),b)}):this.each(function(){var b,d,e,f;if(”string“===c){d=0,e=r(this),f=a.match(K)||[];while(b=f)e.hasClass(b)?e.removeClass(b):e.addClass(b)}else void 0!==a&&”boolean“!==c||(b=nb(this),b&&V.set(this,”__className__“,b),this.setAttribute&&this.setAttribute(”class“,b||a===!1?”“:V.get(this,”__className__“)||”“))})},hasClass:function(a){var b,c,d=0;b=” “a” “;while(c=this)if(1===c.nodeType&&(” “+mb(nb©)+” “).indexOf(b)>-1)return!0;return!1}});var ob=/\r/g;r.fn.extend({val:function(a){var b,c,d,e=this;{if(arguments.length)return d=r.isFunction(a),this.each(function©{var e;1===this.nodeType&&(e=d?a.call(this,c,r(this).val()):a,null==e?e=”“:”number“==typeof e?e+=”“:r.isArray(e)&&(e=r.map(e,function(a){return null==a?”“:a+”“})),b=r.valHooks[this.type]||r.valHooks[this.nodeName.toLowerCase()],b&&”set“in b&&void 0!==b.set(this,e,”value“)||(this.value=e))});if(e)return b=r.valHooks[e.type]||r.valHooks[e.nodeName.toLowerCase()],b&&”get“in b&&void 0!==(c=b.get(e,”value“))?c:(c=e.value,”string“==typeof c?c.replace(ob,”“):null==c?”“:c)}}}),r.extend({valHooks:{option:{get:function(a){var b=r.find.attr(a,”value“);return null!=b?b:mb(r.text(a))}},select:{get:function(a){var b,c,d,e=a.options,f=a.selectedIndex,g=”select-one“===a.type,h=g?null:[],i=g?f+1:e.length;for(d=f<0?i:g?f:0;d<i;d++)if(c=e,(c.selected||d===f)&&!c.disabled&&(!c.parentNode.disabled||!r.nodeName(c.parentNode,”optgroup“))){if(b=r©.val(),g)return b;h.push(b)}return h},set:function(a,b){var c,d,e=a.options,f=r.makeArray(b),g=e.length;while(g–)d=e,(d.selected=r.inArray(r.valHooks.option.get(d),f)>-1)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),r.each([”radio“,”checkbox“],function(){r.valHooks[this]={set:function(a,b){if(r.isArray(b))return a.checked=r.inArray(r(a).val(),b)>-1}},o.checkOn||(r.valHooks[this].get=function(a){return null===a.getAttribute(”value“)?”on“:a.value})});var pb=/^(?:focusinfocus|focusoutblur)$/;r.extend(r.event,{trigger:function(b,c,e,f){var g,h,i,j,k,m,n,o=[e||d],p=l.call(b,”type“)?b.type:b,q=l.call(b,”namespace“)?b.namespace.split(”.“):[];if(h=i=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!pb.test(p+r.event.triggered)&&(p.indexOf(”.“)>-1&&(q=p.split(”.“),p=q.shift(),q.sort()),k=p.indexOf(”:“)<0&&”on“+p,b=b?b:new r.Event(p,”object“==typeof b&&b),b.isTrigger=f?2:3,b.namespace=q.join(”.“),b.rnamespace=b.namespace?new RegExp(”(^|\.)“+q.join(”\.(?:.*\.|)“)+”(\.|$)“):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:r.makeArray(c,[b]),n=r.event.special[p]||{},f||!n.trigger||n.trigger.apply(e,c)!==!1)){if(!f&&!n.noBubble&&!r.isWindow(e)){for(j=n.delegateType||p,pb.test(j+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),i=h;i===(e.ownerDocument||d)&&o.push(i.defaultView||i.parentWindow||a)}g=0;while((h=o)&&!b.isPropagationStopped())b.type=g>1?j:n.bindType||p,m=(V.get(h,”events“)||{})[b.type]&&V.get(h,”handle“),m&&m.apply(h,c),m=k&&h,m&&m.apply&&T(h)&&(b.result=m.apply(h,c),b.result===!1&&b.preventDefault());return b.type=p,f||b.isDefaultPrevented()||n._default&&n._default.apply(o.pop(),c)!==!1||!T(e)||k&&r.isFunction(e)&&!r.isWindow(e)&&(i=e,i&&(e=null),r.event.triggered=p,e(),r.event.triggered=void 0,i&&(e=i)),b.result}},simulate:function(a,b,c){var d=r.extend(new r.Event,c,{type:a,isSimulated:!0});r.event.trigger(d,null,b)}}),r.fn.extend({trigger:function(a,b){return this.each(function(){r.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this;if©return r.event.trigger(a,b,c,!0)}}),r.each(”blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu“.split(” “),function(a,b){r.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),r.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),o.focusin=”onfocusin“in a,o.focusin||r.each({focus:”focusin“,blur:”focusout“},function(a,b){var c=function(a){r.event.simulate(b,a.target,r.event.fix(a))};r.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=V.access(d,b);e||d.addEventListener(a,c,!0),V.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=V.access(d,b)-1;e?V.access(d,b,e):(d.removeEventListener(a,c,!0),V.remove(d,b))}}});var qb=a.location,rb=r.now(),sb=/\?/;r.parseXML=function(b){var c;if(!b||”string“!=typeof b)return null;try{c=(new a.DOMParser).parseFromString(b,”text/xml“)}catch(d){c=void 0}return c&&!c.getElementsByTagName(”parsererror“).length||r.error(”Invalid XML: “+b),c};var tb=/[]$/,ub=/\r?\n/g,vb=/^(?:submit|button|image|reset|file)$/i,wb=/^(?:input|select|textarea|keygen)/i;function xb(a,b,c,d){var e;if(r.isArray(b))r.each(b,function(b,e){c||tb.test(a)?d(a,e):xb(a+”[“+(”object“==typeof e&&null!=e?b:”“)+”]“,e,c,d)});else if(c||”object“!==r.type(b))d(a,b);else for(e in b)xb(a+”[“e”]“,b,c,d)}r.param=function(a,b){var c,d=[],e=function(a,b){var c=r.isFunction(b)?b():b;d=encodeURIComponent(a)+”=“+encodeURIComponent(null==c?”“:c)};if(r.isArray(a)||a.jquery&&!r.isPlainObject(a))r.each(a,function(){e(this.name,this.value)});else for(c in a)xb(c,a,b,e);return d.join(”&“)},r.fn.extend({serialize:function(){return r.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=r.prop(this,”elements“);return a?r.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!r(this).is(”:disabled“)&&wb.test(this.nodeName)&&!vb.test(a)&&(this.checked||!ia.test(a))}).map(function(a,b){var c=r(this).val();return null==c?null:r.isArray©?r.map(c,function(a){return{name:b.name,value:a.replace(ub,”\r\n“)}}):{name:b.name,value:c.replace(ub,”\r\n“)}}).get()}});var yb=/%20/g,zb=/#.*$/,Ab=/([?&])_=[^&]*/,Bb=/^(.*?):[ \t]*([^\r\n]*)$/gm,Cb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Db=/^(?:GET|HEAD)$/,Eb=/^\/\//,Fb={},Gb={},Hb=”*/“.concat(”*“),Ib=d.createElement(”a“);Ib.href=qb.href;function Jb(a){return function(b,c){”string“!=typeof b&&(c=b,b=”*“);var d,e=0,f=b.toLowerCase().match(K)||[];if(r.isFunction©)while(d=f)”+“===d?(d=d.slice(1)||”*“,(a=a||[]).unshift©):(a=a||[]).push©}}function Kb(a,b,c,d){var e={},f=a===Gb;function g(h){var i;return e=!0,r.each(a||[],function(a,h){var j=h(b,c,d);return”string“!=typeof j||f||e?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e&&g(”*“)}function Lb(a,b){var c,d,e=r.ajaxSettings.flatOptions||{};for(c in b)void 0!==b&&((e?a:d||(d={}))[c]=b);return d&&r.extend(!0,a,d),a}function Mb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while(”*“===i)i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader(”Content-Type“));if(d)for(e in h)if(h&&h.test(d)){i.unshift(e);break}if(iin c)f=i;else{for(e in c){if(!i||a.converters[e+” “+i]){f=e;break}g||(g=e)}f=f||g}if(f)return f!==i&&i.unshift(f),c}function Nb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k)for(g in a.converters)j=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if(”*“===f)f=i;else if(”*“!==i&&i!==f){if(g=j[i+” “+f]||j[”* “+f],!g)for(e in j)if(h=e.split(” “),h===f&&(g=j[i+” “+h]||j[”* “+h])){g===!0?g=j:j!==!0&&(f=h,k.unshift(h));break}if(g!==!0)if(g&&a)b=g(b);else try{b=g(b)}catch(l){return{state:”parsererror“,error:g?l:”No conversion from “i” to “+f}}}return{state:”success“,data:b}}r.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:qb.href,type:”GET“,isLocal:Cb.test(qb.protocol),global:!0,processData:!0,async:!0,contentType:”application/x-www-form-urlencoded; charset=UTF-8“,accepts:{”*“:Hb,text:”text/plain“,html:”text/html“,xml:”application/xml, text/xml“,json:”application/json, text/javascript“},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:”responseXML“,text:”responseText“,json:”responseJSON“},converters:{”* text“:String,”text html“:!0,”text json“:JSON.parse,”text xml“:r.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Lb(Lb(a,r.ajaxSettings),b):Lb(r.ajaxSettings,a)},ajaxPrefilter:Jb(Fb),ajaxTransport:Jb(Gb),ajax:function(b,c){”object“==typeof b&&(c=b,b=void 0),c=c||{};var e,f,g,h,i,j,k,l,m,n,o=r.ajaxSetup({},c),p=o.context||o,q=o.context&&(p.nodeType||p.jquery)?r(p):r.event,s=r.Deferred(),t=r.Callbacks(”once memory“),u=o.statusCode||{},v={},w={},x=”canceled“,y={readyState:0,getResponseHeader:function(a){var b;if(k){if(!h){h={};while(b=Bb.exec(g))h[b.toLowerCase()]=b}b=h}return null==b?null:b},getAllResponseHeaders:function(){return k?g:null},setRequestHeader:function(a,b){return null==k&&(a=w=w||a,v=b),this},overrideMimeType:function(a){return null==k&&(o.mimeType=a),this},statusCode:function(a){var b;if(a)if(k)y.always(a);else for(b in a)u=[u,a];return this},abort:function(a){var b=a||x;return e&&e.abort(b),A(0,b),this}};if(s.promise(y),o.url=((b||o.url||qb.href)+”“).replace(Eb,qb.protocol+”//“),o.type=c.method||c.type||o.method||o.type,o.dataTypes=(o.dataType||”*“).toLowerCase().match(K)||[”“],null==o.crossDomain){j=d.createElement(”a“);try{j.href=o.url,j.href=j.href,o.crossDomain=Ib.protocol+”//“+Ib.host!=j.protocol+”//“+j.host}catch(z){o.crossDomain=!0}}if(o.data&&o.processData&&”string“!=typeof o.data&&(o.data=r.param(o.data,o.traditional)),Kb(Fb,o,c,y),k)return y;l=r.event&&o.global,l&&0===r.active++&&r.event.trigger(”ajaxStart“),o.type=o.type.toUpperCase(),o.hasContent=!Db.test(o.type),f=o.url.replace(zb,”“),o.hasContent?o.data&&o.processData&&0===(o.contentType||”“).indexOf(”application/x-www-form-urlencoded“)&&(o.data=o.data.replace(yb,”+“)):(n=o.url.slice(f.length),o.data&&(f+=(sb.test(f)?”&“:”?“)+o.data,delete o.data),o.cache===!1&&(f=f.replace(Ab,”$1“),n=(sb.test(f)?”&“:”?“)+”_=“rb+ +n),o.url=f+n),o.ifModified&&(r.lastModified[f]&&y.setRequestHeader(”If-Modified-Since“,r.lastModified[f]),r.etag[f]&&y.setRequestHeader(”If-None-Match“,r.etag[f])),(o.data&&o.hasContent&&o.contentType!==!1||c.contentType)&&y.setRequestHeader(”Content-Type“,o.contentType),y.setRequestHeader(”Accept“,o.dataTypes[0]&&o.accepts[o.dataTypes[0]]?o.accepts[o.dataTypes[0]]+(”*“!==o.dataTypes[0]?”, “Hb”; q=0.01“:”“):o.accepts[”*“]);for(m in o.headers)y.setRequestHeader(m,o.headers[m]);if(o.beforeSend&&(o.beforeSend.call(p,y,o)===!1||k))return y.abort();if(x=”abort“,t.add(o.complete),y.done(o.success),y.fail(o.error),e=Kb(Gb,o,c,y)){if(y.readyState=1,l&&q.trigger(”ajaxSend“,[y,o]),k)return y;o.async&&o.timeout>0&&(i=a.setTimeout(function(){y.abort(”timeout“)},o.timeout));try{k=!1,e.send(v,A)}catch(z){if(k)throw z;A(-1,z)}}else A(-1,”No Transport“);function A(b,c,d,h){var j,m,n,v,w,x=c;k||(k=!0,i&&a.clearTimeout(i),e=void 0,g=h||”“,y.readyState=b>0?4:0,j=b>=200&&b<300||304===b,d&&(v=Mb(o,y,d)),v=Nb(o,v,y,j),j?(o.ifModified&&(w=y.getResponseHeader(”Last-Modified“),w&&(r.lastModified[f]=w),w=y.getResponseHeader(”etag“),w&&(r.etag[f]=w)),204===b||”HEAD“===o.type?x=”nocontent“:304===b?x=”notmodified“:(x=v.state,m=v.data,n=v.error,j=!n)):(n=x,!b&&x||(x=”error“,b<0&&(b=0))),y.status=b,y.statusText=(c||x)+”“,j?s.resolveWith(p,[m,x,y]):s.rejectWith(p,[y,x,n]),y.statusCode(u),u=void 0,l&&q.trigger(j?”ajaxSuccess“:”ajaxError“,[y,o,j?m:n]),t.fireWith(p,[y,x]),l&&(q.trigger(”ajaxComplete“,[y,o]),–r.active||r.event.trigger(”ajaxStop“)))}return y},getJSON:function(a,b,c){return r.get(a,b,c,”json“)},getScript:function(a,b){return r.get(a,void 0,b,”script“)}}),r.each([”get“,”post“],function(a,b){r=function(a,c,d,e){return r.isFunction©&&(e=e||d,d=c,c=void 0),r.ajax(r.extend({url:a,type:b,dataType:e,data:c,success:d},r.isPlainObject(a)&&a))}}),r._evalUrl=function(a){return r.ajax({url:a,type:”GET“,dataType:”script“,cache:!0,async:!1,global:!1,”throws“:!0})},r.fn.extend({wrapAll:function(a){var b;return this&&(r.isFunction(a)&&(a=a.call(this)),b=r(a,this.ownerDocument).eq(0).clone(!0),this.parentNode&&b.insertBefore(this),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this},wrapInner:function(a){return r.isFunction(a)?this.each(function(b){r(this).wrapInner(a.call(this,b))}):this.each(function(){var b=r(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=r.isFunction(a);return this.each(function©{r(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(a){return this.parent(a).not(”body“).each(function(){r(this).replaceWith(this.childNodes)}),this}}),r.expr.pseudos.hidden=function(a){return!r.expr.pseudos.visible(a)},r.expr.pseudos.visible=function(a){return!!(a.offsetWidth||a.offsetHeight||a.getClientRects().length)},r.ajaxSettings.xhr=function(){try{return new a.XMLHttpRequest}catch(b){}};var Ob={0:200,1223:204},Pb=r.ajaxSettings.xhr();o.cors=!!Pb&&”withCredentials“in Pb,o.ajax=Pb=!!Pb,r.ajaxTransport(function(b){var c,d;if(o.cors||Pb&&!b.crossDomain)return{send:function(e,f){var g,h=b.xhr();if(h.open(b.type,b.url,b.async,b.username,b.password),b.xhrFields)for(g in b.xhrFields)h=b.xhrFields[g];b.mimeType&&h.overrideMimeType&&h.overrideMimeType(b.mimeType),b.crossDomain||e||(e=”XMLHttpRequest“);for(g in e)h.setRequestHeader(g,e);c=function(a){return function(){c&&(c=d=h.onload=h.onerror=h.onabort=h.onreadystatechange=null,”abort“===a?h.abort():”error“===a?”number“!=typeof h.status?f(0,”error“):f(h.status,h.statusText):f(Ob||h.status,h.statusText,”text“!==(h.responseType||”text“)||”string“!=typeof h.responseText?{binary:h.response}:{text:h.responseText},h.getAllResponseHeaders()))}},h.onload=c(),d=h.onerror=c(”error“),void 0!==h.onabort?h.onabort=d:h.onreadystatechange=function(){4===h.readyState&&a.setTimeout(function(){c&&d()})},c=c(”abort“);try{h.send(b.hasContent&&b.data||null)}catch(i){if©throw i}},abort:function(){c&&c()}}}),r.ajaxPrefilter(function(a){a.crossDomain&&(a.contents.script=!1)}),r.ajaxSetup({accepts:{script:”text/javascript, application/javascript, application/ecmascript, application/x-ecmascript“},contents:{script:/\b(?:java|ecma)script\b/},converters:{”text script“:function(a){return r.globalEval(a),a}}}),r.ajaxPrefilter(”script“,function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type=”GET“)}),r.ajaxTransport(”script“,function(a){if(a.crossDomain){var b,c;return{send:function(e,f){b=r(”<script>“).prop({charset:a.scriptCharset,src:a.url}).on(”load error“,c=function(a){b.remove(),c=null,a&&f(”error“===a.type?404:200,a.type)}),d.head.appendChild(b)},abort:function(){c&&c()}}}});var Qb=[],Rb=/(=)\?(?=&|$)|\?\?/;r.ajaxSetup({jsonp:”callback“,jsonpCallback:function(){var a=Qb.pop()||r.expando+”_“rb+;return this=!0,a}}),r.ajaxPrefilter(”json jsonp“,function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(Rb.test(b.url)?”url“:”string“==typeof b.data&&0===(b.contentType||”“).indexOf(”application/x-www-form-urlencoded“)&&Rb.test(b.data)&&”data“);if(h||”jsonp“===b.dataTypes[0])return e=b.jsonpCallback=r.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b=b.replace(Rb,”$1“+e):b.jsonp!==!1&&(b.url+=(sb.test(b.url)?”&“:”?“)b.jsonp”=“+e),b.converters[”script json“]=function(){return g||r.error(e+” was not called“),g},b.dataTypes[0]=”json“,f=a,a=function(){g=arguments},d.always(function(){void 0===f?r(a).removeProp(e):a=f,b&&(b.jsonpCallback=c.jsonpCallback,Qb.push(e)),g&&r.isFunction(f)&&f(g),g=f=void 0}),”script“}),o.createHTMLDocument=function(){var a=d.implementation.createHTMLDocument(”“).body;return a.innerHTML=”<form></form><form></form>“,2===a.childNodes.length}(),r.parseHTML=function(a,b,c){if(”string“!=typeof a)return[];”boolean“==typeof b&&(c=b,b=!1);var e,f,g;return b||(o.createHTMLDocument?(b=d.implementation.createHTMLDocument(”“),e=b.createElement(”base“),e.href=d.location.href,b.head.appendChild(e)):b=d),f=B.exec(a),g=!c&&[],f?[b.createElement(f)]:(f=pa([a],b,g),g&&g.length&&r(g).remove(),r.merge([],f.childNodes))},r.fn.load=function(a,b,c){var d,e,f,g=this,h=a.indexOf(” “);return h>-1&&(d=mb(a.slice(h)),a=a.slice(0,h)),r.isFunction(b)?(c=b,b=void 0):b&&”object“==typeof b&&(e=”POST“),g.length>0&&r.ajax({url:a,type:e||”GET“,dataType:”html“,data:b}).done(function(a){f=arguments,g.html(d?r(”<div>“).append(r.parseHTML(a)).find(d):a)}).always(c&&function(a,b){g.each(function(){c.apply(this,f||[a.responseText,b,a])})}),this},r.each([”ajaxStart“,”ajaxStop“,”ajaxComplete“,”ajaxError“,”ajaxSuccess“,”ajaxSend“],function(a,b){r.fn[b]=function(a){return this.on(b,a)}}),r.expr.pseudos.animated=function(a){return r.grep(r.timers,function(b){return a===b.elem}).length};function Sb(a){return r.isWindow(a)?a:9===a.nodeType&&a.defaultView}r.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=r.css(a,”position“),l=r(a),m={};”static“===k&&(a.style.position=”relative“),h=l.offset(),f=r.css(a,”top“),i=r.css(a,”left“),j=(”absolute“===k||”fixed“===k)&&(f+i).indexOf(”auto“)>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),r.isFunction(b)&&(b=b.call(a,c,r.extend({},h))),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),”using“in b?b.using.call(a,m):l.css(m)}},r.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){r.offset.setOffset(this,a,b)});var b,c,d,e,f=this;if(f)return f.getClientRects().length?(d=f.getBoundingClientRect(),d.width||d.height?(e=f.ownerDocument,c=Sb(e),b=e.documentElement,{top:d.top+c.pageYOffset-b.clientTop,left:d.left+c.pageXOffset-b.clientLeft}):d):{top:0,left:0}},position:function(){if(this){var a,b,c=this,d={top:0,left:0};return”fixed“===r.css(c,”position“)?b=c.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),r.nodeName(a,”html“)||(d=a.offset()),d={top:d.top+r.css(a,”borderTopWidth“,!0),left:d.left+r.css(a,”borderLeftWidth“,!0)}),{top:b.top-d.top-r.css(c,”marginTop“,!0),left:b.left-d.left-r.css(c,”marginLeft“,!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent;while(a&&”static“===r.css(a,”position“))a=a.offsetParent;return a||qa})}}),r.each({scrollLeft:”pageXOffset“,scrollTop:”pageYOffset“},function(a,b){var c=”pageYOffset“===b;r.fn[a]=function(d){return S(this,function(a,d,e){var f=Sb(a);return void 0===e?f?f:a:void(f?f.scrollTo(c?f.pageXOffset:e,c?e:f.pageYOffset):a=e)},a,d,arguments.length)}}),r.each([”top“,”left“],function(a,b){r.cssHooks[b]=Oa(o.pixelPosition,function(a,c){if©return c=Na(a,b),La.test©?r(a).position()[b]+”px“:c})}),r.each({Height:”height“,Width:”width“},function(a,b){r.each({padding:”inner“+a,content:b,”“:”outer“+a},function(c,d){r.fn[d]=function(e,f){var g=arguments.length&&(c||”boolean“!=typeof e),h=c||(e===!0||f===!0?”margin“:”border“);return S(this,function(b,c,e){var f;return r.isWindow(b)?0===d.indexOf(”outer“)?b:b.document.documentElement[”client“+a]:9===b.nodeType?(f=b.documentElement,Math.max(b.body[”scroll“+a],f,b.body[”offset“+a],f,f)):void 0===e?r.css(b,c,h):r.style(b,c,e,h)},b,g?e:void 0,g)}})}),r.fn.extend({bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,”**“):this.off(b,a||”**“,c)}}),r.parseJSON=JSON.parse,”function“==typeof define&&define.amd&&define(”jquery“,[],function(){return r});var Tb=a.jQuery,Ub=a.$;return r.noConflict=function(b){return a.$===r&&(a.$=Ub),b&&a.jQuery===r&&(a.jQuery=Tb),r},b||(a.jQuery=a.$=r),r});

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/assets/vendor/javascripts/jquery_scrollTo_min_js.html b/doc/tmp/rubycritic/assets/vendor/javascripts/jquery_scrollTo_min_js.html new file mode 100644 index 0000000000..2b3561726a --- /dev/null +++ b/doc/tmp/rubycritic/assets/vendor/javascripts/jquery_scrollTo_min_js.html @@ -0,0 +1,1638 @@ + + + + + + + +jquery.scrollTo.min.js - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

/**

+ +
* Copyright (c) 2007-2015 Ariel Flesler - aflesler<a>gmail<d>com | http://flesler.blogspot.com
+* Licensed under MIT
+* @author Ariel Flesler
+* @version 2.1.2
+*/
+ +

;(function(f){“use strict”;“function”===typeof define&&define.amd?define([“jquery”],f):“undefined”!==typeof module&&module.exports?module.exports=f(require(“jquery”)):f(jQuery)})(function($){“use strict”;function n(a){return!a.nodeName||-1!==$.inArray(a.nodeName.toLowerCase(),[“iframe”,“#document”,“html”,“body”])}function h(a){return $.isFunction(a)||$.isPlainObject(a)?a:{top:a,left:a}}var p=$.scrollTo=function(a,d,b){return $(window).scrollTo(a,d,b)};p.defaults={axis:“xy”,duration:0,limit:!0};$.fn.scrollTo=function(a,d,b){“object”=== typeof d&&(b=d,d=0);“function”===typeof b&&(b={onAfter:b});“max”===a&&(a=9E9);b=$.extend({},p.defaults,b);d=d||b.duration;var u=b.queue&&1<b.axis.length;u&&(d/=2);b.offset=h(b.offset);b.over=h(b.over);return this.each(function(){function k(a){var k=$.extend({},b,{queue:!0,duration:d,complete:a&&function(){a.call(q,e,b)}});r.animate(f,k)}if(null!==a){var l=n(this),q=l?this.contentWindow||window:this,r=$(q),e=a,f={},t;switch(typeof e){case “number”:case “string”:if(/^([+-]=?)?\d+(\.\d+)?(px|%)?$/.test(e)){e= h(e);break}e=l?$(e):$(e,q);case “object”:if(e.length===0)return;if(e.is||e.style)t=(e=$(e)).offset()}var v=$.isFunction(b.offset)&&b.offset(q,e)||b.offset;$.each(b.axis.split(“”),function(a,c){var d=“x”===c?“Left”:“Top”,m=d.toLowerCase(),g=“scroll”+d,h=r(),n=p.max(q,c);t?(f=t+(l?0:h-r.offset()[m]),b.margin&&(f-=parseInt(e.css(“margin”+d),10)||0,f-=parseInt(e.css(“border”d“Width”),10)||0),f+=v||0,b.over[m]&&(f+=e()*b.over[m])):(d=e,f=d.slice&& “%”===d.slice(-1)?parseFloat(d)/100*n:d);b.limit&&/^\d+$/.test(f)&&(f=0>=f?0:Math.min(f,n));!a&&1<b.axis.length&&(h===f?f={}:u&&(k(b.onAfterFirst),f={}))});k(b.onAfter)}})};p.max=function(a,d){var b=“x”===d?“Width”:“Height”,h=“scroll”+b;if(!n(a))return a-$(a)[b.toLowerCase()]();var b=“client”+b,k=a.ownerDocument||a.document,l=k.documentElement,k=k.body;return Math.max(l,k)-Math.min(l,k)};$.Tween.propHooks.scrollLeft=$.Tween.propHooks.scrollTop={get:function(a){return $(a.elem)[a.prop]()}, set:function(a){var d=this.get(a);if(a.options.interrupt&&a._last&&a._last!==d)return $(a.elem).stop();var b=Math.round(a.now);d!==b&&($(a.elem)[a.prop](b),a._last=this.get(a))}};return p});

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/assets/vendor/javascripts/jquery_tablesorter_js.html b/doc/tmp/rubycritic/assets/vendor/javascripts/jquery_tablesorter_js.html new file mode 100644 index 0000000000..32245a8674 --- /dev/null +++ b/doc/tmp/rubycritic/assets/vendor/javascripts/jquery_tablesorter_js.html @@ -0,0 +1,2660 @@ + + + + + + + +jquery.tablesorter.js - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

/*

+ +
* 
+* TableSorter 2.0 - Client-side table sorting with ease!
+* Version 2.0.5b
+* @requires jQuery v1.2.3
+* 
+* Copyright (c) 2007 Christian Bach
+* Examples and docs at: http://tablesorter.com
+* Dual licensed under the MIT and GPL licenses:
+* http://www.opensource.org/licenses/mit-license.php
+* http://www.gnu.org/licenses/gpl.html
+* 
+*/
+ +

/**

+ +
* 
+* @description Create a sortable table with multi-column sorting capabilitys
+* 
+* @example $('table').tablesorter();
+* @desc Create a simple tablesorter interface.
+* 
+* @example $('table').tablesorter({ sortList:[[0,0],[1,0]] });
+* @desc Create a tablesorter interface and sort on the first and secound column column headers.
+* 
+* @example $('table').tablesorter({ headers: { 0: { sorter: false}, 1: {sorter: false} } });
+*          
+* @desc Create a tablesorter interface and disableing the first and second  column headers.
+*      
+* 
+* @example $('table').tablesorter({ headers: { 0: {sorter:"integer"}, 1: {sorter:"currency"} } });
+* 
+* @desc Create a tablesorter interface and set a column parser for the first
+*       and second column.
+* 
+* 
+* @param Object
+*            settings An object literal containing key/value pairs to provide
+*            optional settings.
+* 
+* 
+* @option String cssHeader (optional) A string of the class name to be appended
+*         to sortable tr elements in the thead of the table. Default value:
+*         "header"
+* 
+* @option String cssAsc (optional) A string of the class name to be appended to
+*         sortable tr elements in the thead on a ascending sort. Default value:
+*         "headerSortUp"
+* 
+* @option String cssDesc (optional) A string of the class name to be appended
+*         to sortable tr elements in the thead on a descending sort. Default
+*         value: "headerSortDown"
+* 
+* @option String sortInitialOrder (optional) A string of the inital sorting
+*         order can be asc or desc. Default value: "asc"
+* 
+* @option String sortMultisortKey (optional) A string of the multi-column sort
+*         key. Default value: "shiftKey"
+* 
+* @option String textExtraction (optional) A string of the text-extraction
+*         method to use. For complex html structures inside td cell set this
+*         option to "complex", on large tables the complex option can be slow.
+*         Default value: "simple"
+* 
+* @option Object headers (optional) An array containing the forces sorting
+*         rules. This option let's you specify a default sorting rule. Default
+*         value: null
+* 
+* @option Array sortList (optional) An array containing the forces sorting
+*         rules. This option let's you specify a default sorting rule. Default
+*         value: null
+* 
+* @option Array sortForce (optional) An array containing forced sorting rules.
+*         This option let's you specify a default sorting rule, which is
+*         prepended to user-selected rules. Default value: null
+* 
+* @option Boolean sortLocaleCompare (optional) Boolean flag indicating whatever
+*         to use String.localeCampare method or not. Default set to true.
+* 
+* 
+* @option Array sortAppend (optional) An array containing forced sorting rules.
+*         This option let's you specify a default sorting rule, which is
+*         appended to user-selected rules. Default value: null
+* 
+* @option Boolean widthFixed (optional) Boolean flag indicating if tablesorter
+*         should apply fixed widths to the table columns. This is usefull when
+*         using the pager companion plugin. This options requires the dimension
+*         jquery plugin. Default value: false
+* 
+* @option Boolean cancelSelection (optional) Boolean flag indicating if
+*         tablesorter should cancel selection of the table headers text.
+*         Default value: true
+* 
+* @option Boolean debug (optional) Boolean flag indicating if tablesorter
+*         should display debuging information usefull for development.
+* 
+* @type jQuery
+* 
+* @name tablesorter
+* 
+* @cat Plugins/Tablesorter
+* 
+* @author Christian Bach/christian.bach@polyester.se
+*/
+ +

(function ($) {

+ +
$.extend({
+    tablesorter: new
+    function () {
+
+        var parsers = [],
+            widgets = [];
+
+        this.defaults = {
+            cssHeader: "header",
+            cssAsc: "headerSortUp",
+            cssDesc: "headerSortDown",
+            cssChildRow: "expand-child",
+            sortInitialOrder: "asc",
+            sortMultiSortKey: "shiftKey",
+            sortForce: null,
+            sortAppend: null,
+            sortLocaleCompare: true,
+            textExtraction: "simple",
+            parsers: {}, widgets: [],
+            widgetZebra: {
+                css: ["even", "odd"]
+            }, headers: {}, widthFixed: false,
+            cancelSelection: true,
+            sortList: [],
+            headerList: [],
+            dateFormat: "us",
+            decimal: '/\.|\,/g',
+            onRenderHeader: null,
+            selectorHeaders: 'thead th',
+            debug: false
+        };
+
+        /* debuging utils */
+
+        function benchmark(s, d) {
+            log(s + "," + (new Date().getTime() - d.getTime()) + "ms");
+        }
+
+        this.benchmark = benchmark;
+
+        function log(s) {
+            if (typeof console != "undefined" && typeof console.debug != "undefined") {
+                console.log(s);
+            } else {
+                alert(s);
+            }
+        }
+
+        /* parsers utils */
+
+        function buildParserCache(table, $headers) {
+
+            if (table.config.debug) {
+                var parsersDebug = "";
+            }
+
+            if (table.tBodies.length == 0) return; // In the case of empty tables
+            var rows = table.tBodies[0].rows;
+
+            if (rows[0]) {
+
+                var list = [],
+                    cells = rows[0].cells,
+                    l = cells.length;
+
+                for (var i = 0; i < l; i++) {
+
+                    var p = false;
+
+                    if ($.metadata && ($($headers[i]).metadata() && $($headers[i]).metadata().sorter)) {
+
+                        p = getParserById($($headers[i]).metadata().sorter);
+
+                    } else if ((table.config.headers[i] && table.config.headers[i].sorter)) {
+
+                        p = getParserById(table.config.headers[i].sorter);
+                    }
+                    if (!p) {
+
+                        p = detectParserForColumn(table, rows, -1, i);
+                    }
+
+                    if (table.config.debug) {
+                        parsersDebug += "column:" + i + " parser:" + p.id + "\n";
+                    }
+
+                    list.push(p);
+                }
+            }
+
+            if (table.config.debug) {
+                log(parsersDebug);
+            }
+
+            return list;
+        };
+
+        function detectParserForColumn(table, rows, rowIndex, cellIndex) {
+            var l = parsers.length,
+                node = false,
+                nodeValue = false,
+                keepLooking = true;
+            while (nodeValue == '' && keepLooking) {
+                rowIndex++;
+                if (rows[rowIndex]) {
+                    node = getNodeFromRowAndCellIndex(rows, rowIndex, cellIndex);
+                    nodeValue = trimAndGetNodeText(table.config, node);
+                    if (table.config.debug) {
+                        log('Checking if value was empty on row:' + rowIndex);
+                    }
+                } else {
+                    keepLooking = false;
+                }
+            }
+            for (var i = 1; i < l; i++) {
+                if (parsers[i].is(nodeValue, table, node)) {
+                    return parsers[i];
+                }
+            }
+            // 0 is always the generic parser (text)
+            return parsers[0];
+        }
+
+        function getNodeFromRowAndCellIndex(rows, rowIndex, cellIndex) {
+            return rows[rowIndex].cells[cellIndex];
+        }
+
+        function trimAndGetNodeText(config, node) {
+            return $.trim(getElementText(config, node));
+        }
+
+        function getParserById(name) {
+            var l = parsers.length;
+            for (var i = 0; i < l; i++) {
+                if (parsers[i].id.toLowerCase() == name.toLowerCase()) {
+                    return parsers[i];
+                }
+            }
+            return false;
+        }
+
+        /* utils */
+
+        function buildCache(table) {
+
+            if (table.config.debug) {
+                var cacheTime = new Date();
+            }
+
+            var totalRows = (table.tBodies[0] && table.tBodies[0].rows.length) || 0,
+                totalCells = (table.tBodies[0].rows[0] && table.tBodies[0].rows[0].cells.length) || 0,
+                parsers = table.config.parsers,
+                cache = {
+                    row: [],
+                    normalized: []
+                };
+
+            for (var i = 0; i < totalRows; ++i) {
+
+                /** Add the table data to main data array */
+                var c = $(table.tBodies[0].rows[i]),
+                    cols = [];
+
+                // if this is a child row, add it to the last row's children and
+                // continue to the next row
+                if (c.hasClass(table.config.cssChildRow)) {
+                    cache.row[cache.row.length - 1] = cache.row[cache.row.length - 1].add(c);
+                    // go to the next for loop
+                    continue;
+                }
+
+                cache.row.push(c);
+
+                for (var j = 0; j < totalCells; ++j) {
+                    cols.push(parsers[j].format(getElementText(table.config, c[0].cells[j]), table, c[0].cells[j]));
+                }
+
+                cols.push(cache.normalized.length); // add position for rowCache
+                cache.normalized.push(cols);
+                cols = null;
+            };
+
+            if (table.config.debug) {
+                benchmark("Building cache for " + totalRows + " rows:", cacheTime);
+            }
+
+            return cache;
+        };
+
+        function getElementText(config, node) {
+
+            var text = "";
+
+            if (!node) return "";
+
+            if (!config.supportsTextContent) config.supportsTextContent = node.textContent || false;
+
+            if (config.textExtraction == "simple") {
+                if (config.supportsTextContent) {
+                    text = node.textContent;
+                } else {
+                    if (node.childNodes[0] && node.childNodes[0].hasChildNodes()) {
+                        text = node.childNodes[0].innerHTML;
+                    } else {
+                        text = node.innerHTML;
+                    }
+                }
+            } else {
+                if (typeof(config.textExtraction) == "function") {
+                    text = config.textExtraction(node);
+                } else {
+                    text = $(node).text();
+                }
+            }
+            return text;
+        }
+
+        function appendToTable(table, cache) {
+
+            if (table.config.debug) {
+                var appendTime = new Date()
+            }
+
+            var c = cache,
+                r = c.row,
+                n = c.normalized,
+                totalRows = n.length,
+                checkCell = (n[0].length - 1),
+                tableBody = $(table.tBodies[0]),
+                rows = [];
+
+            for (var i = 0; i < totalRows; i++) {
+                var pos = n[i][checkCell];
+
+                rows.push(r[pos]);
+
+                if (!table.config.appender) {
+
+                    //var o = ;
+                    var l = r[pos].length;
+                    for (var j = 0; j < l; j++) {
+                        tableBody[0].appendChild(r[pos][j]);
+                    }
+
+                    // 
+                }
+            }
+
+            if (table.config.appender) {
+
+                table.config.appender(table, rows);
+            }
+
+            rows = null;
+
+            if (table.config.debug) {
+                benchmark("Rebuilt table:", appendTime);
+            }
+
+            // apply table widgets
+            applyWidget(table);
+
+            // trigger sortend
+            setTimeout(function () {
+                $(table).trigger("sortEnd");
+            }, 0);
+
+        };
+
+        function buildHeaders(table) {
+
+            if (table.config.debug) {
+                var time = new Date();
+            }
+
+            var meta = ($.metadata) ? true : false;
+
+            var header_index = computeTableHeaderCellIndexes(table);
+
+            $tableHeaders = $(table.config.selectorHeaders, table).each(function (index) {
+
+                this.column = header_index[this.parentNode.rowIndex + "-" + this.cellIndex];
+                // this.column = index;
+                this.order = formatSortingOrder(table.config.sortInitialOrder);
+
+                                    this.count = this.order;
+
+                if (checkHeaderMetadata(this) || checkHeaderOptions(table, index)) this.sortDisabled = true;
+                                    if (checkHeaderOptionsSortingLocked(table, index)) this.order = this.lockedOrder = checkHeaderOptionsSortingLocked(table, index);
+
+                if (!this.sortDisabled) {
+                    var $th = $(this).addClass(table.config.cssHeader);
+                    if (table.config.onRenderHeader) table.config.onRenderHeader.apply($th);
+                }
+
+                // add cell to headerList
+                table.config.headerList[index] = this;
+            });
+
+            if (table.config.debug) {
+                benchmark("Built headers:", time);
+                log($tableHeaders);
+            }
+
+            return $tableHeaders;
+
+        };
+
+        // from:
+        // http://www.javascripttoolbox.com/lib/table/examples.php
+        // http://www.javascripttoolbox.com/temp/table_cellindex.html
+
+        function computeTableHeaderCellIndexes(t) {
+            var matrix = [];
+            var lookup = {};
+            var thead = t.getElementsByTagName('THEAD')[0];
+            var trs = thead.getElementsByTagName('TR');
+
+            for (var i = 0; i < trs.length; i++) {
+                var cells = trs[i].cells;
+                for (var j = 0; j < cells.length; j++) {
+                    var c = cells[j];
+
+                    var rowIndex = c.parentNode.rowIndex;
+                    var cellId = rowIndex + "-" + c.cellIndex;
+                    var rowSpan = c.rowSpan || 1;
+                    var colSpan = c.colSpan || 1
+                    var firstAvailCol;
+                    if (typeof(matrix[rowIndex]) == "undefined") {
+                        matrix[rowIndex] = [];
+                    }
+                    // Find first available column in the first row
+                    for (var k = 0; k < matrix[rowIndex].length + 1; k++) {
+                        if (typeof(matrix[rowIndex][k]) == "undefined") {
+                            firstAvailCol = k;
+                            break;
+                        }
+                    }
+                    lookup[cellId] = firstAvailCol;
+                    for (var k = rowIndex; k < rowIndex + rowSpan; k++) {
+                        if (typeof(matrix[k]) == "undefined") {
+                            matrix[k] = [];
+                        }
+                        var matrixrow = matrix[k];
+                        for (var l = firstAvailCol; l < firstAvailCol + colSpan; l++) {
+                            matrixrow[l] = "x";
+                        }
+                    }
+                }
+            }
+            return lookup;
+        }
+
+        function checkCellColSpan(table, rows, row) {
+            var arr = [],
+                r = table.tHead.rows,
+                c = r[row].cells;
+
+            for (var i = 0; i < c.length; i++) {
+                var cell = c[i];
+
+                if (cell.colSpan > 1) {
+                    arr = arr.concat(checkCellColSpan(table, headerArr, row++));
+                } else {
+                    if (table.tHead.length == 1 || (cell.rowSpan > 1 || !r[row + 1])) {
+                        arr.push(cell);
+                    }
+                    // headerArr[row] = (i+row);
+                }
+            }
+            return arr;
+        };
+
+        function checkHeaderMetadata(cell) {
+            if (($.metadata) && ($(cell).metadata().sorter === false)) {
+                return true;
+            };
+            return false;
+        }
+
+        function checkHeaderOptions(table, i) {
+            if ((table.config.headers[i]) && (table.config.headers[i].sorter === false)) {
+                return true;
+            };
+            return false;
+        }
+
+                     function checkHeaderOptionsSortingLocked(table, i) {
+            if ((table.config.headers[i]) && (table.config.headers[i].lockedOrder)) return table.config.headers[i].lockedOrder;
+            return false;
+        }
+
+        function applyWidget(table) {
+            var c = table.config.widgets;
+            var l = c.length;
+            for (var i = 0; i < l; i++) {
+
+                getWidgetById(c[i]).format(table);
+            }
+
+        }
+
+        function getWidgetById(name) {
+            var l = widgets.length;
+            for (var i = 0; i < l; i++) {
+                if (widgets[i].id.toLowerCase() == name.toLowerCase()) {
+                    return widgets[i];
+                }
+            }
+        };
+
+        function formatSortingOrder(v) {
+            if (typeof(v) != "Number") {
+                return (v.toLowerCase() == "desc") ? 1 : 0;
+            } else {
+                return (v == 1) ? 1 : 0;
+            }
+        }
+
+        function isValueInArray(v, a) {
+            var l = a.length;
+            for (var i = 0; i < l; i++) {
+                if (a[i][0] == v) {
+                    return true;
+                }
+            }
+            return false;
+        }
+
+        function setHeadersCss(table, $headers, list, css) {
+            // remove all header information
+            $headers.removeClass(css[0]).removeClass(css[1]);
+
+            var h = [];
+            $headers.each(function (offset) {
+                if (!this.sortDisabled) {
+                    h[this.column] = $(this);
+                }
+            });
+
+            var l = list.length;
+            for (var i = 0; i < l; i++) {
+                h[list[i][0]].addClass(css[list[i][1]]);
+            }
+        }
+
+        function fixColumnWidth(table, $headers) {
+            var c = table.config;
+            if (c.widthFixed) {
+                var colgroup = $('<colgroup>');
+                $("tr:first td", table.tBodies[0]).each(function () {
+                    colgroup.append($('<col>').css('width', $(this).width()));
+                });
+                $(table).prepend(colgroup);
+            };
+        }
+
+        function updateHeaderSortCount(table, sortList) {
+            var c = table.config,
+                l = sortList.length;
+            for (var i = 0; i < l; i++) {
+                var s = sortList[i],
+                    o = c.headerList[s[0]];
+                o.count = s[1];
+                o.count++;
+            }
+        }
+
+        /* sorting methods */
+
+        function multisort(table, sortList, cache) {
+
+            if (table.config.debug) {
+                var sortTime = new Date();
+            }
+
+            var dynamicExp = "var sortWrapper = function(a,b) {",
+                l = sortList.length;
+
+            // TODO: inline functions.
+            for (var i = 0; i < l; i++) {
+
+                var c = sortList[i][0];
+                var order = sortList[i][1];
+                // var s = (getCachedSortType(table.config.parsers,c) == "text") ?
+                // ((order == 0) ? "sortText" : "sortTextDesc") : ((order == 0) ?
+                // "sortNumeric" : "sortNumericDesc");
+                // var s = (table.config.parsers[c].type == "text") ? ((order == 0)
+                // ? makeSortText(c) : makeSortTextDesc(c)) : ((order == 0) ?
+                // makeSortNumeric(c) : makeSortNumericDesc(c));
+                var s = (table.config.parsers[c].type == "text") ? ((order == 0) ? makeSortFunction("text", "asc", c) : makeSortFunction("text", "desc", c)) : ((order == 0) ? makeSortFunction("numeric", "asc", c) : makeSortFunction("numeric", "desc", c));
+                var e = "e" + i;
+
+                dynamicExp += "var " + e + " = " + s; // + "(a[" + c + "],b[" + c
+                // + "]); ";
+                dynamicExp += "if(" + e + ") { return " + e + "; } ";
+                dynamicExp += "else { ";
+
+            }
+
+            // if value is the same keep orignal order
+            var orgOrderCol = cache.normalized[0].length - 1;
+            dynamicExp += "return a[" + orgOrderCol + "]-b[" + orgOrderCol + "];";
+
+            for (var i = 0; i < l; i++) {
+                dynamicExp += "}; ";
+            }
+
+            dynamicExp += "return 0; ";
+            dynamicExp += "}; ";
+
+            if (table.config.debug) {
+                benchmark("Evaling expression:" + dynamicExp, new Date());
+            }
+
+            eval(dynamicExp);
+
+            cache.normalized.sort(sortWrapper);
+
+            if (table.config.debug) {
+                benchmark("Sorting on " + sortList.toString() + " and dir " + order + " time:", sortTime);
+            }
+
+            return cache;
+        };
+
+        function makeSortFunction(type, direction, index) {
+            var a = "a[" + index + "]",
+                b = "b[" + index + "]";
+            if (type == 'text' && direction == 'asc') {
+                return "(" + a + " == " + b + " ? 0 : (" + a + " === null ? Number.POSITIVE_INFINITY : (" + b + " === null ? Number.NEGATIVE_INFINITY : (" + a + " < " + b + ") ? -1 : 1 )));";
+            } else if (type == 'text' && direction == 'desc') {
+                return "(" + a + " == " + b + " ? 0 : (" + a + " === null ? Number.POSITIVE_INFINITY : (" + b + " === null ? Number.NEGATIVE_INFINITY : (" + b + " < " + a + ") ? -1 : 1 )));";
+            } else if (type == 'numeric' && direction == 'asc') {
+                return "(" + a + " === null && " + b + " === null) ? 0 :(" + a + " === null ? Number.POSITIVE_INFINITY : (" + b + " === null ? Number.NEGATIVE_INFINITY : " + a + " - " + b + "));";
+            } else if (type == 'numeric' && direction == 'desc') {
+                return "(" + a + " === null && " + b + " === null) ? 0 :(" + a + " === null ? Number.POSITIVE_INFINITY : (" + b + " === null ? Number.NEGATIVE_INFINITY : " + b + " - " + a + "));";
+            }
+        };
+
+        function makeSortText(i) {
+            return "((a[" + i + "] < b[" + i + "]) ? -1 : ((a[" + i + "] > b[" + i + "]) ? 1 : 0));";
+        };
+
+        function makeSortTextDesc(i) {
+            return "((b[" + i + "] < a[" + i + "]) ? -1 : ((b[" + i + "] > a[" + i + "]) ? 1 : 0));";
+        };
+
+        function makeSortNumeric(i) {
+            return "a[" + i + "]-b[" + i + "];";
+        };
+
+        function makeSortNumericDesc(i) {
+            return "b[" + i + "]-a[" + i + "];";
+        };
+
+        function sortText(a, b) {
+            if (table.config.sortLocaleCompare) return a.localeCompare(b);
+            return ((a < b) ? -1 : ((a > b) ? 1 : 0));
+        };
+
+        function sortTextDesc(a, b) {
+            if (table.config.sortLocaleCompare) return b.localeCompare(a);
+            return ((b < a) ? -1 : ((b > a) ? 1 : 0));
+        };
+
+        function sortNumeric(a, b) {
+            return a - b;
+        };
+
+        function sortNumericDesc(a, b) {
+            return b - a;
+        };
+
+        function getCachedSortType(parsers, i) {
+            return parsers[i].type;
+        }; /* public methods */
+        this.construct = function (settings) {
+            return this.each(function () {
+                // if no thead or tbody quit.
+                if (!this.tHead || !this.tBodies) return;
+                // declare
+                var $this, $document, $headers, cache, config, shiftDown = 0,
+                    sortOrder;
+                // new blank config object
+                this.config = {};
+                // merge and extend.
+                config = $.extend(this.config, $.tablesorter.defaults, settings);
+                // store common expression for speed
+                $this = $(this);
+                // save the settings where they read
+                $.data(this, "tablesorter", config);
+                // build headers
+                $headers = buildHeaders(this);
+                // try to auto detect column type, and store in tables config
+                this.config.parsers = buildParserCache(this, $headers);
+                // build the cache for the tbody cells
+                cache = buildCache(this);
+                // get the css class names, could be done else where.
+                var sortCSS = [config.cssDesc, config.cssAsc];
+                // fixate columns if the users supplies the fixedWidth option
+                fixColumnWidth(this);
+                // apply event handling to headers
+                // this is to big, perhaps break it out?
+                $headers.click(
+
+                function (e) {
+                    var totalRows = ($this[0].tBodies[0] && $this[0].tBodies[0].rows.length) || 0;
+                    if (!this.sortDisabled && totalRows > 0) {
+                        // Only call sortStart if sorting is
+                        // enabled.
+                        $this.trigger("sortStart");
+                        // store exp, for speed
+                        var $cell = $(this);
+                        // get current column index
+                        var i = this.column;
+                        // get current column sort order
+                        this.order = this.count++ % 2;
+                                                    // always sort on the locked order.
+                                                    if(this.lockedOrder) this.order = this.lockedOrder;
+
+                                                    // user only whants to sort on one
+                        // column
+                        if (!e[config.sortMultiSortKey]) {
+                            // flush the sort list
+                            config.sortList = [];
+                            if (config.sortForce != null) {
+                                var a = config.sortForce;
+                                for (var j = 0; j < a.length; j++) {
+                                    if (a[j][0] != i) {
+                                        config.sortList.push(a[j]);
+                                    }
+                                }
+                            }
+                            // add column to sort list
+                            config.sortList.push([i, this.order]);
+                            // multi column sorting
+                        } else {
+                            // the user has clicked on an all
+                            // ready sortet column.
+                            if (isValueInArray(i, config.sortList)) {
+                                // revers the sorting direction
+                                // for all tables.
+                                for (var j = 0; j < config.sortList.length; j++) {
+                                    var s = config.sortList[j],
+                                        o = config.headerList[s[0]];
+                                    if (s[0] == i) {
+                                        o.count = s[1];
+                                        o.count++;
+                                        s[1] = o.count % 2;
+                                    }
+                                }
+                            } else {
+                                // add column to sort list array
+                                config.sortList.push([i, this.order]);
+                            }
+                        };
+                        setTimeout(function () {
+                            // set css for headers
+                            setHeadersCss($this[0], $headers, config.sortList, sortCSS);
+                            appendToTable(
+                                    $this[0], multisort(
+                                    $this[0], config.sortList, cache)
+                                                            );
+                        }, 1);
+                        // stop normal event by returning false
+                        return false;
+                    }
+                    // cancel selection
+                }).mousedown(function () {
+                    if (config.cancelSelection) {
+                        this.onselectstart = function () {
+                            return false
+                        };
+                        return false;
+                    }
+                });
+                // apply easy methods that trigger binded events
+                $this.bind("update", function () {
+                    var me = this;
+                    setTimeout(function () {
+                        // rebuild parsers.
+                        me.config.parsers = buildParserCache(
+                        me, $headers);
+                        // rebuild the cache map
+                        cache = buildCache(me);
+                    }, 1);
+                }).bind("updateCell", function (e, cell) {
+                    var config = this.config;
+                    // get position from the dom.
+                    var pos = [(cell.parentNode.rowIndex - 1), cell.cellIndex];
+                    // update cache
+                    cache.normalized[pos[0]][pos[1]] = config.parsers[pos[1]].format(
+                    getElementText(config, cell), cell);
+                }).bind("sorton", function (e, list) {
+                    $(this).trigger("sortStart");
+                    config.sortList = list;
+                    // update and store the sortlist
+                    var sortList = config.sortList;
+                    // update header count index
+                    updateHeaderSortCount(this, sortList);
+                    // set css for headers
+                    setHeadersCss(this, $headers, sortList, sortCSS);
+                    // sort the table and append it to the dom
+                    appendToTable(this, multisort(this, sortList, cache));
+                }).bind("appendCache", function () {
+                    appendToTable(this, cache);
+                }).bind("applyWidgetId", function (e, id) {
+                    getWidgetById(id).format(this);
+                }).bind("applyWidgets", function () {
+                    // apply widgets
+                    applyWidget(this);
+                });
+                if ($.metadata && ($(this).metadata() && $(this).metadata().sortlist)) {
+                    config.sortList = $(this).metadata().sortlist;
+                }
+                // if user has supplied a sort list to constructor.
+                if (config.sortList.length > 0) {
+                    $this.trigger("sorton", [config.sortList]);
+                }
+                // apply widgets
+                applyWidget(this);
+            });
+        };
+        this.addParser = function (parser) {
+            var l = parsers.length,
+                a = true;
+            for (var i = 0; i < l; i++) {
+                if (parsers[i].id.toLowerCase() == parser.id.toLowerCase()) {
+                    a = false;
+                }
+            }
+            if (a) {
+                parsers.push(parser);
+            };
+        };
+        this.addWidget = function (widget) {
+            widgets.push(widget);
+        };
+        this.formatFloat = function (s) {
+            var i = parseFloat(s);
+            return (isNaN(i)) ? 0 : i;
+        };
+        this.formatInt = function (s) {
+            var i = parseInt(s);
+            return (isNaN(i)) ? 0 : i;
+        };
+        this.isDigit = function (s, config) {
+            // replace all an wanted chars and match.
+            return /^[-+]?\d*$/.test($.trim(s.replace(/[,.']/g, '')));
+        };
+        this.clearTableBody = function (table) {
+            if ($.browser.msie) {
+                function empty() {
+                    while (this.firstChild)
+                    this.removeChild(this.firstChild);
+                }
+                empty.apply(table.tBodies[0]);
+            } else {
+                table.tBodies[0].innerHTML = "";
+            }
+        };
+    }
+});
+
+// extend plugin scope
+$.fn.extend({
+    tablesorter: $.tablesorter.construct
+});
+
+// make shortcut
+var ts = $.tablesorter;
+
+// add default parsers
+ts.addParser({
+    id: "text",
+    is: function (s) {
+        return true;
+    }, format: function (s) {
+        return $.trim(s.toLocaleLowerCase());
+    }, type: "text"
+});
+
+ts.addParser({
+    id: "digit",
+    is: function (s, table) {
+        var c = table.config;
+        return $.tablesorter.isDigit(s, c);
+    }, format: function (s) {
+        return $.tablesorter.formatFloat(s);
+    }, type: "numeric"
+});
+
+ts.addParser({
+    id: "currency",
+    is: function (s) {
+        return /^[£$€?.]/.test(s);
+    }, format: function (s) {
+        return $.tablesorter.formatFloat(s.replace(new RegExp(/[£$€]/g), ""));
+    }, type: "numeric"
+});
+
+ts.addParser({
+    id: "ipAddress",
+    is: function (s) {
+        return /^\d{2,3}[\.]\d{2,3}[\.]\d{2,3}[\.]\d{2,3}$/.test(s);
+    }, format: function (s) {
+        var a = s.split("."),
+            r = "",
+            l = a.length;
+        for (var i = 0; i < l; i++) {
+            var item = a[i];
+            if (item.length == 2) {
+                r += "0" + item;
+            } else {
+                r += item;
+            }
+        }
+        return $.tablesorter.formatFloat(r);
+    }, type: "numeric"
+});
+
+ts.addParser({
+    id: "url",
+    is: function (s) {
+        return /^(https?|ftp|file):\/\/$/.test(s);
+    }, format: function (s) {
+        return jQuery.trim(s.replace(new RegExp(/(https?|ftp|file):\/\//), ''));
+    }, type: "text"
+});
+
+ts.addParser({
+    id: "isoDate",
+    is: function (s) {
+        return /^\d{4}[\/-]\d{1,2}[\/-]\d{1,2}$/.test(s);
+    }, format: function (s) {
+        return $.tablesorter.formatFloat((s != "") ? new Date(s.replace(
+        new RegExp(/-/g), "/")).getTime() : "0");
+    }, type: "numeric"
+});
+
+ts.addParser({
+    id: "percent",
+    is: function (s) {
+        return /\%$/.test($.trim(s));
+    }, format: function (s) {
+        return $.tablesorter.formatFloat(s.replace(new RegExp(/%/g), ""));
+    }, type: "numeric"
+});
+
+ts.addParser({
+    id: "usLongDate",
+    is: function (s) {
+        return s.match(new RegExp(/^[A-Za-z]{3,10}\.? [0-9]{1,2}, ([0-9]{4}|'?[0-9]{2}) (([0-2]?[0-9]:[0-5][0-9])|([0-1]?[0-9]:[0-5][0-9]\s(AM|PM)))$/));
+    }, format: function (s) {
+        return $.tablesorter.formatFloat(new Date(s).getTime());
+    }, type: "numeric"
+});
+
+ts.addParser({
+    id: "shortDate",
+    is: function (s) {
+        return /\d{1,2}[\/\-]\d{1,2}[\/\-]\d{2,4}/.test(s);
+    }, format: function (s, table) {
+        var c = table.config;
+        s = s.replace(/\-/g, "/");
+        if (c.dateFormat == "us") {
+            // reformat the string in ISO format
+            s = s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{4})/, "$3/$1/$2");
+        } else if (c.dateFormat == "uk") {
+            // reformat the string in ISO format
+            s = s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{4})/, "$3/$2/$1");
+        } else if (c.dateFormat == "dd/mm/yy" || c.dateFormat == "dd-mm-yy") {
+            s = s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{2})/, "$1/$2/$3");
+        }
+        return $.tablesorter.formatFloat(new Date(s).getTime());
+    }, type: "numeric"
+});
+ts.addParser({
+    id: "time",
+    is: function (s) {
+        return /^(([0-2]?[0-9]:[0-5][0-9])|([0-1]?[0-9]:[0-5][0-9]\s(am|pm)))$/.test(s);
+    }, format: function (s) {
+        return $.tablesorter.formatFloat(new Date("2000/01/01 " + s).getTime());
+    }, type: "numeric"
+});
+ts.addParser({
+    id: "metadata",
+    is: function (s) {
+        return false;
+    }, format: function (s, table, cell) {
+        var c = table.config,
+            p = (!c.parserMetadataName) ? 'sortValue' : c.parserMetadataName;
+        return $(cell).metadata()[p];
+    }, type: "numeric"
+});
+// add default widgets
+ts.addWidget({
+    id: "zebra",
+    format: function (table) {
+        if (table.config.debug) {
+            var time = new Date();
+        }
+        var $tr, row = -1,
+            odd;
+        // loop through the visible rows
+        $("tr:visible", table.tBodies[0]).each(function (i) {
+            $tr = $(this);
+            // style children rows the same way the parent
+            // row was styled
+            if (!$tr.hasClass(table.config.cssChildRow)) row++;
+            odd = (row % 2 == 0);
+            $tr.removeClass(
+            table.config.widgetZebra.css[odd ? 0 : 1]).addClass(
+            table.config.widgetZebra.css[odd ? 1 : 0])
+        });
+        if (table.config.debug) {
+            $.tablesorter.benchmark("Applying Zebra widget", time);
+        }
+    }
+});
+ +

})(jQuery);

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/assets/vendor/javascripts/jquery_tablesorter_min_js.html b/doc/tmp/rubycritic/assets/vendor/javascripts/jquery_tablesorter_min_js.html new file mode 100644 index 0000000000..e00cea1614 --- /dev/null +++ b/doc/tmp/rubycritic/assets/vendor/javascripts/jquery_tablesorter_min_js.html @@ -0,0 +1,1630 @@ + + + + + + + +jquery.tablesorter.min.js - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

(function($){$.extend({tablesorter:new function(){var parsers=[],widgets=[];this.defaults={cssHeader:“header”,cssAsc:“headerSortUp”,cssDesc:“headerSortDown”,cssChildRow:“expand-child”,sortInitialOrder:“asc”,sortMultiSortKey:“shiftKey”,sortForce:null,sortAppend:null,sortLocaleCompare:true,textExtraction:“simple”,parsers:{},widgets:[],widgetZebra:{css:[“even”,“odd”]},headers:{},widthFixed:false,cancelSelection:true,sortList:[],headerList:[],dateFormat:“us”,decimal:‘/\.|\,/g’,onRenderHeader:null,selectorHeaders:‘thead th’,debug:false};function benchmark(s,d){log(s+“,”+(new Date().getTime()-d.getTime())+“ms”);}this.benchmark=benchmark;function log(s){if(typeof console!=“undefined”&&typeof console.debug!=“undefined”){console.log(s);}else{alert(s);}}function buildParserCache(table,$headers){if(table.config.debug){var parsersDebug=“”;}if(table.tBodies.length==0)return;var rows=table.tBodies[0].rows;if(rows){var list=[],cells=rows.cells,l=cells.length;for(var i=0;i<l;i++){var p=false;if($.metadata&&($($headers).metadata()&&$($headers).metadata().sorter)){p=getParserById($($headers).metadata().sorter);}else if((table.config.headers[i]&&table.config.headers[i].sorter)){p=getParserById(table.config.headers[i].sorter);}if(!p){p=detectParserForColumn(table,rows,-1,i);}if(table.config.debug){parsersDebug+=“column:”i“ parser:”p.id“\n”;}list.push(p);}}if(table.config.debug){log(parsersDebug);}return list;};function detectParserForColumn(table,rows,rowIndex,cellIndex){var l=parsers.length,node=false,nodeValue=false,keepLooking=true;while(nodeValue==”&&keepLooking){rowIndex++;if(rows){node=getNodeFromRowAndCellIndex(rows,rowIndex,cellIndex);nodeValue=trimAndGetNodeText(table.config,node);if(table.config.debug){log(‘Checking if value was empty on row:’+rowIndex);}}else{keepLooking=false;}}for(var i=1;i<l;i++){if(parsers.is(nodeValue,table,node)){return parsers;}}return parsers;}function getNodeFromRowAndCellIndex(rows,rowIndex,cellIndex){return rows.cells[cellIndex];}function trimAndGetNodeText(config,node){return $.trim(getElementText(config,node));}function getParserById(name){var l=parsers.length;for(var i=0;i<l;i++){if(parsers.id.toLowerCase()==name.toLowerCase()){return parsers;}}return false;}function buildCache(table){if(table.config.debug){var cacheTime=new Date();}var totalRows=(table.tBodies[0]&&table.tBodies[0].rows.length)||0,totalCells=(table.tBodies[0].rows[0]&&table.tBodies[0].rows[0].cells.length)||0,parsers=table.config.parsers,cache={row:[],normalized:[]};for(var i=0;i<totalRows;++i){var c=$(table.tBodies[0].rows[i]),cols=[];if(c.hasClass(table.config.cssChildRow)){cache.row[cache.row.length-1]=cache.row[cache.row.length-1].add©;continue;}cache.row.push©;for(var j=0;j<totalCells;++j){cols.push(parsers.format(getElementText(table.config,c.cells[j]),table,c.cells[j]));}cols.push(cache.normalized.length);cache.normalized.push(cols);cols=null;};if(table.config.debug){benchmark(“Building cache for ”totalRows“ rows:”,cacheTime);}return cache;};function getElementText(config,node){var text=“”;if(!node)return“”;if(!config.supportsTextContent)config.supportsTextContent=node.textContent||false;if(config.textExtraction==“simple”){if(config.supportsTextContent){text=node.textContent;}else{if(node.childNodes[0]&&node.childNodes[0].hasChildNodes()){text=node.childNodes[0].innerHTML;}else{text=node.innerHTML;}}}else{if(typeof(config.textExtraction)==“function”){text=config.textExtraction(node);}else{text=$(node).text();}}return text;}function appendToTable(table,cache){if(table.config.debug){var appendTime=new Date()}var c=cache,r=c.row,n=c.normalized,totalRows=n.length,checkCell=(n.length-1),tableBody=$(table.tBodies[0]),rows=[];for(var i=0;i<totalRows;i++){var pos=n[checkCell];rows.push(r);if(!table.config.appender){var l=r.length;for(var j=0;j<l;j++){tableBody.appendChild(r[j]);}}}if(table.config.appender){table.config.appender(table,rows);}rows=null;if(table.config.debug){benchmark(“Rebuilt table:”,appendTime);}applyWidget(table);setTimeout(function(){$(table).trigger(“sortEnd”);},0);};function buildHeaders(table){if(table.config.debug){var time=new Date();}var meta=($.metadata)?true:false;var header_index=computeTableHeaderCellIndexes(table);$tableHeaders=$(table.config.selectorHeaders,table).each(function(index){this.column=header_index;this.order=formatSortingOrder(table.config.sortInitialOrder);this.count=this.order;if(checkHeaderMetadata(this)||checkHeaderOptions(table,index))this.sortDisabled=true;if(checkHeaderOptionsSortingLocked(table,index))this.order=this.lockedOrder=checkHeaderOptionsSortingLocked(table,index);if(!this.sortDisabled){var $th=$(this).addClass(table.config.cssHeader);if(table.config.onRenderHeader)table.config.onRenderHeader.apply($th);}table.config.headerList[index]=this;});if(table.config.debug){benchmark(“Built headers:”,time);log($tableHeaders);}return $tableHeaders;};function computeTableHeaderCellIndexes(t){var matrix=[];var lookup={};var thead=t.getElementsByTagName(‘THEAD’)[0];var trs=thead.getElementsByTagName(‘TR’);for(var i=0;i<trs.length;i++){var cells=trs.cells;for(var j=0;j<cells.length;j++){var c=cells;var rowIndex=c.parentNode.rowIndex;var cellId=rowIndex+“-”+c.cellIndex;var rowSpan=c.rowSpan||1;var colSpan=c.colSpan||1 var firstAvailCol;if(typeof(matrix)==“undefined”){matrix=[];}for(var k=0;k<matrix.length+1;k++){if(typeof(matrix[k])==“undefined”){firstAvailCol=k;break;}}lookup=firstAvailCol;for(var k=rowIndex;k<rowIndex+rowSpan;k++){if(typeof(matrix)==“undefined”){matrix=[];}var matrixrow=matrix;for(var l=firstAvailCol;l<firstAvailCol+colSpan;l++){matrixrow=“x”;}}}}return lookup;}function checkCellColSpan(table,rows,row){var arr=[],r=table.tHead.rows,c=r.cells;for(var i=0;i<c.length;i++){var cell=c;if(cell.colSpan>1){arr=arr.concat(checkCellColSpan(table,headerArr,row++));}else{if(table.tHead.length==1||(cell.rowSpan>1||!r)){arr.push(cell);}}}return arr;};function checkHeaderMetadata(cell){if(($.metadata)&&($(cell).metadata().sorter===false)){return true;};return false;}function checkHeaderOptions(table,i){if((table.config.headers[i])&&(table.config.headers[i].sorter===false)){return true;};return false;}function checkHeaderOptionsSortingLocked(table,i){if((table.config.headers[i])&&(table.config.headers[i].lockedOrder))return table.config.headers[i].lockedOrder;return false;}function applyWidget(table){var c=table.config.widgets;var l=c.length;for(var i=0;i<l;i++){getWidgetById(c).format(table);}}function getWidgetById(name){var l=widgets.length;for(var i=0;i<l;i++){if(widgets.id.toLowerCase()==name.toLowerCase()){return widgets;}}};function formatSortingOrder(v){if(typeof(v)!=“Number”){return(v.toLowerCase()==“desc”)?1:0;}else{return(v==1)?1:0;}}function isValueInArray(v,a){var l=a.length;for(var i=0;i<l;i++){if(a[0]==v){return true;}}return false;}function setHeadersCss(table,$headers,list,css){$headers.removeClass(css).removeClass(css);var h=[];$headers.each(function(offset){if(!this.sortDisabled){h=$(this);}});var l=list.length;for(var i=0;i<l;i++){h[list[0]].addClass(css[list[1]]);}}function fixColumnWidth(table,$headers){var c=table.config;if(c.widthFixed){var colgroup=$(‘<colgroup>’);$(“tr:first td”,table.tBodies[0]).each(function(){colgroup.append($(‘<col>’).css(‘width’,$(this).width()));});$(table).prepend(colgroup);};}function updateHeaderSortCount(table,sortList){var c=table.config,l=sortList.length;for(var i=0;i<l;i++){var s=sortList,o=c.headerList[s];o.count=s;o.count++;}}function multisort(table,sortList,cache){if(table.config.debug){var sortTime=new Date();}var dynamicExp=“var sortWrapper = function(a,b) {”,l=sortList.length;for(var i=0;i<l;i++){var c=sortList[0];var order=sortList[1];var s=(table.config.parsers[c].type==“text”)?((order==0)?makeSortFunction(“text”,“asc”,c):makeSortFunction(“text”,“desc”,c)):((order==0)?makeSortFunction(“numeric”,“asc”,c):makeSortFunction(“numeric”,“desc”,c));var e=“e”+i;dynamicExp+=“var ”e“ = ”+s;dynamicExp+=“if(”e“) { return ”e“; } ”;dynamicExp+=“else { ”;}var orgOrderCol=cache.normalized[0].length-1;dynamicExp+=“return a-b;”;for(var i=0;i<l;i++){dynamicExp+=“}; ”;}dynamicExp+=“return 0; ”;dynamicExp+=“}; ”;if(table.config.debug){benchmark(“Evaling expression:”+dynamicExp,new Date());}eval(dynamicExp);cache.normalized.sort(sortWrapper);if(table.config.debug){benchmark(“Sorting on ”+sortList.toString()+“ and dir ”order“ time:”,sortTime);}return cache;};function makeSortFunction(type,direction,index){var a=“a”,b=“b”;if(type==‘text’&&direction==‘asc’){return“(”a“ == ”b“ ? 0 : (”a“ === null ? Number.POSITIVE_INFINITY : (”b“ === null ? Number.NEGATIVE_INFINITY : (”a“ < ”b“) ? -1 : 1 )));”;}else if(type==‘text’&&direction==‘desc’){return“(”a“ == ”b“ ? 0 : (”a“ === null ? Number.POSITIVE_INFINITY : (”b“ === null ? Number.NEGATIVE_INFINITY : (”b“ < ”a“) ? -1 : 1 )));”;}else if(type==‘numeric’&&direction==‘asc’){return“(”a“ === null && ”b“ === null) ? 0 :(”a“ === null ? Number.POSITIVE_INFINITY : (”b“ === null ? Number.NEGATIVE_INFINITY : ”a“ - ”b“));”;}else if(type==‘numeric’&&direction==‘desc’){return“(”a“ === null && ”b“ === null) ? 0 :(”a“ === null ? Number.POSITIVE_INFINITY : (”b“ === null ? Number.NEGATIVE_INFINITY : ”b“ - ”a“));”;}};function makeSortText(i){return“((a < b) ? -1 : ((a > b) ? 1 : 0));”;};function makeSortTextDesc(i){return“((b < a) ? -1 : ((b > a) ? 1 : 0));”;};function makeSortNumeric(i){return“a-b;”;};function makeSortNumericDesc(i){return“b-a;”;};function sortText(a,b){if(table.config.sortLocaleCompare)return a.localeCompare(b);return((a<b)?-1:((a>b)?1:0));};function sortTextDesc(a,b){if(table.config.sortLocaleCompare)return b.localeCompare(a);return((b<a)?-1:((b>a)?1:0));};function sortNumeric(a,b){return a-b;};function sortNumericDesc(a,b){return b-a;};function getCachedSortType(parsers,i){return parsers.type;};this.construct=function(settings){return this.each(function(){if(!this.tHead||!this.tBodies)return;var $this,$document,$headers,cache,config,shiftDown=0,sortOrder;this.config={};config=$.extend(this.config,$.tablesorter.defaults,settings);$this=$(this);$.data(this,“tablesorter”,config);$headers=buildHeaders(this);this.config.parsers=buildParserCache(this,$headers);cache=buildCache(this);var sortCSS=[config.cssDesc,config.cssAsc];fixColumnWidth(this);$headers.click(function(e){var totalRows=($this.tBodies[0]&&$this.tBodies[0].rows.length)||0;if(!this.sortDisabled&&totalRows>0){$this.trigger(“sortStart”);var $cell=$(this);var i=this.column;this.order=this.count++%2;if(this.lockedOrder)this.order=this.lockedOrder;if(!e){config.sortList=[];if(config.sortForce!=null){var a=config.sortForce;for(var j=0;j<a.length;j++){if(a[0]!=i){config.sortList.push(a);}}}config.sortList.push([i,this.order]);}else{if(isValueInArray(i,config.sortList)){for(var j=0;j<config.sortList.length;j++){var s=config.sortList[j],o=config.headerList[s];if(s==i){o.count=s;o.count++;s=o.count%2;}}}else{config.sortList.push([i,this.order]);}};setTimeout(function(){setHeadersCss($this,$headers,config.sortList,sortCSS);appendToTable($this,multisort($this,config.sortList,cache));},1);return false;}}).mousedown(function(){if(config.cancelSelection){this.onselectstart=function(){return false};return false;}});$this.bind(“update”,function(){var me=this;setTimeout(function(){me.config.parsers=buildParserCache(me,$headers);cache=buildCache(me);},1);}).bind(“updateCell”,function(e,cell){var config=this.config;var pos=[(cell.parentNode.rowIndex-1),cell.cellIndex];cache.normalized[pos][pos]=config.parsers[pos].format(getElementText(config,cell),cell);}).bind(“sorton”,function(e,list){$(this).trigger(“sortStart”);config.sortList=list;var sortList=config.sortList;updateHeaderSortCount(this,sortList);setHeadersCss(this,$headers,sortList,sortCSS);appendToTable(this,multisort(this,sortList,cache));}).bind(“appendCache”,function(){appendToTable(this,cache);}).bind(“applyWidgetId”,function(e,id){getWidgetById(id).format(this);}).bind(“applyWidgets”,function(){applyWidget(this);});if($.metadata&&($(this).metadata()&&$(this).metadata().sortlist)){config.sortList=$(this).metadata().sortlist;}if(config.sortList.length>0){$this.trigger(“sorton”,[config.sortList]);}applyWidget(this);});};this.addParser=function(parser){var l=parsers.length,a=true;for(var i=0;i<l;i++){if(parsers.id.toLowerCase()==parser.id.toLowerCase()){a=false;}}if(a){parsers.push(parser);};};this.addWidget=function(widget){widgets.push(widget);};this.formatFloat=function(s){var i=parseFloat(s);return(isNaN(i))?0:i;};this.formatInt=function(s){var i=parseInt(s);return(isNaN(i))?0:i;};this.isDigit=function(s,config){return/^[-+]?\d*$/.test($.trim(s.replace(/[,.‘]/g,”)));};this.clearTableBody=function(table){if($.browser.msie){function empty(){while(this.firstChild)this.removeChild(this.firstChild);}empty.apply(table.tBodies[0]);}else{table.tBodies[0].innerHTML=“”;}};}});$.fn.extend({tablesorter:$.tablesorter.construct});var ts=$.tablesorter;ts.addParser({id:“text”,is:function(s){return true;},format:function(s){return $.trim(s.toLocaleLowerCase());},type:“text”});ts.addParser({id:“digit”,is:function(s,table){var c=table.config;return $.tablesorter.isDigit(s,c);},format:function(s){return $.tablesorter.formatFloat(s);},type:“numeric”});ts.addParser({id:“currency”,is:function(s){return/^[£$€?.]/.test(s);},format:function(s){return $.tablesorter.formatFloat(s.replace(new RegExp(/[£$€]/g),“”));},type:“numeric”});ts.addParser({id:“ipAddress”,is:function(s){return/^\d{2,3}[\.]\d{2,3}[\.]\d{2,3}[\.]\d{2,3}$/.test(s);},format:function(s){var a=s.split(“.”),r=“”,l=a.length;for(var i=0;i<l;i++){var item=a;if(item.length==2){r+=“0”+item;}else{r+=item;}}return $.tablesorter.formatFloat®;},type:“numeric”});ts.addParser({id:“url”,is:function(s){return/^(https?|ftp|file):\/\/$/.test(s);},format:function(s){return jQuery.trim(s.replace(new RegExp(/(https?|ftp|file):\/\//),”));},type:“text”});ts.addParser({id:“isoDate”,is:function(s){return/^\d{4}[\/-]\d{1,2}[\/-]\d{1,2}$/.test(s);},format:function(s){return $.tablesorter.formatFloat((s!=“”)?new Date(s.replace(new RegExp(/-/g),“/”)).getTime():“0”);},type:“numeric”});ts.addParser({id:“percent”,is:function(s){return/\%$/.test($.trim(s));},format:function(s){return $.tablesorter.formatFloat(s.replace(new RegExp(/%/g),“”));},type:“numeric”});ts.addParser({id:“usLongDate”,is:function(s){return s.match(new RegExp(/^[A-Za-z]{3,10}\.? [0-9]{1,2}, ([0-9]{4}|’?[0-9]{2}) (([0-2]?[0-9]:[0-5][0-9])|([0-1]?[0-9]:[0-5][0-9]\s(AM|PM)))$/));},format:function(s){return $.tablesorter.formatFloat(new Date(s).getTime());},type:“numeric”});ts.addParser({id:“shortDate”,is:function(s){return/\d{1,2}[\/\-]\d{1,2}[\/\-]\d{2,4}/.test(s);},format:function(s,table){var c=table.config;s=s.replace(/\-/g,“/”);if(c.dateFormat==“us”){s=s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{4})/,“$3/$1/$2”);}else if(c.dateFormat==“uk”){s=s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{4})/,“$3/$2/$1”);}else if(c.dateFormat==“dd/mm/yy”||c.dateFormat==“dd-mm-yy”){s=s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{2})/,“$1/$2/$3”);}return $.tablesorter.formatFloat(new Date(s).getTime());},type:“numeric”});ts.addParser({id:“time”,is:function(s){return/^(([0-2]?[0-9]:[0-5][0-9])|([0-1]?[0-9]:[0-5][0-9]\s(am|pm)))$/.test(s);},format:function(s){return $.tablesorter.formatFloat(new Date(“2000/01/01 ”+s).getTime());},type:“numeric”});ts.addParser({id:“metadata”,is:function(s){return false;},format:function(s,table,cell){var c=table.config,p=(!c.parserMetadataName)?‘sortValue’:c.parserMetadataName;return $(cell).metadata()[p];},type:“numeric”});ts.addWidget({id:“zebra”,format:function(table){if(table.config.debug){var time=new Date();}var $tr,row=-1,odd;$(“tr:visible”,table.tBodies[0]).each(function(i){$tr=$(this);if(!$tr.hasClass(table.config.cssChildRow))row++;odd=(row%2==0);$tr.removeClass(table.config.widgetZebra.css[odd?0:1]).addClass(table.config.widgetZebra.css[odd?1:0])});if(table.config.debug){$.tablesorter.benchmark(“Applying Zebra widget”,time);}}});})(jQuery);

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/assets/vendor/javascripts/jquery_timeago_js.html b/doc/tmp/rubycritic/assets/vendor/javascripts/jquery_timeago_js.html new file mode 100644 index 0000000000..5f9f9e95b7 --- /dev/null +++ b/doc/tmp/rubycritic/assets/vendor/javascripts/jquery_timeago_js.html @@ -0,0 +1,1865 @@ + + + + + + + +jquery.timeago.js - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

/**

+ +
* Timeago is a jQuery plugin that makes it easy to support automatically
+* updating fuzzy timestamps (e.g. "4 minutes ago" or "about 1 day ago").
+*
+* @name timeago
+* @version 1.5.3
+* @requires jQuery v1.2.3+
+* @author Ryan McGeary
+* @license MIT License - http://www.opensource.org/licenses/mit-license.php
+*
+* For usage and examples, visit:
+* http://timeago.yarp.com/
+*
+* Copyright (c) 2008-2015, Ryan McGeary (ryan -[at]- mcgeary [*dot*] org)
+*/
+ +

(function (factory) {

+ +
if (typeof define === 'function' && define.amd) {
+  // AMD. Register as an anonymous module.
+  define(['jquery'], factory);
+} else if (typeof module === 'object' && typeof module.exports === 'object') {
+  factory(require('jquery'));
+} else {
+  // Browser globals
+  factory(jQuery);
+}
+ +

}(function ($) {

+ +
$.timeago = function(timestamp) {
+  if (timestamp instanceof Date) {
+    return inWords(timestamp);
+  } else if (typeof timestamp === "string") {
+    return inWords($.timeago.parse(timestamp));
+  } else if (typeof timestamp === "number") {
+    return inWords(new Date(timestamp));
+  } else {
+    return inWords($.timeago.datetime(timestamp));
+  }
+};
+var $t = $.timeago;
+
+$.extend($.timeago, {
+  settings: {
+    refreshMillis: 60000,
+    allowPast: true,
+    allowFuture: false,
+    localeTitle: false,
+    cutoff: 0,
+    autoDispose: true,
+    strings: {
+      prefixAgo: null,
+      prefixFromNow: null,
+      suffixAgo: "ago",
+      suffixFromNow: "from now",
+      inPast: 'any moment now',
+      seconds: "less than a minute",
+      minute: "about a minute",
+      minutes: "%d minutes",
+      hour: "about an hour",
+      hours: "about %d hours",
+      day: "a day",
+      days: "%d days",
+      month: "about a month",
+      months: "%d months",
+      year: "about a year",
+      years: "%d years",
+      wordSeparator: " ",
+      numbers: []
+    }
+  },
+
+  inWords: function(distanceMillis) {
+    if (!this.settings.allowPast && ! this.settings.allowFuture) {
+        throw 'timeago allowPast and allowFuture settings can not both be set to false.';
+    }
+
+    var $l = this.settings.strings;
+    var prefix = $l.prefixAgo;
+    var suffix = $l.suffixAgo;
+    if (this.settings.allowFuture) {
+      if (distanceMillis < 0) {
+        prefix = $l.prefixFromNow;
+        suffix = $l.suffixFromNow;
+      }
+    }
+
+    if (!this.settings.allowPast && distanceMillis >= 0) {
+      return this.settings.strings.inPast;
+    }
+
+    var seconds = Math.abs(distanceMillis) / 1000;
+    var minutes = seconds / 60;
+    var hours = minutes / 60;
+    var days = hours / 24;
+    var years = days / 365;
+
+    function substitute(stringOrFunction, number) {
+      var string = $.isFunction(stringOrFunction) ? stringOrFunction(number, distanceMillis) : stringOrFunction;
+      var value = ($l.numbers && $l.numbers[number]) || number;
+      return string.replace(/%d/i, value);
+    }
+
+    var words = seconds < 45 && substitute($l.seconds, Math.round(seconds)) ||
+      seconds < 90 && substitute($l.minute, 1) ||
+      minutes < 45 && substitute($l.minutes, Math.round(minutes)) ||
+      minutes < 90 && substitute($l.hour, 1) ||
+      hours < 24 && substitute($l.hours, Math.round(hours)) ||
+      hours < 42 && substitute($l.day, 1) ||
+      days < 30 && substitute($l.days, Math.round(days)) ||
+      days < 45 && substitute($l.month, 1) ||
+      days < 365 && substitute($l.months, Math.round(days / 30)) ||
+      years < 1.5 && substitute($l.year, 1) ||
+      substitute($l.years, Math.round(years));
+
+    var separator = $l.wordSeparator || "";
+    if ($l.wordSeparator === undefined) { separator = " "; }
+    return $.trim([prefix, words, suffix].join(separator));
+  },
+
+  parse: function(iso8601) {
+    var s = $.trim(iso8601);
+    s = s.replace(/\.\d+/,""); // remove milliseconds
+    s = s.replace(/-/,"/").replace(/-/,"/");
+    s = s.replace(/T/," ").replace(/Z/," UTC");
+    s = s.replace(/([\+\-]\d\d)\:?(\d\d)/," $1$2"); // -04:00 -> -0400
+    s = s.replace(/([\+\-]\d\d)$/," $100"); // +09 -> +0900
+    return new Date(s);
+  },
+  datetime: function(elem) {
+    var iso8601 = $t.isTime(elem) ? $(elem).attr("datetime") : $(elem).attr("title");
+    return $t.parse(iso8601);
+  },
+  isTime: function(elem) {
+    // jQuery's `is()` doesn't play well with HTML5 in IE
+    return $(elem).get(0).tagName.toLowerCase() === "time"; // $(elem).is("time");
+  }
+});
+
+// functions that can be called via $(el).timeago('action')
+// init is default when no action is given
+// functions are called with context of a single element
+var functions = {
+  init: function() {
+    var refresh_el = $.proxy(refresh, this);
+    refresh_el();
+    var $s = $t.settings;
+    if ($s.refreshMillis > 0) {
+      this._timeagoInterval = setInterval(refresh_el, $s.refreshMillis);
+    }
+  },
+  update: function(timestamp) {
+    var date = (timestamp instanceof Date) ? timestamp : $t.parse(timestamp);
+    $(this).data('timeago', { datetime: date });
+    if ($t.settings.localeTitle) {
+      $(this).attr("title", date.toLocaleString());
+    }
+    refresh.apply(this);
+  },
+  updateFromDOM: function() {
+    $(this).data('timeago', { datetime: $t.parse( $t.isTime(this) ? $(this).attr("datetime") : $(this).attr("title") ) });
+    refresh.apply(this);
+  },
+  dispose: function () {
+    if (this._timeagoInterval) {
+      window.clearInterval(this._timeagoInterval);
+      this._timeagoInterval = null;
+    }
+  }
+};
+
+$.fn.timeago = function(action, options) {
+  var fn = action ? functions[action] : functions.init;
+  if (!fn) {
+    throw new Error("Unknown function name '"+ action +"' for timeago");
+  }
+  // each over objects here and call the requested function
+  this.each(function() {
+    fn.call(this, options);
+  });
+  return this;
+};
+
+function refresh() {
+  var $s = $t.settings;
+
+  //check if it's still visible
+  if ($s.autoDispose && !$.contains(document.documentElement,this)) {
+    //stop if it has been removed
+    $(this).timeago("dispose");
+    return this;
+  }
+
+  var data = prepareData(this);
+
+  if (!isNaN(data.datetime)) {
+    if ( $s.cutoff === 0 || Math.abs(distance(data.datetime)) < $s.cutoff) {
+      $(this).text(inWords(data.datetime));
+    } else {
+      if ($(this).attr('title').length > 0) {
+          $(this).text($(this).attr('title'));
+      }
+    }
+  }
+  return this;
+}
+
+function prepareData(element) {
+  element = $(element);
+  if (!element.data("timeago")) {
+    element.data("timeago", { datetime: $t.datetime(element) });
+    var text = $.trim(element.text());
+    if ($t.settings.localeTitle) {
+      element.attr("title", element.data('timeago').datetime.toLocaleString());
+    } else if (text.length > 0 && !($t.isTime(element) && element.attr("title"))) {
+      element.attr("title", text);
+    }
+  }
+  return element.data("timeago");
+}
+
+function inWords(date) {
+  return $t.inWords(distance(date));
+}
+
+function distance(date) {
+  return (new Date().getTime() - date.getTime());
+}
+
+// fix for IE6 suckage
+document.createElement("abbr");
+document.createElement("time");
+ +

}));

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/assets/vendor/javascripts/prettify_js.html b/doc/tmp/rubycritic/assets/vendor/javascripts/prettify_js.html new file mode 100644 index 0000000000..f5e493e345 --- /dev/null +++ b/doc/tmp/rubycritic/assets/vendor/javascripts/prettify_js.html @@ -0,0 +1,1646 @@ + + + + + + + +prettify.js - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

!function(){/*

+ +
Copyright (C) 2006 Google Inc.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+ +

*/ window.PR_SHOULD_USE_CONTINUATION=!0; (function(){function T(a){function d(e){var b=e.charCodeAt(0);if(92!==b)return b;var a=e.charAt(1);return(b=w)?b:“0”<=a&&“7”>=a?parseInt(e.substring(1),8):“u”===a||“x”===a?parseInt(e.substring(2),16):e.charCodeAt(1)}function f(e){if(32>e)return(16>e?“\x0”:“\x”)+e.toString(16);e=String.fromCharCode(e);return“\”===e||“-”===e||“]”===e||“^”===e?“\”+e:e}function b(e){var b=e.substring(1,e.length-1).match(/\u{4}|\x{2}|\[0-3][0-7]{0,2}|\[0-7]{1,2}|\[\sS]|-|[^-\]/g);e= [];var a=“^”===b,c=[“[”];a&&c.push(“^”);for(var a=a?1:0,g=b.length;a<g;++a){var h=b;if(/\[bdsw]/i.test(h))c.push(h);else{var h=d(h),k;a+2<g&&“-”===b?(k=d(b),a+=2):k=h;e.push([h,k]);65>k||122<h||(65>k||90<h||e.push([Math.max(65,h)|32,Math.min(k,90)|32]),97>k||122<h||e.push([Math.max(97,h)&-33,Math.min(k,122)&-33]))}}e.sort(function(e,a){return e-a||a-e});b=[];g=[];for(a=0;a<e.length;++a)h=e,h<=g+1?g=Math.max(g,h):b.push(g=h);for(a=0;a<b.length;++a)h=b, c.push(f(h)),h>h&&(h+1>h&&c.push(“-”),c.push(f(h)));c.push(“]”);return c.join(“”)}function v(e){for(var a=e.source.match(/(?:[(?:[^\x5C\x5D]|\[\sS])*]|\u{4}|\x{2}|\[0-9]+|\[^ux0-9]|\(\?[:!=]|[\(\)\^]|[^\x5B\x5C\(\)\^]+)/g),c=a.length,d=[],g=0,h=0;g<c;++g){var k=a;“(”===k?++h:“\”===k.charAt(0)&&(k=+k.substring(1))&&(k<=h?d=-1:a=f(k))}for(g=1;g<d.length;++g)-1===d&&(d=++A);for(h=g=0;g<c;++g)k=a,“(”===k?(++h,d||(a=“(?:”)):“\”=== k.charAt(0)&&(k=+k.substring(1))&&k<=h&&(a=“\”+d);for(g=0;g<c;++g)“^”===a&&“^”!==a&&(a=“”);if(e.ignoreCase&&n)for(g=0;g<c;++g)k=a,e=k.charAt(0),2<=k.length&&“[”===e?a=b(k):“\”!==e&&(a=k.replace(/[a-zA-Z]/g,function(a){a=a.charCodeAt(0);return“[”+String.fromCharCode(a&-33,a|32)+“]”}));return a.join(“”)}for(var A=0,n=!1,l=!1,m=0,c=a.length;m<c;++m){var p=a;if(p.ignoreCase)l=!0;else if(/[a-z]/i.test(p.source.replace(/\u{4}|\x{2}|\[^ux]/gi,“”))){n=!0; l=!1;break}}for(var w={b:8,t:9,n:10,v:11,f:12,r:13},r=[],m=0,c=a.length;m<c;++m){p=a;if(p.global||p.multiline)throw Error(“”+p);r.push(“(?:”+v(p)+“)”)}return new RegExp(r.join(“|”),l?“gi”:“g”)}function U(a,d){function f(a){var c=a.nodeType;if(1==c){if(!b.test(a.className)){for(c=a.firstChild;c;c=c.nextSibling)f©;c=a.nodeName.toLowerCase();if(“br”===c||“li”===c)v=“\n”,n=A++,n=a}}else if(3==c||4==c)c=a.nodeValue,c.length&&(c=d?c.replace(/\r\n?/g,“\n”):c.replace(/[ \t\r\n]+/g, “ ”),v=c,n=A,A+=c.length,n=a)}var b=/(?:^|\s)nocode(?:\s|$)/,v=[],A=0,n=[],l=0;f(a);return{a:v.join(“”).replace(/\n$/,“”),c:n}}function J(a,d,f,b,v){f&&(a={h:a,l:1,j:null,m:null,a:f,c:null,i:d,g:null},b(a),v.push.apply(v,a.g))}function V(a){for(var d=void 0,f=a.firstChild;f;f=f.nextSibling)var b=f.nodeType,d=1===b?d?a:f:3===b?W.test(f.nodeValue)?a:d:d;return d===a?void 0:d}function G(a,d){function f(a){for(var l=a.i,m=a.h,c=[l,“pln”],p=0,w=a.a.match(v)||[],r={},e=0,t=w.length;e< t;++e){var z=w,q=r,g=void 0,h;if(“string”===typeof q)h=!1;else{var k=b;if(k)g=z.match(k),q=k;else{for(h=0;h<A;++h)if(k=d,g=z.match(k)){q=k;break}g||(q=“pln”)}!(h=5<=q.length&&“lang-”===q.substring(0,5))||g&&“string”===typeof g||(h=!1,q=“src”);h||(r=q)}k=p;p+=z.length;if(h){h=g;var B=z.indexOf(h),D=B+h.length;g&&(D=z.length-g.length,B=D-h.length);q=q.substring(5);J(m,l+k,z.substring(0,B),f,c);J(m,l+k+B,h,K(q,h),c);J(m,l+k+D,z.substring(D),f,c)}else c.push(l+ k,q)}a.g=c}var b={},v;(function(){for(var f=a.concat(d),l=[],m={},c=0,p=f.length;c<p;++c){var w=f,r=w;if®for(var e=r.length;0<=–e;)b=w;w=w;r=“”+w;m.hasOwnProperty®||(l.push(w),m=null)}l.push(/[\0-\uffff]/);v=T(l)})();var A=d.length;return f}function y(a){var d=[],f=[];a.tripleQuotedStrings?d.push([“str”,/^(?:\‘\’\‘(?:[^\’\]|\[\sS]|\‘{1,2}(?=[^\’]))*(?:\‘\’\‘|$)|\“\”\“(?:[^\”\]|\[\sS]|\“{1,2}(?=[^\”]))*(?:\“\”\“|$)|\’(?:[^\\‘]|\[\sS])*(?:\’|$)|\”(?:[^\\“]|\[\sS])*(?:\”|$))/, null,“‘\”“]):a.multiLineStrings?d.push([”str“,/^(?:\’(?:[^\\‘]|\[\sS])*(?:\’|$)|\”(?:[^\\“]|\[\sS])*(?:\”|$)|‘(?:[^\`]|\[\sS])*(?:`|$))/,null,“’\”‘“]):d.push([”str“,/^(?:\’(?:[^\\‘\r\n]|\.)*(?:\’|$)|\”(?:[^\\“\r\n]|\.)*(?:\”|$))/,null,“\”‘“]);a.verbatimStrings&&f.push([”str“,/^@\”(?:[^\“]|\”\“)*(?:\”|$)/,null]);var b=a.hashComments;b&&(a.cStyleComments?(1<b?d.push([“com”,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,“#”]):d.push([“com”,/^#(?:(?:define|e(?:l|nd)if|else|error|ifn?def|include|line|pragma|undef|warning)\b|[^\r\n]*)/, null,“#”]),f.push([“str”,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h(?:h|pp|++)?|[a-z]\w*)>/,null])):d.push([“com”,/^#[^\r\n]*/,null,“#”]));a.cStyleComments&&(f.push([“com”,/^\/\/[^\r\n]*/,null]),f.push([“com”,/^\/*[\sS]*?(?:*\/|$)/,null]));if(b=a.regexLiterals){var v=(b=1<b?“”:“\n\r”)?“.”:“[S\s]”;f.push([“lang-regex”,RegExp(“^(?:^^\.?|[+-]|[!=]=?=?|#|%=?|&&?=?|\(|\*=?|[+\-]=|->|\/=?|::?|<<?=?|>>?>?=?|,|;|\?|@|\[|~|{|\^\^?=?|\|\|?=?|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\s*(”+ (“/(?=[^/*”b“])(?:[^/\x5B\x5C”b“]|\x5C”v“|\x5B(?:[^\x5C\x5D”b“]|\x5C”v“)*(?:\x5D|$))+/”)+“)”)])}(b=a.types)&&f.push([“typ”,b]);b=(“”+a.keywords).replace(/^ | $/g,“”);b.length&&f.push([“kwd”,new RegExp(“^(?:”+b.replace(/[\s,]+/g,“|”)+“)\b”),null]);d.push([“pln”,/^\s+/,null,“ \r\n\t\u00a0”]);b=“^.[^\s\w.$@’\”‘/\\]*“;a.regexLiterals&&(b+=”(?!s*/)“);f.push([”lit“,/^@[a-z_$][a-z_$@0-9]*/i,null],[”typ“,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],[”pln“,/^[a-z_$][a-z_$@0-9]*/i, null],[”lit“,/^(?:0x+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d+)(?:e[+\-]?\d+)?)[a-z]*/i,null,”0123456789“],[”pln“,/^\[\sS]?/,null],[”pun“,new RegExp(b),null]);return G(d,f)}function L(a,d,f){function b(a){var c=a.nodeType;if(1==c&&!A.test(a.className))if(”br“===a.nodeName)v(a),a.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)b(a);else if((3==c||4==c)&&f){var d=a.nodeValue,q=d.match(n);q&&(c=d.substring(0,q.index),a.nodeValue=c,(d=d.substring(q.index+q.length))&& a.parentNode.insertBefore(l.createTextNode(d),a.nextSibling),v(a),c||a.parentNode.removeChild(a))}}function v(a){function b(a,c){var d=c?a.cloneNode(!1):a,k=a.parentNode;if(k){var k=b(k,1),e=a.nextSibling;k.appendChild(d);for(var f=e;f;f=e)e=f.nextSibling,k.appendChild(f)}return d}for(;!a.nextSibling;)if(a=a.parentNode,!a)return;a=b(a.nextSibling,0);for(var d;(d=a.parentNode)&&1===d.nodeType;)a=d;c.push(a)}for(var A=/(?:^|\s)nocode(?:\s|$)/,n=/\r\n?|\n/,l=a.ownerDocument,m=l.createElement(”li“);a.firstChild;)m.appendChild(a.firstChild); for(var c=[m],p=0;p<c.length;++p)b(c);d===(d|0)&&c.setAttribute(”value“,d);var w=l.createElement(”ol“);w.className=”linenums“;d=Math.max(0,d-1|0)||0;for(var p=0,r=c.length;p<r;++p)m=c,m.className=”L“+(p+d)%10,m.firstChild||m.appendChild(l.createTextNode(”\u00a0“)),w.appendChild(m);a.appendChild(w)}function t(a,d){for(var f=d.length;0<=–f;){var b=d;I.hasOwnProperty(b)?E.console&&console.warn(”cannot override language handler %s“,b):I=a}}function K(a,d){a&&I.hasOwnProperty(a)||(a=/^\s*</.test(d)? ”default-markup“:”default-code“);return I}function M(a){var d=a.j;try{var f=U(a.h,a.l),b=f.a;a.a=b;a.c=f.c;a.i=0;K(d,b)(a);var v=/\bMSIE\s(\d+)/.exec(navigator.userAgent),v=v&&8>=+v,d=/\n/g,A=a.a,n=A.length,f=0,l=a.c,m=l.length,b=0,c=a.g,p=c.length,w=0;c=n;var r,e;for(e=r=0;e<p;)c!==c?(c=c,c=c):e+=2;p=r;for(e=r=0;e<p;){for(var t=c,z=c,q=e+2;q+2<=p&&c===z;)q+=2;c=t;c=z;e=q}c.length=r;var g=a.h;a=”“;g&&(a=g.style.display,g.style.display=”none“); try{for(;b<m;){var h=l||n,k=c||n,q=Math.min(h,k),B=l,D;if(1!==B.nodeType&&(D=A.substring(f,q))){v&&(D=D.replace(d,”\r“));B.nodeValue=D;var N=B.ownerDocument,u=N.createElement(”span“);u.className=c;var y=B.parentNode;y.replaceChild(u,B);u.appendChild(B);f<h&&(l=B=N.createTextNode(A.substring(q,h)),y.insertBefore(B,u.nextSibling))}f=q;f>=h&&(b+=2);f>=k&&(w+=2)}}finally{g&&(g.style.display=a)}}catch(x){E.console&&console.log(x&&x.stack||x)}}var E=window,C=[”break,continue,do,else,for,if,return,while“], F=[[C,”auto,case,char,const,default,double,enum,extern,float,goto,inline,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile“],”catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof“],H=[F,”alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,delegate,dynamic_cast,explicit,export,friend,generic,late_check,mutable,namespace,nullptr,property,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where“], O=[F,”abstract,assert,boolean,byte,extends,finally,final,implements,import,instanceof,interface,null,native,package,strictfp,super,synchronized,throws,transient“],P=[F,”abstract,as,base,bool,by,byte,checked,decimal,delegate,descending,dynamic,event,finally,fixed,foreach,from,group,implicit,in,interface,internal,into,is,let,lock,null,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var,virtual,where“],F=[F,”debugger,eval,export,function,get,instanceof,null,set,undefined,var,with,Infinity,NaN“], Q=[C,”and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None“],R=[C,”alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END“],C=[C,”case,done,elif,esac,eval,fi,function,in,local,set,then,until“],S=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)\b/, W=/S/,X=y({keywords:[H,P,O,F,”caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END“,Q,R,C],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),I={};t(X,[”default-code“]);t(G([],[[”pln“,/^[^<?]+/],[”dec“,/^<!\w[^>]*(?:>|$)/],[”com“,/^<\!–[\sS]*?(?:-\->|$)/],[”lang-“,/^<\?([\sS]+?)(?:\?>|$)/],[”lang-“,/^<%([\sS]+?)(?:%>|$)/],[”pun“,/^(?:<[%?]|[%?]>)/],[”lang-“, /^<xmp\b[^>]*>([\sS]+?)<\/xmp\b[^>]*>/i],[”lang-js“,/^<script\b[^>]*>([\sS]*?)(<\/script\b[^>]*>)/i],[”lang-css“,/^<style\b[^>]*>([\sS]*?)(<\/style\b[^>]*>)/i],[”lang-in.tag“,/^(<\/?[a-z][^<>]*>)/i]]),”default-markup htm html mxml xhtml xml xsl“.split(” “));t(G([[”pln“,/^[\s]+/,null,” \t\r\n“],[”atv“,/^(?:\”[^\“]*\”?|\’[^\‘]*\’?)/,null,“\”‘“]],[[”tag“,/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],[”atn“,/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],[”lang-uq.val“,/^=\s*([^>\’\”\s]*(?:[^>\‘\“\s\/]|\/(?=\s)))/], [”pun“,/^[=<>\/]+/],[”lang-js“,/^on\w+\s*=\s*\”([^\“]+)\”/i],[“lang-js”,/^on\w+\s*=\s*\’([^\‘]+)\’/i],[“lang-js”,/^on\w+\s*=\s*([^\“\‘>\s]+)/i],[”lang-css“,/^style\s*=\s*\”([^\“]+)\”/i],[“lang-css”,/^style\s*=\s*\’([^\‘]+)\’/i],[“lang-css”,/^style\s*=\s*([^\“\‘>\s]+)/i]]),[”in.tag“]);t(G([],[[”atv“,/^[\sS]+/]]),[”uq.val“]);t(y({keywords:H,hashComments:!0,cStyleComments:!0,types:S}),”c cc cpp cxx cyc m“.split(” “));t(y({keywords:”null,true,false“}),[”json“]);t(y({keywords:P,hashComments:!0,cStyleComments:!0, verbatimStrings:!0,types:S}),[”cs“]);t(y({keywords:O,cStyleComments:!0}),[”java“]);t(y({keywords:C,hashComments:!0,multiLineStrings:!0}),[”bash“,”bsh“,”csh“,”sh“]);t(y({keywords:Q,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}),[”cv“,”py“,”python“]);t(y({keywords:”caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END“,hashComments:!0,multiLineStrings:!0,regexLiterals:2}), [”perl“,”pl“,”pm“]);t(y({keywords:R,hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),[”rb“,”ruby“]);t(y({keywords:F,cStyleComments:!0,regexLiterals:!0}),[”javascript“,”js“]);t(y({keywords:”all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,throw,true,try,unless,until,when,while,yes“,hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),[”coffee“]);t(G([],[[”str“,/^[\sS]+/]]),[”regex“]); var Y=E.PR={createSimpleLexer:G,registerLangHandler:t,sourceDecorator:y,PR_ATTRIB_NAME:”atn“,PR_ATTRIB_VALUE:”atv“,PR_COMMENT:”com“,PR_DECLARATION:”dec“,PR_KEYWORD:”kwd“,PR_LITERAL:”lit“,PR_NOCODE:”nocode“,PR_PLAIN:”pln“,PR_PUNCTUATION:”pun“,PR_SOURCE:”src“,PR_STRING:”str“,PR_TAG:”tag“,PR_TYPE:”typ“,prettyPrintOne:E.prettyPrintOne=function(a,d,f){f=f||!1;d=d||null;var b=document.createElement(”div“);b.innerHTML=”<pre>“a”</pre>“;b=b.firstChild;f&&L(b,f,!0);M({j:d,m:f,h:b,l:1,a:null,i:null,c:null, g:null});return b.innerHTML},prettyPrint:E.prettyPrint=function(a,d){function f(){for(var b=E.PR_SHOULD_USE_CONTINUATION?c.now()+250:Infinity;p<t.length&&c.now()<b;p++){for(var d=t,l=g,m=d;m=m.previousSibling;){var n=m.nodeType,u=(7===n||8===n)&&m.nodeValue;if(u?!/^\??prettify\b/.test(u):3!==n||/S/.test(m.nodeValue))break;if(u){l={};u.replace(/\b(\w+)=([\w:.%-])/g,function(a,b,c){l=c});break}}m=d.className;if((l!==g||r.test(m))&&!e.test(m)){n=!1;for(u=d.parentNode;u;u=u.parentNode)if(q.test(u.tagName)&& u.className&&r.test(u.className)){n=!0;break}if(!n){d.className+=” prettyprinted“;n=l.lang;if(!n){var n=m.match(w),C;!n&&(C=V(d))&&z.test(C.tagName)&&(n=C.className.match(w));n&&(n=n)}if(y.test(d.tagName))u=1;else var u=d.currentStyle,x=v.defaultView,u=(u=u?u.whiteSpace:x&&x.getComputedStyle?x.getComputedStyle(d,null).getPropertyValue(”white-space“):0)&&”pre“===u.substring(0,3);x=l.linenums;(x=”true“===x||+x)||(x=(x=m.match(/\blinenums\b(?::(\d+))?/))?x&&x.length?+x:!0:!1);x&&L(d,x,u); M({j:n,h:d,m:x,l:u,a:null,i:null,c:null,g:null})}}}p<t.length?E.setTimeout(f,250):”function“===typeof a&&a()}for(var b=d||document.body,v=b.ownerDocument||document,b=[b.getElementsByTagName(”pre“),b.getElementsByTagName(”code“),b.getElementsByTagName(”xmp“)],t=[],n=0;n<b.length;++n)for(var l=0,m=b.length;l<m;++l)t.push(b[l]);var b=null,c=Date;c.now||(c={now:function(){return+new Date}});var p=0,w=/\blang(?:uage)?-([\w.]+)(?!S)/,r=/\bprettyprint\b/,e=/\bprettyprinted\b/,y=/pre|xmp/i,z=/^code$/i, q=/^(?:pre|code|xmp)$/i,g={};f()}},H=E.define;”function“===typeof H&&H.amd&&H(”google-code-prettify“,[],function(){return Y})})();}()

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/assets/vendor/stylesheets/bootstrap_min_css.html b/doc/tmp/rubycritic/assets/vendor/stylesheets/bootstrap_min_css.html new file mode 100644 index 0000000000..56524ffef1 --- /dev/null +++ b/doc/tmp/rubycritic/assets/vendor/stylesheets/bootstrap_min_css.html @@ -0,0 +1,1637 @@ + + + + + + + +bootstrap.min.css - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

/*!

+ +
* Bootstrap v3.3.7 (http://getbootstrap.com)
+* Copyright 2011-2016 Twitter, Inc.
+* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+*//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\002a"}.glyphicon-plus:before{content:"\002b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control::-ms-expand{background-color:transparent;border:0}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px\9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:11px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled.focus,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled].focus,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled].focus,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled.focus,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled].focus,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled].focus,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px dashed;border-bottom:4px solid\9}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:2;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:3;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{padding-right:15px;padding-left:15px;border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;filter:alpha(opacity=0);opacity:0;line-break:auto}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);line-break:auto}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.active.right,.carousel-inner>.item.next{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);background-color:rgba(0,0,0,0);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-10px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;font-family:serif;line-height:1}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000\9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-10px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-10px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.modal-header:after,.modal-header:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.modal-header:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}}
+ +

/*# sourceMappingURL=bootstrap.min.css.map */

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/assets/vendor/stylesheets/font-awesome_min_css.html b/doc/tmp/rubycritic/assets/vendor/stylesheets/font-awesome_min_css.html new file mode 100644 index 0000000000..bffbb3d798 --- /dev/null +++ b/doc/tmp/rubycritic/assets/vendor/stylesheets/font-awesome_min_css.html @@ -0,0 +1,1634 @@ + + + + + + + +font-awesome.min.css - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

/*!

+ +
*  Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome
+*  License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
+*/@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.7.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-signing:before,.fa-sign-language:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.fa-handshake-o:before{content:"\f2b5"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-o:before{content:"\f2b7"}.fa-linode:before{content:"\f2b8"}.fa-address-book:before{content:"\f2b9"}.fa-address-book-o:before{content:"\f2ba"}.fa-vcard:before,.fa-address-card:before{content:"\f2bb"}.fa-vcard-o:before,.fa-address-card-o:before{content:"\f2bc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-circle-o:before{content:"\f2be"}.fa-user-o:before{content:"\f2c0"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\f2c3"}.fa-quora:before{content:"\f2c4"}.fa-free-code-camp:before{content:"\f2c5"}.fa-telegram:before{content:"\f2c6"}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-shower:before{content:"\f2cc"}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:"\f2cd"}.fa-podcast:before{content:"\f2ce"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-times-rectangle:before,.fa-window-close:before{content:"\f2d3"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\f2d4"}.fa-bandcamp:before{content:"\f2d5"}.fa-grav:before{content:"\f2d6"}.fa-etsy:before{content:"\f2d7"}.fa-imdb:before{content:"\f2d8"}.fa-ravelry:before{content:"\f2d9"}.fa-eercast:before{content:"\f2da"}.fa-microchip:before{content:"\f2db"}.fa-snowflake-o:before{content:"\f2dc"}.fa-superpowers:before{content:"\f2dd"}.fa-wpexplorer:before{content:"\f2de"}.fa-meetup:before{content:"\f2e0"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}
+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/assets/vendor/stylesheets/prettify_css.html b/doc/tmp/rubycritic/assets/vendor/stylesheets/prettify_css.html new file mode 100644 index 0000000000..f23ccfa15e --- /dev/null +++ b/doc/tmp/rubycritic/assets/vendor/stylesheets/prettify_css.html @@ -0,0 +1,1630 @@ + + + + + + + +prettify.css - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee}

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/assets/vendor/stylesheets/prettify_custom_theme_css.html b/doc/tmp/rubycritic/assets/vendor/stylesheets/prettify_custom_theme_css.html new file mode 100644 index 0000000000..4f4fd53068 --- /dev/null +++ b/doc/tmp/rubycritic/assets/vendor/stylesheets/prettify_custom_theme_css.html @@ -0,0 +1,1727 @@ + + + + + + + +prettify.custom_theme.css - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

/* Pretty printing styles. Used with prettify.js. */

+ +

/* SPAN elements with the classes below are added by prettyprint. */ .pln { /* plain text */

+ +
color: #000;
+ +

}

+ +

.str { /* string content */

+ +
color: #690;
+ +

}

+ +

.kwd { /* a keyword */

+ +
color: #07a;
+ +

}

+ +

.com { /* a comment */

+ +
color: #800;
+ +

}

+ +

.typ { /* a type name */

+ +
color: #905;
+ +

}

+ +

.lit { /* a literal value */

+ +
color: #a67f59;
+ +

}

+ +

.pun, .opn, .clo { /* punctuation, lisp open bracket, lisp close bracket */

+ +
color: #660;
+ +

}

+ +

.tag { /* a markup tag name */

+ +
color: #008;
+ +

}

+ +

.atn { /* a markup attribute name */

+ +
color: #606;
+ +

}

+ +

.atv { /* a markup attribute value */

+ +
color: #080;
+ +

}

+ +

.dec, .var { /* a declaration; a variable name */

+ +
color: #a67f59;
+ +

}

+ +

.fun { /* a function name */

+ +
color: red;
+ +

}

+ +

/* Put a border around prettyprinted code snippets. */ .prettyprint {

+ +
font-family: Consolas, Monaco, 'Andale Mono', monospace;
+white-space: pre-wrap;
+ +

}

+ +

/* Specify class=linenums on a pre to get line numbering */ .prettyprint ol.linenums {

+ +
padding-left: 60px;
+ +

}

+ +

.prettyprint li {

+ +
color: #999;
+ +

}

+ +

li.highlight {

+ +
background-color: #FFC;
+ +

}

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/code_index_html.html b/doc/tmp/rubycritic/code_index_html.html new file mode 100644 index 0000000000..8b7a8d57c8 --- /dev/null +++ b/doc/tmp/rubycritic/code_index_html.html @@ -0,0 +1,2917 @@ + + + + + + + +code_index.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="overview.html"><img src="assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+  <!--Page Title -->
+  <div class="Page_Title">
+    <h3>Code</h3>
+  </div>
+  <!--End Page Title -->
+  <div class="Content_Wrapper">
+    <table id="codeTable" class="table code sortable-table tablesorter">
+      <thead>
+        <tr>
+
+            <th width="10%" class="table-header center">Rating<span class="sort-type"></span></th>
+
+          <th width="50%" class="table-header left">Name<span class="sort-type"></span></th>
+          <th width="10%" class="table-header">Churn<span class="sort-type"></span></th>
+          <th width="10%" class="table-header">Complexity<span class="sort-type"></span></th>
+          <th width="10%" class="table-header">Duplication<span class="sort-type"></span></th>
+          <th width="10%" class="table-header">Smells<span class="sort-type"></span></th>
+        </tr>
+      </thead>
+      <tbody>
+
+          <tr>
+
+              <td class="center">
+
+                <div class="rating c">C</div>
+              </td>
+
+            <td class="left">
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/controllers/admin_controller.html">AdminController</a>
+                </li>
+              </ul>
+            </td>
+            <td>17</td>
+            <td>136.93</td>
+            <td>0</td>
+            <td>12</td>
+          </tr>
+
+          <tr>
+
+              <td class="center">
+
+                <div class="rating a">A</div>
+              </td>
+
+            <td class="left">
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/controllers/application_controller.html">ApplicationController</a>
+                </li>
+              </ul>
+            </td>
+            <td>6</td>
+            <td>11.99</td>
+            <td>0</td>
+            <td>0</td>
+          </tr>
+
+          <tr>
+
+              <td class="center">
+
+                <div class="rating f">F</div>
+              </td>
+
+            <td class="left">
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/controllers/campo_forms_controller.html">CampoFormsController</a>
+                </li>
+              </ul>
+            </td>
+            <td>5</td>
+            <td>53.58</td>
+            <td>122</td>
+            <td>11</td>
+          </tr>
+
+          <tr>
+
+              <td class="center">
+
+                <div class="rating f">F</div>
+              </td>
+
+            <td class="left">
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/controllers/campos_controller.html">CamposController</a>
+                </li>
+              </ul>
+            </td>
+            <td>5</td>
+            <td>53.58</td>
+            <td>122</td>
+            <td>11</td>
+          </tr>
+
+          <tr>
+
+              <td class="center">
+
+                <div class="rating a">A</div>
+              </td>
+
+            <td class="left">
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/controllers/concerns/admin_autenticavel.html">AdminAutenticavel</a>
+                </li>
+              </ul>
+            </td>
+            <td>0</td>
+            <td>10.89</td>
+            <td>0</td>
+            <td>0</td>
+          </tr>
+
+          <tr>
+
+              <td class="center">
+
+                <div class="rating f">F</div>
+              </td>
+
+            <td class="left">
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/controllers/cursos_controller.html">CursosController</a>
+                </li>
+              </ul>
+            </td>
+            <td>5</td>
+            <td>53.58</td>
+            <td>122</td>
+            <td>11</td>
+          </tr>
+
+          <tr>
+
+              <td class="center">
+
+                <div class="rating b">B</div>
+              </td>
+
+            <td class="left">
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/controllers/definicao_senhas_controller.html">DefinicaoSenhasController</a>
+                </li>
+              </ul>
+            </td>
+            <td>4</td>
+            <td>53.38</td>
+            <td>19</td>
+            <td>4</td>
+          </tr>
+
+          <tr>
+
+              <td class="center">
+
+                <div class="rating f">F</div>
+              </td>
+
+            <td class="left">
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/controllers/departamentos_controller.html">DepartamentosController</a>
+                </li>
+              </ul>
+            </td>
+            <td>5</td>
+            <td>53.58</td>
+            <td>122</td>
+            <td>11</td>
+          </tr>
+
+          <tr>
+
+              <td class="center">
+
+                <div class="rating f">F</div>
+              </td>
+
+            <td class="left">
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/controllers/discentes_controller.html">DiscentesController</a>
+                </li>
+              </ul>
+            </td>
+            <td>5</td>
+            <td>53.58</td>
+            <td>122</td>
+            <td>11</td>
+          </tr>
+
+          <tr>
+
+              <td class="center">
+
+                <div class="rating f">F</div>
+              </td>
+
+            <td class="left">
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/controllers/disciplinas_controller.html">DisciplinasController</a>
+                </li>
+              </ul>
+            </td>
+            <td>5</td>
+            <td>53.58</td>
+            <td>122</td>
+            <td>11</td>
+          </tr>
+
+          <tr>
+
+              <td class="center">
+
+                <div class="rating f">F</div>
+              </td>
+
+            <td class="left">
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/controllers/docentes_controller.html">DocentesController</a>
+                </li>
+              </ul>
+            </td>
+            <td>5</td>
+            <td>53.58</td>
+            <td>122</td>
+            <td>11</td>
+          </tr>
+
+          <tr>
+
+              <td class="center">
+
+                <div class="rating f">F</div>
+              </td>
+
+            <td class="left">
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/controllers/elemento_forms_controller.html">ElementoFormsController</a>
+                </li>
+              </ul>
+            </td>
+            <td>5</td>
+            <td>53.58</td>
+            <td>122</td>
+            <td>11</td>
+          </tr>
+
+          <tr>
+
+              <td class="center">
+
+                <div class="rating f">F</div>
+              </td>
+
+            <td class="left">
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/controllers/elementos_controller.html">ElementosController</a>
+                </li>
+              </ul>
+            </td>
+            <td>5</td>
+            <td>53.58</td>
+            <td>122</td>
+            <td>11</td>
+          </tr>
+
+          <tr>
+
+              <td class="center">
+
+                <div class="rating f">F</div>
+              </td>
+
+            <td class="left">
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/controllers/formularios_controller.html">FormulariosController</a>
+                </li>
+              </ul>
+            </td>
+            <td>5</td>
+            <td>53.58</td>
+            <td>122</td>
+            <td>11</td>
+          </tr>
+
+          <tr>
+
+              <td class="center">
+
+                <div class="rating a">A</div>
+              </td>
+
+            <td class="left">
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/controllers/home_controller.html">HomeController</a>
+                </li>
+              </ul>
+            </td>
+            <td>6</td>
+            <td>0.0</td>
+            <td>0</td>
+            <td>0</td>
+          </tr>
+
+          <tr>
+
+              <td class="center">
+
+                <div class="rating b">B</div>
+              </td>
+
+            <td class="left">
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/controllers/redefinicao_senhas_controller.html">RedefinicaoSenhasController</a>
+                </li>
+              </ul>
+            </td>
+            <td>3</td>
+            <td>58.39</td>
+            <td>19</td>
+            <td>8</td>
+          </tr>
+
+          <tr>
+
+              <td class="center">
+
+                <div class="rating f">F</div>
+              </td>
+
+            <td class="left">
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/controllers/resposta_elems_controller.html">RespostaElemsController</a>
+                </li>
+              </ul>
+            </td>
+            <td>5</td>
+            <td>53.58</td>
+            <td>122</td>
+            <td>11</td>
+          </tr>
+
+          <tr>
+
+              <td class="center">
+
+                <div class="rating f">F</div>
+              </td>
+
+            <td class="left">
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/controllers/resposta_forms_controller.html">RespostaFormsController</a>
+                </li>
+              </ul>
+            </td>
+            <td>5</td>
+            <td>53.58</td>
+            <td>122</td>
+            <td>11</td>
+          </tr>
+
+          <tr>
+
+              <td class="center">
+
+                <div class="rating a">A</div>
+              </td>
+
+            <td class="left">
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/controllers/sessions_controller.html">SessionsController</a>
+                </li>
+              </ul>
+            </td>
+            <td>11</td>
+            <td>48.4</td>
+            <td>0</td>
+            <td>3</td>
+          </tr>
+
+          <tr>
+
+              <td class="center">
+
+                <div class="rating c">C</div>
+              </td>
+
+            <td class="left">
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/controllers/templates_controller.html">TemplatesController</a>
+                </li>
+              </ul>
+            </td>
+            <td>8</td>
+            <td>81.47</td>
+            <td>84</td>
+            <td>14</td>
+          </tr>
+
+          <tr>
+
+              <td class="center">
+
+                <div class="rating f">F</div>
+              </td>
+
+            <td class="left">
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/controllers/turmas_controller.html">TurmasController</a>
+                </li>
+              </ul>
+            </td>
+            <td>5</td>
+            <td>53.58</td>
+            <td>122</td>
+            <td>11</td>
+          </tr>
+
+          <tr>
+
+              <td class="center">
+
+                <div class="rating f">F</div>
+              </td>
+
+            <td class="left">
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/controllers/usuarios_controller.html">UsuariosController</a>
+                </li>
+              </ul>
+            </td>
+            <td>9</td>
+            <td>164.61</td>
+            <td>122</td>
+            <td>30</td>
+          </tr>
+
+          <tr>
+
+              <td class="center">
+
+                <div class="rating a">A</div>
+              </td>
+
+            <td class="left">
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/helpers/admin_helper.html">AdminHelper</a>
+                </li>
+              </ul>
+            </td>
+            <td>1</td>
+            <td>0.0</td>
+            <td>0</td>
+            <td>1</td>
+          </tr>
+
+          <tr>
+
+              <td class="center">
+
+                <div class="rating a">A</div>
+              </td>
+
+            <td class="left">
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/helpers/application_helper.html">ApplicationHelper</a>
+                </li>
+              </ul>
+            </td>
+            <td>4</td>
+            <td>10.55</td>
+            <td>0</td>
+            <td>2</td>
+          </tr>
+
+          <tr>
+
+              <td class="center">
+
+                <div class="rating a">A</div>
+              </td>
+
+            <td class="left">
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/helpers/campo_forms_helper.html">CampoFormsHelper</a>
+                </li>
+              </ul>
+            </td>
+            <td>1</td>
+            <td>0.0</td>
+            <td>0</td>
+            <td>1</td>
+          </tr>
+
+          <tr>
+
+              <td class="center">
+
+                <div class="rating a">A</div>
+              </td>
+
+            <td class="left">
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/helpers/campos_helper.html">CamposHelper</a>
+                </li>
+              </ul>
+            </td>
+            <td>1</td>
+            <td>0.0</td>
+            <td>0</td>
+            <td>1</td>
+          </tr>
+
+          <tr>
+
+              <td class="center">
+
+                <div class="rating a">A</div>
+              </td>
+
+            <td class="left">
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/helpers/cursos_helper.html">CursosHelper</a>
+                </li>
+              </ul>
+            </td>
+            <td>1</td>
+            <td>0.0</td>
+            <td>0</td>
+            <td>1</td>
+          </tr>
+
+          <tr>
+
+              <td class="center">
+
+                <div class="rating a">A</div>
+              </td>
+
+            <td class="left">
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/helpers/departamentos_helper.html">DepartamentosHelper</a>
+                </li>
+              </ul>
+            </td>
+            <td>1</td>
+            <td>0.0</td>
+            <td>0</td>
+            <td>1</td>
+          </tr>
+
+          <tr>
+
+              <td class="center">
+
+                <div class="rating a">A</div>
+              </td>
+
+            <td class="left">
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/helpers/discentes_helper.html">DiscentesHelper</a>
+                </li>
+              </ul>
+            </td>
+            <td>1</td>
+            <td>0.0</td>
+            <td>0</td>
+            <td>1</td>
+          </tr>
+
+          <tr>
+
+              <td class="center">
+
+                <div class="rating a">A</div>
+              </td>
+
+            <td class="left">
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/helpers/disciplinas_helper.html">DisciplinasHelper</a>
+                </li>
+              </ul>
+            </td>
+            <td>1</td>
+            <td>0.0</td>
+            <td>0</td>
+            <td>1</td>
+          </tr>
+
+          <tr>
+
+              <td class="center">
+
+                <div class="rating a">A</div>
+              </td>
+
+            <td class="left">
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/helpers/docentes_helper.html">DocentesHelper</a>
+                </li>
+              </ul>
+            </td>
+            <td>1</td>
+            <td>0.0</td>
+            <td>0</td>
+            <td>1</td>
+          </tr>
+
+          <tr>
+
+              <td class="center">
+
+                <div class="rating a">A</div>
+              </td>
+
+            <td class="left">
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/helpers/elemento_forms_helper.html">ElementoFormsHelper</a>
+                </li>
+              </ul>
+            </td>
+            <td>1</td>
+            <td>0.0</td>
+            <td>0</td>
+            <td>1</td>
+          </tr>
+
+          <tr>
+
+              <td class="center">
+
+                <div class="rating a">A</div>
+              </td>
+
+            <td class="left">
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/helpers/elementos_helper.html">ElementosHelper</a>
+                </li>
+              </ul>
+            </td>
+            <td>1</td>
+            <td>0.0</td>
+            <td>0</td>
+            <td>1</td>
+          </tr>
+
+          <tr>
+
+              <td class="center">
+
+                <div class="rating a">A</div>
+              </td>
+
+            <td class="left">
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/helpers/formularios_helper.html">FormulariosHelper</a>
+                </li>
+              </ul>
+            </td>
+            <td>1</td>
+            <td>0.0</td>
+            <td>0</td>
+            <td>1</td>
+          </tr>
+
+          <tr>
+
+              <td class="center">
+
+                <div class="rating a">A</div>
+              </td>
+
+            <td class="left">
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/helpers/resposta_elems_helper.html">RespostaElemsHelper</a>
+                </li>
+              </ul>
+            </td>
+            <td>1</td>
+            <td>0.0</td>
+            <td>0</td>
+            <td>1</td>
+          </tr>
+
+          <tr>
+
+              <td class="center">
+
+                <div class="rating a">A</div>
+              </td>
+
+            <td class="left">
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/helpers/resposta_forms_helper.html">RespostaFormsHelper</a>
+                </li>
+              </ul>
+            </td>
+            <td>1</td>
+            <td>0.0</td>
+            <td>0</td>
+            <td>1</td>
+          </tr>
+
+          <tr>
+
+              <td class="center">
+
+                <div class="rating a">A</div>
+              </td>
+
+            <td class="left">
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/helpers/templates_helper.html">TemplatesHelper</a>
+                </li>
+              </ul>
+            </td>
+            <td>1</td>
+            <td>0.0</td>
+            <td>0</td>
+            <td>1</td>
+          </tr>
+
+          <tr>
+
+              <td class="center">
+
+                <div class="rating a">A</div>
+              </td>
+
+            <td class="left">
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/helpers/turmas_helper.html">TurmasHelper</a>
+                </li>
+              </ul>
+            </td>
+            <td>1</td>
+            <td>0.0</td>
+            <td>0</td>
+            <td>1</td>
+          </tr>
+
+          <tr>
+
+              <td class="center">
+
+                <div class="rating a">A</div>
+              </td>
+
+            <td class="left">
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/helpers/usuarios_helper.html">UsuariosHelper</a>
+                </li>
+              </ul>
+            </td>
+            <td>1</td>
+            <td>0.0</td>
+            <td>0</td>
+            <td>1</td>
+          </tr>
+
+          <tr>
+
+              <td class="center">
+
+                <div class="rating a">A</div>
+              </td>
+
+            <td class="left">
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/jobs/application_job.html">ApplicationJob</a>
+                </li>
+              </ul>
+            </td>
+            <td>1</td>
+            <td>0.0</td>
+            <td>0</td>
+            <td>1</td>
+          </tr>
+
+          <tr>
+
+              <td class="center">
+
+                <div class="rating a">A</div>
+              </td>
+
+            <td class="left">
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/mailers/application_mailer.html">ApplicationMailer</a>
+                </li>
+              </ul>
+            </td>
+            <td>2</td>
+            <td>0.0</td>
+            <td>0</td>
+            <td>1</td>
+          </tr>
+
+          <tr>
+
+              <td class="center">
+
+                <div class="rating a">A</div>
+              </td>
+
+            <td class="left">
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/mailers/usuario_mailer.html">UsuarioMailer</a>
+                </li>
+              </ul>
+            </td>
+            <td>2</td>
+            <td>9.67</td>
+            <td>34</td>
+            <td>2</td>
+          </tr>
+
+          <tr>
+
+              <td class="center">
+
+                <div class="rating a">A</div>
+              </td>
+
+            <td class="left">
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/models/administrador.html">Administrador</a>
+                </li>
+              </ul>
+            </td>
+            <td>4</td>
+            <td>0.0</td>
+            <td>0</td>
+            <td>0</td>
+          </tr>
+
+          <tr>
+
+              <td class="center">
+
+                <div class="rating a">A</div>
+              </td>
+
+            <td class="left">
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/models/application_record.html">ApplicationRecord</a>
+                </li>
+              </ul>
+            </td>
+            <td>1</td>
+            <td>0.0</td>
+            <td>0</td>
+            <td>1</td>
+          </tr>
+
+          <tr>
+
+              <td class="center">
+
+                <div class="rating a">A</div>
+              </td>
+
+            <td class="left">
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/models/campo.html">Campo</a>
+                </li>
+              </ul>
+            </td>
+            <td>3</td>
+            <td>0.0</td>
+            <td>0</td>
+            <td>0</td>
+          </tr>
+
+          <tr>
+
+              <td class="center">
+
+                <div class="rating a">A</div>
+              </td>
+
+            <td class="left">
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/models/campo_form.html">CampoForm</a>
+                </li>
+              </ul>
+            </td>
+            <td>3</td>
+            <td>0.0</td>
+            <td>0</td>
+            <td>0</td>
+          </tr>
+
+          <tr>
+
+              <td class="center">
+
+                <div class="rating a">A</div>
+              </td>
+
+            <td class="left">
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/models/curso.html">Curso</a>
+                </li>
+              </ul>
+            </td>
+            <td>3</td>
+            <td>0.0</td>
+            <td>0</td>
+            <td>0</td>
+          </tr>
+
+          <tr>
+
+              <td class="center">
+
+                <div class="rating a">A</div>
+              </td>
+
+            <td class="left">
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/models/departamento.html">Departamento</a>
+                </li>
+              </ul>
+            </td>
+            <td>3</td>
+            <td>0.0</td>
+            <td>0</td>
+            <td>0</td>
+          </tr>
+
+          <tr>
+
+              <td class="center">
+
+                <div class="rating a">A</div>
+              </td>
+
+            <td class="left">
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/models/discente.html">Discente</a>
+                </li>
+              </ul>
+            </td>
+            <td>4</td>
+            <td>0.0</td>
+            <td>0</td>
+            <td>0</td>
+          </tr>
+
+          <tr>
+
+              <td class="center">
+
+                <div class="rating a">A</div>
+              </td>
+
+            <td class="left">
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/models/disciplina.html">Disciplina</a>
+                </li>
+              </ul>
+            </td>
+            <td>3</td>
+            <td>0.0</td>
+            <td>0</td>
+            <td>0</td>
+          </tr>
+
+          <tr>
+
+              <td class="center">
+
+                <div class="rating a">A</div>
+              </td>
+
+            <td class="left">
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/models/docente.html">Docente</a>
+                </li>
+              </ul>
+            </td>
+            <td>4</td>
+            <td>0.0</td>
+            <td>0</td>
+            <td>0</td>
+          </tr>
+
+          <tr>
+
+              <td class="center">
+
+                <div class="rating a">A</div>
+              </td>
+
+            <td class="left">
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/models/elemento.html">Elemento</a>
+                </li>
+              </ul>
+            </td>
+            <td>4</td>
+            <td>0.0</td>
+            <td>0</td>
+            <td>0</td>
+          </tr>
+
+          <tr>
+
+              <td class="center">
+
+                <div class="rating a">A</div>
+              </td>
+
+            <td class="left">
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/models/elemento_form.html">ElementoForm</a>
+                </li>
+              </ul>
+            </td>
+            <td>3</td>
+            <td>0.0</td>
+            <td>0</td>
+            <td>0</td>
+          </tr>
+
+          <tr>
+
+              <td class="center">
+
+                <div class="rating a">A</div>
+              </td>
+
+            <td class="left">
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/models/formulario.html">Formulario</a>
+                </li>
+              </ul>
+            </td>
+            <td>5</td>
+            <td>0.0</td>
+            <td>0</td>
+            <td>0</td>
+          </tr>
+
+          <tr>
+
+              <td class="center">
+
+                <div class="rating a">A</div>
+              </td>
+
+            <td class="left">
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/models/resposta_elem.html">RespostaElem</a>
+                </li>
+              </ul>
+            </td>
+            <td>3</td>
+            <td>0.0</td>
+            <td>0</td>
+            <td>0</td>
+          </tr>
+
+          <tr>
+
+              <td class="center">
+
+                <div class="rating a">A</div>
+              </td>
+
+            <td class="left">
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/models/resposta_form.html">RespostaForm</a>
+                </li>
+              </ul>
+            </td>
+            <td>3</td>
+            <td>0.0</td>
+            <td>0</td>
+            <td>0</td>
+          </tr>
+
+          <tr>
+
+              <td class="center">
+
+                <div class="rating a">A</div>
+              </td>
+
+            <td class="left">
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/models/template.html">Template</a>
+                </li>
+              </ul>
+            </td>
+            <td>5</td>
+            <td>40.84</td>
+            <td>0</td>
+            <td>3</td>
+          </tr>
+
+          <tr>
+
+              <td class="center">
+
+                <div class="rating a">A</div>
+              </td>
+
+            <td class="left">
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/models/turma.html">Turma</a>
+                </li>
+              </ul>
+            </td>
+            <td>4</td>
+            <td>0.0</td>
+            <td>0</td>
+            <td>0</td>
+          </tr>
+
+          <tr>
+
+              <td class="center">
+
+                <div class="rating a">A</div>
+              </td>
+
+            <td class="left">
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/models/usuario.html">Usuario</a>
+                </li>
+              </ul>
+            </td>
+            <td>4</td>
+            <td>43.76</td>
+            <td>0</td>
+            <td>7</td>
+          </tr>
+
+          <tr>
+
+              <td class="center">
+
+                <div class="rating d">D</div>
+              </td>
+
+            <td class="left">
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/services/sigaa_importer.html">SigaaImporter</a>
+                </li>
+              </ul>
+            </td>
+            <td>7</td>
+            <td>204.8</td>
+            <td>0</td>
+            <td>29</td>
+          </tr>
+
+      </tbody>
+    </table>
+</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="assets/vendor/javascripts/prettify.js"></script>
+  <script src="assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="assets/javascripts/application.js"></script>
+  <script src="assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/config/application_html.html b/doc/tmp/rubycritic/config/application_html.html new file mode 100644 index 0000000000..7d0024e26b --- /dev/null +++ b/doc/tmp/rubycritic/config/application_html.html @@ -0,0 +1,2061 @@ + + + + + + + +application.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../overview.html"><img src="../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-05-20 08:32:31 -0300'>2026-05-20 08:32:31 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>config /</small> application.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating a big">
+            A
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">27</span><small> lines of codes</small></div>
+            <div><span class="metric">0</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">N/A</span><small> complexity/method</small></div>
+            <div><span class="metric">1</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">0.0</span><small> complexity</small></div>
+            <div><span class="metric">0</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              1
+              smell
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code">require_relative &quot;boot&quot;
+ +

require &quot;rails/all&quot;

+ +

# Require the gems listed in Gemfile, including any gems # you&#39;ve limited to :test, :development, or :production. Bundler.require(*Rails.groups)

+ +

module Camaar

+ +
class Application &lt; Rails::Application<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Irresponsible-Module.md" target="_blank"><b>IrresponsibleModule</b></a>        </span>      </div>      <span>Camaar::Application has no descriptive comment</span>          </div>  </li></ol>
+  # Initialize configuration defaults for originally generated Rails version.
+  config.load_defaults 8.1
+
+  # Please, add to the `ignore` list any other `lib` subdirectories that do
+  # not contain `.rb` files, or that should not be reloaded or eager loaded.
+  # Common ones are `templates`, `generators`, or `middleware`, for example.
+  config.autoload_lib(ignore: %w[assets tasks])
+
+  # Configuration for the application, engines, and railties goes here.
+  #
+  # These settings can be overridden in specific environments using the files
+  # in config/environments, which are processed later.
+  #
+  # config.time_zone = &quot;Central Time (US &amp; Canada)&quot;
+  # config.eager_load_paths &lt;&lt; Rails.root.join(&quot;extras&quot;)
+end
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../assets/javascripts/application.js"></script>
+  <script src="../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/config/boot_html.html b/doc/tmp/rubycritic/config/boot_html.html new file mode 100644 index 0000000000..1dc99b4ab3 --- /dev/null +++ b/doc/tmp/rubycritic/config/boot_html.html @@ -0,0 +1,2037 @@ + + + + + + + +boot.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../overview.html"><img src="../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-05-20 08:32:31 -0300'>2026-05-20 08:32:31 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>config /</small> boot.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating a big">
+            A
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">4</span><small> lines of codes</small></div>
+            <div><span class="metric">0</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">N/A</span><small> complexity/method</small></div>
+            <div><span class="metric">1</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">0.0</span><small> complexity</small></div>
+            <div><span class="metric">0</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              0
+              smell
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code">ENV[&quot;BUNDLE_GEMFILE&quot;] ||= File.expand_path(&quot;../Gemfile&quot;, __dir__)
+ +

require &quot;bundler/setup&quot; # Set up gems listed in the Gemfile. require &quot;bootsnap/setup&quot; # Speed up boot time by caching expensive operations. </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../assets/javascripts/application.js"></script>
+  <script src="../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/config/ci_html.html b/doc/tmp/rubycritic/config/ci_html.html new file mode 100644 index 0000000000..ffc3a41bc4 --- /dev/null +++ b/doc/tmp/rubycritic/config/ci_html.html @@ -0,0 +1,2060 @@ + + + + + + + +ci.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../overview.html"><img src="../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-05-20 08:32:31 -0300'>2026-05-20 08:32:31 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>config /</small> ci.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating a big">
+            A
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">24</span><small> lines of codes</small></div>
+            <div><span class="metric">0</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">N/A</span><small> complexity/method</small></div>
+            <div><span class="metric">1</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">0.0</span><small> complexity</small></div>
+            <div><span class="metric">0</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              0
+              smell
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code"># Run using bin/ci
+ +

CI.run do

+ +
step &quot;Setup&quot;, &quot;bin/setup --skip-server&quot;
+
+step &quot;Style: Ruby&quot;, &quot;bin/rubocop&quot;
+
+step &quot;Security: Gem audit&quot;, &quot;bin/bundler-audit&quot;
+step &quot;Security: Importmap vulnerability audit&quot;, &quot;bin/importmap audit&quot;
+step &quot;Security: Brakeman code analysis&quot;, &quot;bin/brakeman --quiet --no-pager --exit-on-warn --exit-on-error&quot;
+step &quot;Tests: Rails&quot;, &quot;bin/rails test&quot;
+step &quot;Tests: Seeds&quot;, &quot;env RAILS_ENV=test bin/rails db:seed:replant&quot;
+
+# Optional: Run system tests
+# step &quot;Tests: System&quot;, &quot;bin/rails test:system&quot;
+
+# Optional: set a green GitHub commit status to unblock PR merge.
+# Requires the `gh` CLI and `gh extension install basecamp/gh-signoff`.
+# if success?
+#   step &quot;Signoff: All systems go. Ready for merge and deploy.&quot;, &quot;gh signoff&quot;
+# else
+#   failure &quot;Signoff: CI failed. Do not merge or deploy.&quot;, &quot;Fix the issues and try again.&quot;
+# end
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../assets/javascripts/application.js"></script>
+  <script src="../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/config/environment_html.html b/doc/tmp/rubycritic/config/environment_html.html new file mode 100644 index 0000000000..6ecc7be797 --- /dev/null +++ b/doc/tmp/rubycritic/config/environment_html.html @@ -0,0 +1,2039 @@ + + + + + + + +environment.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../overview.html"><img src="../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-05-20 08:32:31 -0300'>2026-05-20 08:32:31 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>config /</small> environment.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating a big">
+            A
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">5</span><small> lines of codes</small></div>
+            <div><span class="metric">0</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">N/A</span><small> complexity/method</small></div>
+            <div><span class="metric">1</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">0.0</span><small> complexity</small></div>
+            <div><span class="metric">0</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              0
+              smell
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code"># Load the Rails application.
+ +

require_relative &quot;application&quot;

+ +

# Initialize the Rails application. Rails.application.initialize! </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../assets/javascripts/application.js"></script>
+  <script src="../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/config/environments/development_html.html b/doc/tmp/rubycritic/config/environments/development_html.html new file mode 100644 index 0000000000..fd71392746 --- /dev/null +++ b/doc/tmp/rubycritic/config/environments/development_html.html @@ -0,0 +1,2135 @@ + + + + + + + +development.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-06-14 16:59:45 -0300'>2026-06-14 16:59:45 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>config/environments /</small> development.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating c big">
+            C
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">99</span><small> lines of codes</small></div>
+            <div><span class="metric">0</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">N/A</span><small> complexity/method</small></div>
+            <div><span class="metric">3</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">0.0</span><small> complexity</small></div>
+            <div><span class="metric">38</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              1
+              smell
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code">require &quot;active_support/core_ext/integer/time&quot;
+ +

Rails.application.configure do

+ +
# Configure &#39;rails notes&#39; to inspect Cucumber files
+config.annotations.register_directories(&quot;features&quot;)
+config.annotations.register_extensions(&quot;feature&quot;) { |tag| /#\s*(#{tag}):?\s*(.*)$/ }
+
+# Settings specified here will take precedence over those in config/application.rb.
+
+# Make code changes take effect immediately without server restart.
+config.enable_reloading = true
+
+# Do not eager load code on boot.
+config.eager_load = false
+
+# Show full error reports.
+config.consider_all_requests_local = true
+
+# Enable server timing.
+config.server_timing = true
+
+# Enable/disable Action Controller caching. By default Action Controller caching is disabled.
+# Run rails dev:cache to toggle Action Controller caching.
+if Rails.root.join(&quot;tmp/caching-dev.txt&quot;).exist?
+  config.action_controller.perform_caching = true
+  config.action_controller.enable_fragment_cache_logging = true
+  config.public_file_server.headers = { &quot;cache-control&quot; =&gt; &quot;public, max-age=#{2.days.to_i}&quot; }
+else
+  config.action_controller.perform_caching = false
+end
+
+# Change to :null_store to avoid any caching.
+config.cache_store = :memory_store
+
+# Store uploaded files on the local file system (see config/storage.yml for options).
+config.active_storage.service = :local
+
+# Don&#39;t care if the mailer can&#39;t send.
+config.action_mailer.raise_delivery_errors = true
+
+# Make template changes take effect immediately.
+config.action_mailer.perform_caching = false
+
+# Set localhost to be used by links generated in mailer templates.
+config.action_mailer.default_url_options = {
+  host: ENV.fetch(&quot;APP_HOST&quot;, &quot;localhost:3000&quot;),
+  protocol: ENV.fetch(&quot;APP_PROTOCOL&quot;, &quot;http&quot;)
+}
+
+# Gmail SMTP configuration via environment variables
+config.action_mailer.delivery_method = :smtp
+config.action_mailer.smtp_settings = {<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="http://docs.seattlerb.org/flay/" target="_blank"><b>DuplicateCode</b></a>        </span>      </div>      <span>Identical code found in 2 nodes</span>              <span>Locations:</span>                  <a href="development.html#L52" class="js-smell-location">0</a>                  <a href="production.html#L68" class="js-smell-location">1</a>                  </div>  </li></ol>
+  address:              ENV.fetch(&quot;SMTP_ADDRESS&quot;, &quot;smtp.gmail.com&quot;),
+  port:                 ENV.fetch(&quot;SMTP_PORT&quot;, 587).to_i,
+  domain:               ENV.fetch(&quot;SMTP_DOMAIN&quot;, &quot;gmail.com&quot;),
+  user_name:            ENV.fetch(&quot;SMTP_USERNAME&quot;, &quot;&quot;),
+  password:             ENV.fetch(&quot;SMTP_PASSWORD&quot;, &quot;&quot;),
+  authentication:       :plain,
+  enable_starttls_auto: true,
+  open_timeout:         10,
+  read_timeout:         10
+}
+
+# Print deprecation notices to the Rails logger.
+config.active_support.deprecation = :log
+
+# Raise an error on page load if there are pending migrations.
+config.active_record.migration_error = :page_load
+
+# Highlight code that triggered database queries in logs.
+config.active_record.verbose_query_logs = true
+
+# Append comments with runtime information tags to SQL queries in logs.
+config.active_record.query_log_tags_enabled = true
+
+# Highlight code that enqueued background job in logs.
+config.active_job.verbose_enqueue_logs = true
+
+# Highlight code that triggered redirect in logs.
+config.action_dispatch.verbose_redirect_logs = true
+
+# Suppress logger output for asset requests.
+config.assets.quiet = true
+
+# Raises error for missing translations.
+# config.i18n.raise_on_missing_translations = true
+
+# Annotate rendered view with file names.
+config.action_view.annotate_rendered_view_with_filenames = true
+
+# Uncomment if you wish to allow Action Cable access from any origin.
+# config.action_cable.disable_request_forgery_protection = true
+
+# Raise error when a before_action&#39;s only/except options reference missing actions.
+config.action_controller.raise_on_missing_callback_actions = true
+
+# Apply autocorrection by RuboCop to files generated by `bin/rails generate`.
+# config.generators.apply_rubocop_autocorrect_after_generate!
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/config/environments/production_html.html b/doc/tmp/rubycritic/config/environments/production_html.html new file mode 100644 index 0000000000..28a5b1eee7 --- /dev/null +++ b/doc/tmp/rubycritic/config/environments/production_html.html @@ -0,0 +1,2134 @@ + + + + + + + +production.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-06-14 16:59:45 -0300'>2026-06-14 16:59:45 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>config/environments /</small> production.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating c big">
+            C
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">98</span><small> lines of codes</small></div>
+            <div><span class="metric">0</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">N/A</span><small> complexity/method</small></div>
+            <div><span class="metric">2</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">0.0</span><small> complexity</small></div>
+            <div><span class="metric">38</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              1
+              smell
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code">require &quot;active_support/core_ext/integer/time&quot;
+ +

Rails.application.configure do

+ +
# Settings specified here will take precedence over those in config/application.rb.
+
+# Code is not reloaded between requests.
+config.enable_reloading = false
+
+# Eager load code on boot for better performance and memory savings (ignored by Rake tasks).
+config.eager_load = true
+
+# Full error reports are disabled.
+config.consider_all_requests_local = false
+
+# Turn on fragment caching in view templates.
+config.action_controller.perform_caching = true
+
+# Cache assets for far-future expiry since they are all digest stamped.
+config.public_file_server.headers = { &quot;cache-control&quot; =&gt; &quot;public, max-age=#{1.year.to_i}&quot; }
+
+# Enable serving of images, stylesheets, and JavaScripts from an asset server.
+# config.asset_host = &quot;http://assets.example.com&quot;
+
+# Store uploaded files on the local file system (see config/storage.yml for options).
+config.active_storage.service = :local
+
+# Assume all access to the app is happening through a SSL-terminating reverse proxy.
+# config.assume_ssl = true
+
+# Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies.
+# config.force_ssl = true
+
+# Skip http-to-https redirect for the default health check endpoint.
+# config.ssl_options = { redirect: { exclude: -&gt;(request) { request.path == &quot;/up&quot; } } }
+
+# Log to STDOUT with the current request id as a default log tag.
+config.log_tags = [ :request_id ]
+config.logger   = ActiveSupport::TaggedLogging.logger(STDOUT)
+
+# Change to &quot;debug&quot; to log everything (including potentially personally-identifiable information!).
+config.log_level = ENV.fetch(&quot;RAILS_LOG_LEVEL&quot;, &quot;info&quot;)
+
+# Prevent health checks from clogging up the logs.
+config.silence_healthcheck_path = &quot;/up&quot;
+
+# Don&#39;t log any deprecations.
+config.active_support.report_deprecations = false
+
+# Replace the default in-process memory cache store with a durable alternative.
+config.cache_store = :solid_cache_store
+
+# Replace the default in-process and non-durable queuing backend for Active Job.
+config.active_job.queue_adapter = :solid_queue
+config.solid_queue.connects_to = { database: { writing: :queue } }
+
+# Ignore bad email addresses and do not raise email delivery errors.
+# Set this to true and configure the email server for immediate delivery to raise delivery errors.
+config.action_mailer.raise_delivery_errors = true
+
+# Set host to be used by links generated in mailer templates.
+config.action_mailer.default_url_options = {
+  host: ENV.fetch(&quot;APP_HOST&quot;, &quot;example.com&quot;),
+  protocol: ENV.fetch(&quot;APP_PROTOCOL&quot;, &quot;https&quot;)
+}
+
+# Gmail SMTP configuration via environment variables
+config.action_mailer.delivery_method = :smtp
+config.action_mailer.smtp_settings = {<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="http://docs.seattlerb.org/flay/" target="_blank"><b>DuplicateCode</b></a>        </span>      </div>      <span>Identical code found in 2 nodes</span>              <span>Locations:</span>                  <a href="development.html#L52" class="js-smell-location">0</a>                  <a href="production.html#L68" class="js-smell-location">1</a>                  </div>  </li></ol>
+  address:              ENV.fetch(&quot;SMTP_ADDRESS&quot;, &quot;smtp.gmail.com&quot;),
+  port:                 ENV.fetch(&quot;SMTP_PORT&quot;, 587).to_i,
+  domain:               ENV.fetch(&quot;SMTP_DOMAIN&quot;, &quot;gmail.com&quot;),
+  user_name:            ENV.fetch(&quot;SMTP_USERNAME&quot;, &quot;&quot;),
+  password:             ENV.fetch(&quot;SMTP_PASSWORD&quot;, &quot;&quot;),
+  authentication:       :plain,
+  enable_starttls_auto: true,
+  open_timeout:         10,
+  read_timeout:         10
+}
+
+# Enable locale fallbacks for I18n (makes lookups for any locale fall back to
+# the I18n.default_locale when a translation cannot be found).
+config.i18n.fallbacks = true
+
+# Do not dump schema after migrations.
+config.active_record.dump_schema_after_migration = false
+
+# Only use :id for inspections in production.
+config.active_record.attributes_for_inspect = [ :id ]
+
+# Enable DNS rebinding protection and other `Host` header attacks.
+# config.hosts = [
+#   &quot;example.com&quot;,     # Allow requests from example.com
+#   /.*\.example\.com/ # Allow requests from subdomains like `www.example.com`
+# ]
+#
+# Skip DNS rebinding protection for the default health check endpoint.
+# config.host_authorization = { exclude: -&gt;(request) { request.path == &quot;/up&quot; } }
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/config/environments/test_html.html b/doc/tmp/rubycritic/config/environments/test_html.html new file mode 100644 index 0000000000..2a8f646c20 --- /dev/null +++ b/doc/tmp/rubycritic/config/environments/test_html.html @@ -0,0 +1,2092 @@ + + + + + + + +test.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-05-20 09:14:38 -0300'>2026-05-20 09:14:38 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>config/environments /</small> test.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating a big">
+            A
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">57</span><small> lines of codes</small></div>
+            <div><span class="metric">0</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">N/A</span><small> complexity/method</small></div>
+            <div><span class="metric">2</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">0.0</span><small> complexity</small></div>
+            <div><span class="metric">0</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              0
+              smell
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code"># The test environment is used exclusively to run your application&#39;s
+ +

# test suite. You never need to work with it otherwise. Remember that # your test database is &quot;scratch space&quot; for the test suite and is wiped # and recreated between test runs. Don&#39;t rely on the data there!

+ +

Rails.application.configure do

+ +
# Configure &#39;rails notes&#39; to inspect Cucumber files
+config.annotations.register_directories(&quot;features&quot;)
+config.annotations.register_extensions(&quot;feature&quot;) { |tag| /#\s*(#{tag}):?\s*(.*)$/ }
+
+# Settings specified here will take precedence over those in config/application.rb.
+
+# While tests run files are not watched, reloading is not necessary.
+config.enable_reloading = false
+
+# Eager loading loads your entire application. When running a single test locally,
+# this is usually not necessary, and can slow down your test suite. However, it&#39;s
+# recommended that you enable it in continuous integration systems to ensure eager
+# loading is working properly before deploying your code.
+config.eager_load = ENV[&quot;CI&quot;].present?
+
+# Configure public file server for tests with cache-control for performance.
+config.public_file_server.headers = { &quot;cache-control&quot; =&gt; &quot;public, max-age=3600&quot; }
+
+# Show full error reports.
+config.consider_all_requests_local = true
+config.cache_store = :null_store
+
+# Render exception templates for rescuable exceptions and raise for other exceptions.
+config.action_dispatch.show_exceptions = :rescuable
+
+# Disable request forgery protection in test environment.
+config.action_controller.allow_forgery_protection = false
+
+# Store uploaded files on the local file system in a temporary directory.
+config.active_storage.service = :test
+
+# Tell Action Mailer not to deliver emails to the real world.
+# The :test delivery method accumulates sent emails in the
+# ActionMailer::Base.deliveries array.
+config.action_mailer.delivery_method = :test
+
+# Set host to be used by links generated in mailer templates.
+config.action_mailer.default_url_options = { host: &quot;example.com&quot; }
+
+# Print deprecation notices to the stderr.
+config.active_support.deprecation = :stderr
+
+# Raises error for missing translations.
+# config.i18n.raise_on_missing_translations = true
+
+# Annotate rendered view with file names.
+# config.action_view.annotate_rendered_view_with_filenames = true
+
+# Raise error when a before_action&#39;s only/except options reference missing actions.
+config.action_controller.raise_on_missing_callback_actions = true
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/config/importmap_html.html b/doc/tmp/rubycritic/config/importmap_html.html new file mode 100644 index 0000000000..06588cdfa6 --- /dev/null +++ b/doc/tmp/rubycritic/config/importmap_html.html @@ -0,0 +1,2037 @@ + + + + + + + +importmap.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../overview.html"><img src="../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-05-20 08:32:31 -0300'>2026-05-20 08:32:31 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>config /</small> importmap.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating a big">
+            A
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">7</span><small> lines of codes</small></div>
+            <div><span class="metric">0</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">N/A</span><small> complexity/method</small></div>
+            <div><span class="metric">1</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">0.0</span><small> complexity</small></div>
+            <div><span class="metric">0</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              0
+              smell
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code"># Pin npm packages by running ./bin/importmap
+ +

pin &quot;application&quot; pin &quot;@hotwired/turbo-rails&quot;, to: &quot;turbo.min.js&quot; pin &quot;@hotwired/stimulus&quot;, to: &quot;stimulus.min.js&quot; pin &quot;@hotwired/stimulus-loading&quot;, to: &quot;stimulus-loading.js&quot; pin_all_from &quot;app/javascript/controllers&quot;, under: &quot;controllers&quot; </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../assets/javascripts/application.js"></script>
+  <script src="../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/config/initializers/assets_html.html b/doc/tmp/rubycritic/config/initializers/assets_html.html new file mode 100644 index 0000000000..6df78bb9e7 --- /dev/null +++ b/doc/tmp/rubycritic/config/initializers/assets_html.html @@ -0,0 +1,2039 @@ + + + + + + + +assets.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-05-20 08:32:31 -0300'>2026-05-20 08:32:31 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>config/initializers /</small> assets.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating a big">
+            A
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">7</span><small> lines of codes</small></div>
+            <div><span class="metric">0</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">N/A</span><small> complexity/method</small></div>
+            <div><span class="metric">1</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">0.0</span><small> complexity</small></div>
+            <div><span class="metric">0</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              0
+              smell
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code"># Be sure to restart your server when you modify this file.
+ +

# Version of your assets, change this if you want to expire all your assets. Rails.application.config.assets.version = &quot;1.0&quot;

+ +

# Add additional assets to the asset load path. # Rails.application.config.assets.paths &lt;&lt; Emoji.images_path </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/config/initializers/content_security_policy_html.html b/doc/tmp/rubycritic/config/initializers/content_security_policy_html.html new file mode 100644 index 0000000000..fc003ca07e --- /dev/null +++ b/doc/tmp/rubycritic/config/initializers/content_security_policy_html.html @@ -0,0 +1,2039 @@ + + + + + + + +content_security_policy.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-05-20 08:32:31 -0300'>2026-05-20 08:32:31 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>config/initializers /</small> content_security_policy.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating a big">
+            A
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">29</span><small> lines of codes</small></div>
+            <div><span class="metric">0</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">N/A</span><small> complexity/method</small></div>
+            <div><span class="metric">1</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">0.0</span><small> complexity</small></div>
+            <div><span class="metric">0</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              0
+              smell
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code"># Be sure to restart your server when you modify this file.
+ +

# Define an application-wide content security policy. # See the Securing Rails Applications Guide for more information: # guides.rubyonrails.org/security.html#content-security-policy-header

+ +

# Rails.application.configure do # config.content_security_policy do |policy| # policy.default_src :self, :https # policy.font_src :self, :https, :data # policy.img_src :self, :https, :data # policy.object_src :none # policy.script_src :self, :https # policy.style_src :self, :https # # Specify URI for violation reports # # policy.report_uri &quot;/csp-violation-report-endpoint&quot; # end # # # Generate session nonces for permitted importmap, inline scripts, and inline styles. # config.content_security_policy_nonce_generator = -&gt;(request) { request.session.id.to_s } # config.content_security_policy_nonce_directives = %w(script-src style-src) # # # Automatically add nonce to javascript_tag, javascript_include_tag, and stylesheet_link_tag # # if the corresponding directives are specified in content_security_policy_nonce_directives. # # config.content_security_policy_nonce_auto = true # # # Report violations without enforcing the policy. # # config.content_security_policy_report_only = true # end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/config/initializers/filter_parameter_logging_html.html b/doc/tmp/rubycritic/config/initializers/filter_parameter_logging_html.html new file mode 100644 index 0000000000..2fb21f86dd --- /dev/null +++ b/doc/tmp/rubycritic/config/initializers/filter_parameter_logging_html.html @@ -0,0 +1,2041 @@ + + + + + + + +filter_parameter_logging.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-05-20 08:32:31 -0300'>2026-05-20 08:32:31 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>config/initializers /</small> filter_parameter_logging.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating a big">
+            A
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">8</span><small> lines of codes</small></div>
+            <div><span class="metric">0</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">N/A</span><small> complexity/method</small></div>
+            <div><span class="metric">1</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">0.0</span><small> complexity</small></div>
+            <div><span class="metric">0</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              0
+              smell
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code"># Be sure to restart your server when you modify this file.
+ +

# Configure parameters to be partially matched (e.g. passw matches password) and filtered from the log file. # Use this to limit dissemination of sensitive information. # See the ActiveSupport::ParameterFilter documentation for supported notations and behaviors. Rails.application.config.filter_parameters += [

+ +
:passw, :email, :secret, :token, :_key, :crypt, :salt, :certificate, :otp, :ssn, :cvv, :cvc
+ +

] </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/config/initializers/inflections_html.html b/doc/tmp/rubycritic/config/initializers/inflections_html.html new file mode 100644 index 0000000000..4045e08df9 --- /dev/null +++ b/doc/tmp/rubycritic/config/initializers/inflections_html.html @@ -0,0 +1,2039 @@ + + + + + + + +inflections.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-05-20 08:32:31 -0300'>2026-05-20 08:32:31 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>config/initializers /</small> inflections.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating a big">
+            A
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">16</span><small> lines of codes</small></div>
+            <div><span class="metric">0</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">N/A</span><small> complexity/method</small></div>
+            <div><span class="metric">1</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">0.0</span><small> complexity</small></div>
+            <div><span class="metric">0</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              0
+              smell
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code"># Be sure to restart your server when you modify this file.
+ +

# Add new inflection rules using the following format. Inflections # are locale specific, and you may define rules for as many different # locales as you wish. All of these examples are active by default: # ActiveSupport::Inflector.inflections(:en) do |inflect| # inflect.plural /^(ox)$/i, &quot;\1en&quot; # inflect.singular /^(ox)en/i, &quot;\1&quot; # inflect.irregular &quot;person&quot;, &quot;people&quot; # inflect.uncountable %w( fish sheep ) # end

+ +

# These inflection rules are supported but not enabled by default: # ActiveSupport::Inflector.inflections(:en) do |inflect| # inflect.acronym &quot;RESTful&quot; # end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/config/puma_html.html b/doc/tmp/rubycritic/config/puma_html.html new file mode 100644 index 0000000000..854c375acf --- /dev/null +++ b/doc/tmp/rubycritic/config/puma_html.html @@ -0,0 +1,2045 @@ + + + + + + + +puma.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../overview.html"><img src="../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-05-20 08:32:31 -0300'>2026-05-20 08:32:31 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>config /</small> puma.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating a big">
+            A
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">42</span><small> lines of codes</small></div>
+            <div><span class="metric">0</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">N/A</span><small> complexity/method</small></div>
+            <div><span class="metric">1</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">0.0</span><small> complexity</small></div>
+            <div><span class="metric">0</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              0
+              smell
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code"># This configuration file will be evaluated by Puma. The top-level methods that
+ +

# are invoked here are part of Puma&#39;s configuration DSL. For more information # about methods provided by the DSL, see puma.io/puma/Puma/DSL.html. # # Puma starts a configurable number of processes (workers) and each process # serves each request in a thread from an internal thread pool. # # You can control the number of workers using ENV. You # should only set this value when you want to run 2 or more workers. The # default is already 1. You can set it to auto to automatically start a worker # for each available processor. # # The ideal number of threads per worker depends both on how much time the # application spends waiting for IO operations and on how much you wish to # prioritize throughput over latency. # # As a rule of thumb, increasing the number of threads will increase how much # traffic a given process can handle (throughput), but due to CRuby&#39;s # Global VM Lock (GVL) it has diminishing returns and will degrade the # response time (latency) of the application. # # The default is set to 3 threads as it&#39;s deemed a decent compromise between # throughput and latency for the average Rails application. # # Any libraries that use a connection pool or another resource pool should # be configured to provide at least as many connections as the number of # threads. This includes Active Record&#39;s pool parameter in database.yml. threads_count = ENV.fetch(&quot;RAILS_MAX_THREADS&quot;, 3) threads threads_count, threads_count

+ +

# Specifies the port that Puma will listen on to receive requests; default is 3000. port ENV.fetch(&quot;PORT&quot;, 3000)

+ +

# Allow puma to be restarted by ‘bin/rails restart` command. plugin :tmp_restart

+ +

# Run the Solid Queue supervisor inside of Puma for single-server deployments. plugin :solid_queue if ENV

+ +

# Specify the PID file. Defaults to tmp/pids/server.pid in development. # In other environments, only set the PID file if requested. pidfile ENV if ENV </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../assets/javascripts/application.js"></script>
+  <script src="../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/config/routes_html.html b/doc/tmp/rubycritic/config/routes_html.html new file mode 100644 index 0000000000..f0a2861a4d --- /dev/null +++ b/doc/tmp/rubycritic/config/routes_html.html @@ -0,0 +1,2098 @@ + + + + + + + +routes.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../overview.html"><img src="../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-06-16 23:55:43 -0300'>2026-06-16 23:55:43 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>config /</small> routes.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating a big">
+            A
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">63</span><small> lines of codes</small></div>
+            <div><span class="metric">0</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">N/A</span><small> complexity/method</small></div>
+            <div><span class="metric">20</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">18.0</span><small> complexity</small></div>
+            <div><span class="metric">0</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              0
+              smell
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code">Rails.application.routes.draw do
+root &quot;sessions#new&quot;
+
+get &quot;/inicio&quot;, to: &quot;home#index&quot;, as: :inicio
+post &quot;/login&quot;, to: &quot;sessions#create&quot;, as: :login
+delete &quot;/logout&quot;, to: &quot;sessions#destroy&quot;, as: :logout
+
+get &quot;/definir_senha/:token&quot;, to: &quot;definicao_senhas#edit&quot;, as: :edit_definicao_senha
+patch &quot;/definir_senha/:token&quot;, to: &quot;definicao_senhas#update&quot;, as: :definicao_senha
+
+get &quot;/redefinir_senha&quot;, to: &quot;redefinicao_senhas#new&quot;, as: :redefinir_senha
+post &quot;/redefinir_senha&quot;, to: &quot;redefinicao_senhas#create&quot;
+get &quot;/redefinir_senha/:token&quot;, to: &quot;redefinicao_senhas#edit&quot;, as: :edit_redefinicao_senha
+patch &quot;/redefinir_senha/:token&quot;, to: &quot;redefinicao_senhas#update&quot;, as: :redefinicao_senha
+
+resources :resposta_elems
+resources :resposta_forms
+resources :campo_forms
+resources :elemento_forms
+resources :formularios
+resources :campos
+resources :elementos
+resources :docentes
+resources :discentes
+resources :usuarios
+resources :turmas
+resources :disciplinas
+resources :cursos
+resources :departamentos
+# Define your application routes per the DSL in https://guides.rubyonrails.org/routing.html
+
+# Reveal health status on /up that returns 200 if the app boots with no exceptions, otherwise 500.
+# Can be used by load balancers and uptime monitors to verify that the app is live.
+
+scope &quot;/admin/:admin_id&quot;, as: &quot;admin&quot; do
+  get &quot;avaliacoes&quot;, to: &quot;admin#avaliacoes&quot;, as: :avaliacoes
+  get &quot;gerenciamento&quot;, to: &quot;admin#gerenciamento&quot;, as: :gerenciamento
+  resources :templates
+  get  &quot;sincronizar_sigaa&quot;, to: &quot;admin#sincronizar_sigaa&quot;, as: :sincronizar_sigaa
+  post &quot;sincronizar_sigaa&quot;, to: &quot;admin#sincronizar_sigaa&quot;
+  get  &quot;enviar_formularios&quot;, to: &quot;admin#enviar_formularios&quot;, as: :enviar_formularios
+  post &quot;enviar_formularios&quot;, to: &quot;admin#enviar_formularios&quot;
+  get &quot;resultados&quot;, to: &quot;admin#resultados&quot;, as: :resultados
+  get &quot;resultados/:id/download.csv&quot;, to: &quot;admin#exportar_csv&quot;, as: :baixar_csv
+end
+
+scope &quot;/usuarios/:usuario_id&quot;, as: &quot;usuarios&quot; do
+  get &quot;avaliacoes&quot;, to: &quot;usuarios#avaliacoes&quot;, as: :avaliacoes
+  get &quot;formularios/:formulario_id/responder&quot;, to: &quot;usuarios#responder_formulario&quot;, as: :responder_formulario
+  post &quot;formularios/:formulario_id/responder&quot;, to: &quot;usuarios#submeter_resposta&quot;, as: :submeter_resposta
+end
+
+post &quot;admin/importar_sigaa&quot;, to: &quot;admin#importar_sigaa&quot;, as: :importar_sigaa
+post &quot;admin/atualizar_sigaa&quot;, to: &quot;admin#atualizar_sigaa&quot;, as: :atualizar_sigaa
+
+get &quot;up&quot; =&gt; &quot;rails/health#show&quot;, as: :rails_health_check
+# Render dynamic PWA files from app/views/pwa/* (remember to link manifest in application.html.erb)
+# get &quot;manifest&quot; =&gt; &quot;rails/pwa#manifest&quot;, as: :pwa_manifest
+# get &quot;service-worker&quot; =&gt; &quot;rails/pwa#service_worker&quot;, as: :pwa_service_worker
+
+# Defines the root path route (&quot;/&quot;)
+# root &quot;posts#index&quot;
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../assets/javascripts/application.js"></script>
+  <script src="../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/db/cable_schema_html.html b/doc/tmp/rubycritic/db/cable_schema_html.html new file mode 100644 index 0000000000..dd55e79997 --- /dev/null +++ b/doc/tmp/rubycritic/db/cable_schema_html.html @@ -0,0 +1,2046 @@ + + + + + + + +cable_schema.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../overview.html"><img src="../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-05-20 08:32:31 -0300'>2026-05-20 08:32:31 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>db /</small> cable_schema.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating a big">
+            A
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">11</span><small> lines of codes</small></div>
+            <div><span class="metric">0</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">N/A</span><small> complexity/method</small></div>
+            <div><span class="metric">1</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">10.55</span><small> complexity</small></div>
+            <div><span class="metric">0</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              0
+              smell
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code">ActiveRecord::Schema[7.1].define(version: 1) do
+create_table &quot;solid_cable_messages&quot;, force: :cascade do |t|
+  t.binary &quot;channel&quot;, limit: 1024, null: false
+  t.binary &quot;payload&quot;, limit: 536870912, null: false
+  t.datetime &quot;created_at&quot;, null: false
+  t.integer &quot;channel_hash&quot;, limit: 8, null: false
+  t.index [&quot;channel&quot;], name: &quot;index_solid_cable_messages_on_channel&quot;
+  t.index [&quot;channel_hash&quot;], name: &quot;index_solid_cable_messages_on_channel_hash&quot;
+  t.index [&quot;created_at&quot;], name: &quot;index_solid_cable_messages_on_created_at&quot;
+end
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../assets/javascripts/application.js"></script>
+  <script src="../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/db/cache_schema_html.html b/doc/tmp/rubycritic/db/cache_schema_html.html new file mode 100644 index 0000000000..e14cce6fe8 --- /dev/null +++ b/doc/tmp/rubycritic/db/cache_schema_html.html @@ -0,0 +1,2047 @@ + + + + + + + +cache_schema.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../overview.html"><img src="../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-05-20 08:32:31 -0300'>2026-05-20 08:32:31 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>db /</small> cache_schema.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating a big">
+            A
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">12</span><small> lines of codes</small></div>
+            <div><span class="metric">0</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">N/A</span><small> complexity/method</small></div>
+            <div><span class="metric">1</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">12.1</span><small> complexity</small></div>
+            <div><span class="metric">0</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              0
+              smell
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code">ActiveRecord::Schema[7.2].define(version: 1) do
+create_table &quot;solid_cache_entries&quot;, force: :cascade do |t|
+  t.binary &quot;key&quot;, limit: 1024, null: false
+  t.binary &quot;value&quot;, limit: 536870912, null: false
+  t.datetime &quot;created_at&quot;, null: false
+  t.integer &quot;key_hash&quot;, limit: 8, null: false
+  t.integer &quot;byte_size&quot;, limit: 4, null: false
+  t.index [&quot;byte_size&quot;], name: &quot;index_solid_cache_entries_on_byte_size&quot;
+  t.index [&quot;key_hash&quot;, &quot;byte_size&quot;], name: &quot;index_solid_cache_entries_on_key_hash_and_byte_size&quot;
+  t.index [&quot;key_hash&quot;], name: &quot;index_solid_cache_entries_on_key_hash&quot;, unique: true
+end
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../assets/javascripts/application.js"></script>
+  <script src="../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/db/migrate/20260527234832_create_departamentos_html.html b/doc/tmp/rubycritic/db/migrate/20260527234832_create_departamentos_html.html new file mode 100644 index 0000000000..f78424e88a --- /dev/null +++ b/doc/tmp/rubycritic/db/migrate/20260527234832_create_departamentos_html.html @@ -0,0 +1,2046 @@ + + + + + + + +20260527234832_create_departamentos.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-05-27 21:40:34 -0300'>2026-05-27 21:40:34 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>db/migrate /</small> 20260527234832_create_departamentos.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating a big">
+            A
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">11</span><small> lines of codes</small></div>
+            <div><span class="metric">1</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">5.7</span><small> complexity/method</small></div>
+            <div><span class="metric">1</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">5.69</span><small> complexity</small></div>
+            <div><span class="metric">0</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              3
+              smells
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code">class CreateDepartamentos &lt; ActiveRecord::Migration[8.1]<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Irresponsible-Module.md" target="_blank"><b>IrresponsibleModule</b></a>        </span>      </div>      <span>CreateDepartamentos has no descriptive comment</span>          </div>  </li></ol>
+def change
+  create_table :departamentos do |t|<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Uncommunicative-Variable-Name.md" target="_blank"><b>UncommunicativeVariableName</b></a>        </span>      </div>      <span>CreateDepartamentos#change has the variable name 't'</span>          </div>  </li></ol>
+    t.string :codigo<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Feature-Envy.md" target="_blank"><b>FeatureEnvy</b></a>        </span>      </div>      <span>CreateDepartamentos#change refers to 't' more than self (maybe move it to another class?)</span>              <span>Locations:</span>                  <a href="20260527234832_create_departamentos.html#L4" class="js-smell-location">0</a>                  <a href="20260527234832_create_departamentos.html#L5" class="js-smell-location">1</a>                  <a href="20260527234832_create_departamentos.html#L7" class="js-smell-location">2</a>                  </div>  </li></ol>
+    t.string :nome<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Feature-Envy.md" target="_blank"><b>FeatureEnvy</b></a>        </span>      </div>      <span>CreateDepartamentos#change refers to 't' more than self (maybe move it to another class?)</span>              <span>Locations:</span>                  <a href="20260527234832_create_departamentos.html#L4" class="js-smell-location">0</a>                  <a href="20260527234832_create_departamentos.html#L5" class="js-smell-location">1</a>                  <a href="20260527234832_create_departamentos.html#L7" class="js-smell-location">2</a>                  </div>  </li></ol>
+
+    t.timestamps<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Feature-Envy.md" target="_blank"><b>FeatureEnvy</b></a>        </span>      </div>      <span>CreateDepartamentos#change refers to 't' more than self (maybe move it to another class?)</span>              <span>Locations:</span>                  <a href="20260527234832_create_departamentos.html#L4" class="js-smell-location">0</a>                  <a href="20260527234832_create_departamentos.html#L5" class="js-smell-location">1</a>                  <a href="20260527234832_create_departamentos.html#L7" class="js-smell-location">2</a>                  </div>  </li></ol>
+  end
+  add_index :departamentos, :codigo, unique: true
+end
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/db/migrate/20260527234834_create_cursos_html.html b/doc/tmp/rubycritic/db/migrate/20260527234834_create_cursos_html.html new file mode 100644 index 0000000000..297b67ecb1 --- /dev/null +++ b/doc/tmp/rubycritic/db/migrate/20260527234834_create_cursos_html.html @@ -0,0 +1,2047 @@ + + + + + + + +20260527234834_create_cursos.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-05-27 21:40:34 -0300'>2026-05-27 21:40:34 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>db/migrate /</small> 20260527234834_create_cursos.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating b big">
+            B
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">12</span><small> lines of codes</small></div>
+            <div><span class="metric">1</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">6.9</span><small> complexity/method</small></div>
+            <div><span class="metric">1</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">6.87</span><small> complexity</small></div>
+            <div><span class="metric">29</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              5
+              smells
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code">class CreateCursos &lt; ActiveRecord::Migration[8.1]<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Irresponsible-Module.md" target="_blank"><b>IrresponsibleModule</b></a>        </span>      </div>      <span>CreateCursos has no descriptive comment</span>          </div>  </li></ol>
+def change<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="http://docs.seattlerb.org/flay/" target="_blank"><b>DuplicateCode</b></a>        </span>      </div>      <span>Similar code found in 2 nodes</span>              <span>Locations:</span>                  <a href="20260527234834_create_cursos.html#L2" class="js-smell-location">0</a>                  <a href="20260527234836_create_disciplinas.html#L2" class="js-smell-location">1</a>                  </div>  </li>  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Too-Many-Statements.md" target="_blank"><b>TooManyStatements</b></a>        </span>      </div>      <span>CreateCursos#change has approx 6 statements</span>          </div>  </li></ol>
+  create_table :cursos do |t|<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Uncommunicative-Variable-Name.md" target="_blank"><b>UncommunicativeVariableName</b></a>        </span>      </div>      <span>CreateCursos#change has the variable name 't'</span>          </div>  </li></ol>
+    t.string :codigo<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Feature-Envy.md" target="_blank"><b>FeatureEnvy</b></a>        </span>      </div>      <span>CreateCursos#change refers to 't' more than self (maybe move it to another class?)</span>              <span>Locations:</span>                  <a href="20260527234834_create_cursos.html#L4" class="js-smell-location">0</a>                  <a href="20260527234834_create_cursos.html#L5" class="js-smell-location">1</a>                  <a href="20260527234834_create_cursos.html#L6" class="js-smell-location">2</a>                  <a href="20260527234834_create_cursos.html#L8" class="js-smell-location">3</a>                  </div>  </li></ol>
+    t.string :nome<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Feature-Envy.md" target="_blank"><b>FeatureEnvy</b></a>        </span>      </div>      <span>CreateCursos#change refers to 't' more than self (maybe move it to another class?)</span>              <span>Locations:</span>                  <a href="20260527234834_create_cursos.html#L4" class="js-smell-location">0</a>                  <a href="20260527234834_create_cursos.html#L5" class="js-smell-location">1</a>                  <a href="20260527234834_create_cursos.html#L6" class="js-smell-location">2</a>                  <a href="20260527234834_create_cursos.html#L8" class="js-smell-location">3</a>                  </div>  </li></ol>
+    t.references :departamento, null: false, foreign_key: true<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Feature-Envy.md" target="_blank"><b>FeatureEnvy</b></a>        </span>      </div>      <span>CreateCursos#change refers to 't' more than self (maybe move it to another class?)</span>              <span>Locations:</span>                  <a href="20260527234834_create_cursos.html#L4" class="js-smell-location">0</a>                  <a href="20260527234834_create_cursos.html#L5" class="js-smell-location">1</a>                  <a href="20260527234834_create_cursos.html#L6" class="js-smell-location">2</a>                  <a href="20260527234834_create_cursos.html#L8" class="js-smell-location">3</a>                  </div>  </li></ol>
+
+    t.timestamps<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Feature-Envy.md" target="_blank"><b>FeatureEnvy</b></a>        </span>      </div>      <span>CreateCursos#change refers to 't' more than self (maybe move it to another class?)</span>              <span>Locations:</span>                  <a href="20260527234834_create_cursos.html#L4" class="js-smell-location">0</a>                  <a href="20260527234834_create_cursos.html#L5" class="js-smell-location">1</a>                  <a href="20260527234834_create_cursos.html#L6" class="js-smell-location">2</a>                  <a href="20260527234834_create_cursos.html#L8" class="js-smell-location">3</a>                  </div>  </li></ol>
+  end
+  add_index :cursos, :codigo, unique: true
+end
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/db/migrate/20260527234836_create_disciplinas_html.html b/doc/tmp/rubycritic/db/migrate/20260527234836_create_disciplinas_html.html new file mode 100644 index 0000000000..0164e38980 --- /dev/null +++ b/doc/tmp/rubycritic/db/migrate/20260527234836_create_disciplinas_html.html @@ -0,0 +1,2047 @@ + + + + + + + +20260527234836_create_disciplinas.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-05-27 21:40:34 -0300'>2026-05-27 21:40:34 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>db/migrate /</small> 20260527234836_create_disciplinas.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating b big">
+            B
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">12</span><small> lines of codes</small></div>
+            <div><span class="metric">1</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">6.9</span><small> complexity/method</small></div>
+            <div><span class="metric">1</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">6.87</span><small> complexity</small></div>
+            <div><span class="metric">29</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              5
+              smells
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code">class CreateDisciplinas &lt; ActiveRecord::Migration[8.1]<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Irresponsible-Module.md" target="_blank"><b>IrresponsibleModule</b></a>        </span>      </div>      <span>CreateDisciplinas has no descriptive comment</span>          </div>  </li></ol>
+def change<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="http://docs.seattlerb.org/flay/" target="_blank"><b>DuplicateCode</b></a>        </span>      </div>      <span>Similar code found in 2 nodes</span>              <span>Locations:</span>                  <a href="20260527234834_create_cursos.html#L2" class="js-smell-location">0</a>                  <a href="20260527234836_create_disciplinas.html#L2" class="js-smell-location">1</a>                  </div>  </li>  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Too-Many-Statements.md" target="_blank"><b>TooManyStatements</b></a>        </span>      </div>      <span>CreateDisciplinas#change has approx 6 statements</span>          </div>  </li></ol>
+  create_table :disciplinas do |t|<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Uncommunicative-Variable-Name.md" target="_blank"><b>UncommunicativeVariableName</b></a>        </span>      </div>      <span>CreateDisciplinas#change has the variable name 't'</span>          </div>  </li></ol>
+    t.string :codigo<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Feature-Envy.md" target="_blank"><b>FeatureEnvy</b></a>        </span>      </div>      <span>CreateDisciplinas#change refers to 't' more than self (maybe move it to another class?)</span>              <span>Locations:</span>                  <a href="20260527234836_create_disciplinas.html#L4" class="js-smell-location">0</a>                  <a href="20260527234836_create_disciplinas.html#L5" class="js-smell-location">1</a>                  <a href="20260527234836_create_disciplinas.html#L6" class="js-smell-location">2</a>                  <a href="20260527234836_create_disciplinas.html#L8" class="js-smell-location">3</a>                  </div>  </li></ol>
+    t.string :nome<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Feature-Envy.md" target="_blank"><b>FeatureEnvy</b></a>        </span>      </div>      <span>CreateDisciplinas#change refers to 't' more than self (maybe move it to another class?)</span>              <span>Locations:</span>                  <a href="20260527234836_create_disciplinas.html#L4" class="js-smell-location">0</a>                  <a href="20260527234836_create_disciplinas.html#L5" class="js-smell-location">1</a>                  <a href="20260527234836_create_disciplinas.html#L6" class="js-smell-location">2</a>                  <a href="20260527234836_create_disciplinas.html#L8" class="js-smell-location">3</a>                  </div>  </li></ol>
+    t.references :departamento, null: false, foreign_key: true<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Feature-Envy.md" target="_blank"><b>FeatureEnvy</b></a>        </span>      </div>      <span>CreateDisciplinas#change refers to 't' more than self (maybe move it to another class?)</span>              <span>Locations:</span>                  <a href="20260527234836_create_disciplinas.html#L4" class="js-smell-location">0</a>                  <a href="20260527234836_create_disciplinas.html#L5" class="js-smell-location">1</a>                  <a href="20260527234836_create_disciplinas.html#L6" class="js-smell-location">2</a>                  <a href="20260527234836_create_disciplinas.html#L8" class="js-smell-location">3</a>                  </div>  </li></ol>
+
+    t.timestamps<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Feature-Envy.md" target="_blank"><b>FeatureEnvy</b></a>        </span>      </div>      <span>CreateDisciplinas#change refers to 't' more than self (maybe move it to another class?)</span>              <span>Locations:</span>                  <a href="20260527234836_create_disciplinas.html#L4" class="js-smell-location">0</a>                  <a href="20260527234836_create_disciplinas.html#L5" class="js-smell-location">1</a>                  <a href="20260527234836_create_disciplinas.html#L6" class="js-smell-location">2</a>                  <a href="20260527234836_create_disciplinas.html#L8" class="js-smell-location">3</a>                  </div>  </li></ol>
+  end
+  add_index :disciplinas, :codigo, unique: true
+end
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/db/migrate/20260527234838_create_turmas_html.html b/doc/tmp/rubycritic/db/migrate/20260527234838_create_turmas_html.html new file mode 100644 index 0000000000..7f7a63409b --- /dev/null +++ b/doc/tmp/rubycritic/db/migrate/20260527234838_create_turmas_html.html @@ -0,0 +1,2047 @@ + + + + + + + +20260527234838_create_turmas.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-05-27 21:40:34 -0300'>2026-05-27 21:40:34 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>db/migrate /</small> 20260527234838_create_turmas.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating b big">
+            B
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">12</span><small> lines of codes</small></div>
+            <div><span class="metric">1</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">7.1</span><small> complexity/method</small></div>
+            <div><span class="metric">1</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">7.07</span><small> complexity</small></div>
+            <div><span class="metric">26</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              5
+              smells
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code">class CreateTurmas &lt; ActiveRecord::Migration[8.1]<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Irresponsible-Module.md" target="_blank"><b>IrresponsibleModule</b></a>        </span>      </div>      <span>CreateTurmas has no descriptive comment</span>          </div>  </li></ol>
+def change<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="http://docs.seattlerb.org/flay/" target="_blank"><b>DuplicateCode</b></a>        </span>      </div>      <span>Similar code found in 2 nodes</span>              <span>Locations:</span>                  <a href="20260527234838_create_turmas.html#L2" class="js-smell-location">0</a>                  <a href="20260527235031_create_campos.html#L2" class="js-smell-location">1</a>                  </div>  </li>  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Too-Many-Statements.md" target="_blank"><b>TooManyStatements</b></a>        </span>      </div>      <span>CreateTurmas#change has approx 6 statements</span>          </div>  </li></ol>
+  create_table :turmas do |t|<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Uncommunicative-Variable-Name.md" target="_blank"><b>UncommunicativeVariableName</b></a>        </span>      </div>      <span>CreateTurmas#change has the variable name 't'</span>          </div>  </li></ol>
+    t.string :numero_da_turma<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Feature-Envy.md" target="_blank"><b>FeatureEnvy</b></a>        </span>      </div>      <span>CreateTurmas#change refers to 't' more than self (maybe move it to another class?)</span>              <span>Locations:</span>                  <a href="20260527234838_create_turmas.html#L4" class="js-smell-location">0</a>                  <a href="20260527234838_create_turmas.html#L5" class="js-smell-location">1</a>                  <a href="20260527234838_create_turmas.html#L6" class="js-smell-location">2</a>                  <a href="20260527234838_create_turmas.html#L7" class="js-smell-location">3</a>                  <a href="20260527234838_create_turmas.html#L9" class="js-smell-location">4</a>                  </div>  </li></ol>
+    t.string :semestre<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Feature-Envy.md" target="_blank"><b>FeatureEnvy</b></a>        </span>      </div>      <span>CreateTurmas#change refers to 't' more than self (maybe move it to another class?)</span>              <span>Locations:</span>                  <a href="20260527234838_create_turmas.html#L4" class="js-smell-location">0</a>                  <a href="20260527234838_create_turmas.html#L5" class="js-smell-location">1</a>                  <a href="20260527234838_create_turmas.html#L6" class="js-smell-location">2</a>                  <a href="20260527234838_create_turmas.html#L7" class="js-smell-location">3</a>                  <a href="20260527234838_create_turmas.html#L9" class="js-smell-location">4</a>                  </div>  </li></ol>
+    t.string :horario<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Feature-Envy.md" target="_blank"><b>FeatureEnvy</b></a>        </span>      </div>      <span>CreateTurmas#change refers to 't' more than self (maybe move it to another class?)</span>              <span>Locations:</span>                  <a href="20260527234838_create_turmas.html#L4" class="js-smell-location">0</a>                  <a href="20260527234838_create_turmas.html#L5" class="js-smell-location">1</a>                  <a href="20260527234838_create_turmas.html#L6" class="js-smell-location">2</a>                  <a href="20260527234838_create_turmas.html#L7" class="js-smell-location">3</a>                  <a href="20260527234838_create_turmas.html#L9" class="js-smell-location">4</a>                  </div>  </li></ol>
+    t.references :disciplina, null: false, foreign_key: true<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Feature-Envy.md" target="_blank"><b>FeatureEnvy</b></a>        </span>      </div>      <span>CreateTurmas#change refers to 't' more than self (maybe move it to another class?)</span>              <span>Locations:</span>                  <a href="20260527234838_create_turmas.html#L4" class="js-smell-location">0</a>                  <a href="20260527234838_create_turmas.html#L5" class="js-smell-location">1</a>                  <a href="20260527234838_create_turmas.html#L6" class="js-smell-location">2</a>                  <a href="20260527234838_create_turmas.html#L7" class="js-smell-location">3</a>                  <a href="20260527234838_create_turmas.html#L9" class="js-smell-location">4</a>                  </div>  </li></ol>
+
+    t.timestamps<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Feature-Envy.md" target="_blank"><b>FeatureEnvy</b></a>        </span>      </div>      <span>CreateTurmas#change refers to 't' more than self (maybe move it to another class?)</span>              <span>Locations:</span>                  <a href="20260527234838_create_turmas.html#L4" class="js-smell-location">0</a>                  <a href="20260527234838_create_turmas.html#L5" class="js-smell-location">1</a>                  <a href="20260527234838_create_turmas.html#L6" class="js-smell-location">2</a>                  <a href="20260527234838_create_turmas.html#L7" class="js-smell-location">3</a>                  <a href="20260527234838_create_turmas.html#L9" class="js-smell-location">4</a>                  </div>  </li></ol>
+  end
+end
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/db/migrate/20260527235010_create_usuarios_html.html b/doc/tmp/rubycritic/db/migrate/20260527235010_create_usuarios_html.html new file mode 100644 index 0000000000..7a56a9b1a0 --- /dev/null +++ b/doc/tmp/rubycritic/db/migrate/20260527235010_create_usuarios_html.html @@ -0,0 +1,2052 @@ + + + + + + + +20260527235010_create_usuarios.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-05-27 21:40:34 -0300'>2026-05-27 21:40:34 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>db/migrate /</small> 20260527235010_create_usuarios.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating a big">
+            A
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">17</span><small> lines of codes</small></div>
+            <div><span class="metric">1</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">12.8</span><small> complexity/method</small></div>
+            <div><span class="metric">1</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">12.84</span><small> complexity</small></div>
+            <div><span class="metric">0</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              4
+              smells
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code">class CreateUsuarios &lt; ActiveRecord::Migration[8.1]<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Irresponsible-Module.md" target="_blank"><b>IrresponsibleModule</b></a>        </span>      </div>      <span>CreateUsuarios has no descriptive comment</span>          </div>  </li></ol>
+def change<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Too-Many-Statements.md" target="_blank"><b>TooManyStatements</b></a>        </span>      </div>      <span>CreateUsuarios#change has approx 11 statements</span>          </div>  </li></ol>
+  create_table :usuarios do |t|<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Uncommunicative-Variable-Name.md" target="_blank"><b>UncommunicativeVariableName</b></a>        </span>      </div>      <span>CreateUsuarios#change has the variable name 't'</span>          </div>  </li></ol>
+    t.string :matricula<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Feature-Envy.md" target="_blank"><b>FeatureEnvy</b></a>        </span>      </div>      <span>CreateUsuarios#change refers to 't' more than self (maybe move it to another class?)</span>              <span>Locations:</span>                  <a href="20260527235010_create_usuarios.html#L4" class="js-smell-location">0</a>                  <a href="20260527235010_create_usuarios.html#L5" class="js-smell-location">1</a>                  <a href="20260527235010_create_usuarios.html#L6" class="js-smell-location">2</a>                  <a href="20260527235010_create_usuarios.html#L7" class="js-smell-location">3</a>                  <a href="20260527235010_create_usuarios.html#L8" class="js-smell-location">4</a>                  <a href="20260527235010_create_usuarios.html#L9" class="js-smell-location">5</a>                  <a href="20260527235010_create_usuarios.html#L10" class="js-smell-location">6</a>                  <a href="20260527235010_create_usuarios.html#L11" class="js-smell-location">7</a>                  <a href="20260527235010_create_usuarios.html#L13" class="js-smell-location">8</a>                  </div>  </li></ol>
+    t.string :senha_hash<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Feature-Envy.md" target="_blank"><b>FeatureEnvy</b></a>        </span>      </div>      <span>CreateUsuarios#change refers to 't' more than self (maybe move it to another class?)</span>              <span>Locations:</span>                  <a href="20260527235010_create_usuarios.html#L4" class="js-smell-location">0</a>                  <a href="20260527235010_create_usuarios.html#L5" class="js-smell-location">1</a>                  <a href="20260527235010_create_usuarios.html#L6" class="js-smell-location">2</a>                  <a href="20260527235010_create_usuarios.html#L7" class="js-smell-location">3</a>                  <a href="20260527235010_create_usuarios.html#L8" class="js-smell-location">4</a>                  <a href="20260527235010_create_usuarios.html#L9" class="js-smell-location">5</a>                  <a href="20260527235010_create_usuarios.html#L10" class="js-smell-location">6</a>                  <a href="20260527235010_create_usuarios.html#L11" class="js-smell-location">7</a>                  <a href="20260527235010_create_usuarios.html#L13" class="js-smell-location">8</a>                  </div>  </li></ol>
+    t.string :email<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Feature-Envy.md" target="_blank"><b>FeatureEnvy</b></a>        </span>      </div>      <span>CreateUsuarios#change refers to 't' more than self (maybe move it to another class?)</span>              <span>Locations:</span>                  <a href="20260527235010_create_usuarios.html#L4" class="js-smell-location">0</a>                  <a href="20260527235010_create_usuarios.html#L5" class="js-smell-location">1</a>                  <a href="20260527235010_create_usuarios.html#L6" class="js-smell-location">2</a>                  <a href="20260527235010_create_usuarios.html#L7" class="js-smell-location">3</a>                  <a href="20260527235010_create_usuarios.html#L8" class="js-smell-location">4</a>                  <a href="20260527235010_create_usuarios.html#L9" class="js-smell-location">5</a>                  <a href="20260527235010_create_usuarios.html#L10" class="js-smell-location">6</a>                  <a href="20260527235010_create_usuarios.html#L11" class="js-smell-location">7</a>                  <a href="20260527235010_create_usuarios.html#L13" class="js-smell-location">8</a>                  </div>  </li></ol>
+    t.string :nome<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Feature-Envy.md" target="_blank"><b>FeatureEnvy</b></a>        </span>      </div>      <span>CreateUsuarios#change refers to 't' more than self (maybe move it to another class?)</span>              <span>Locations:</span>                  <a href="20260527235010_create_usuarios.html#L4" class="js-smell-location">0</a>                  <a href="20260527235010_create_usuarios.html#L5" class="js-smell-location">1</a>                  <a href="20260527235010_create_usuarios.html#L6" class="js-smell-location">2</a>                  <a href="20260527235010_create_usuarios.html#L7" class="js-smell-location">3</a>                  <a href="20260527235010_create_usuarios.html#L8" class="js-smell-location">4</a>                  <a href="20260527235010_create_usuarios.html#L9" class="js-smell-location">5</a>                  <a href="20260527235010_create_usuarios.html#L10" class="js-smell-location">6</a>                  <a href="20260527235010_create_usuarios.html#L11" class="js-smell-location">7</a>                  <a href="20260527235010_create_usuarios.html#L13" class="js-smell-location">8</a>                  </div>  </li></ol>
+    t.string :formacao<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Feature-Envy.md" target="_blank"><b>FeatureEnvy</b></a>        </span>      </div>      <span>CreateUsuarios#change refers to 't' more than self (maybe move it to another class?)</span>              <span>Locations:</span>                  <a href="20260527235010_create_usuarios.html#L4" class="js-smell-location">0</a>                  <a href="20260527235010_create_usuarios.html#L5" class="js-smell-location">1</a>                  <a href="20260527235010_create_usuarios.html#L6" class="js-smell-location">2</a>                  <a href="20260527235010_create_usuarios.html#L7" class="js-smell-location">3</a>                  <a href="20260527235010_create_usuarios.html#L8" class="js-smell-location">4</a>                  <a href="20260527235010_create_usuarios.html#L9" class="js-smell-location">5</a>                  <a href="20260527235010_create_usuarios.html#L10" class="js-smell-location">6</a>                  <a href="20260527235010_create_usuarios.html#L11" class="js-smell-location">7</a>                  <a href="20260527235010_create_usuarios.html#L13" class="js-smell-location">8</a>                  </div>  </li></ol>
+    t.string :type<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Feature-Envy.md" target="_blank"><b>FeatureEnvy</b></a>        </span>      </div>      <span>CreateUsuarios#change refers to 't' more than self (maybe move it to another class?)</span>              <span>Locations:</span>                  <a href="20260527235010_create_usuarios.html#L4" class="js-smell-location">0</a>                  <a href="20260527235010_create_usuarios.html#L5" class="js-smell-location">1</a>                  <a href="20260527235010_create_usuarios.html#L6" class="js-smell-location">2</a>                  <a href="20260527235010_create_usuarios.html#L7" class="js-smell-location">3</a>                  <a href="20260527235010_create_usuarios.html#L8" class="js-smell-location">4</a>                  <a href="20260527235010_create_usuarios.html#L9" class="js-smell-location">5</a>                  <a href="20260527235010_create_usuarios.html#L10" class="js-smell-location">6</a>                  <a href="20260527235010_create_usuarios.html#L11" class="js-smell-location">7</a>                  <a href="20260527235010_create_usuarios.html#L13" class="js-smell-location">8</a>                  </div>  </li></ol>
+    t.references :curso, null: false, foreign_key: true<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Feature-Envy.md" target="_blank"><b>FeatureEnvy</b></a>        </span>      </div>      <span>CreateUsuarios#change refers to 't' more than self (maybe move it to another class?)</span>              <span>Locations:</span>                  <a href="20260527235010_create_usuarios.html#L4" class="js-smell-location">0</a>                  <a href="20260527235010_create_usuarios.html#L5" class="js-smell-location">1</a>                  <a href="20260527235010_create_usuarios.html#L6" class="js-smell-location">2</a>                  <a href="20260527235010_create_usuarios.html#L7" class="js-smell-location">3</a>                  <a href="20260527235010_create_usuarios.html#L8" class="js-smell-location">4</a>                  <a href="20260527235010_create_usuarios.html#L9" class="js-smell-location">5</a>                  <a href="20260527235010_create_usuarios.html#L10" class="js-smell-location">6</a>                  <a href="20260527235010_create_usuarios.html#L11" class="js-smell-location">7</a>                  <a href="20260527235010_create_usuarios.html#L13" class="js-smell-location">8</a>                  </div>  </li></ol>
+    t.references :departamento, null: false, foreign_key: true<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Feature-Envy.md" target="_blank"><b>FeatureEnvy</b></a>        </span>      </div>      <span>CreateUsuarios#change refers to 't' more than self (maybe move it to another class?)</span>              <span>Locations:</span>                  <a href="20260527235010_create_usuarios.html#L4" class="js-smell-location">0</a>                  <a href="20260527235010_create_usuarios.html#L5" class="js-smell-location">1</a>                  <a href="20260527235010_create_usuarios.html#L6" class="js-smell-location">2</a>                  <a href="20260527235010_create_usuarios.html#L7" class="js-smell-location">3</a>                  <a href="20260527235010_create_usuarios.html#L8" class="js-smell-location">4</a>                  <a href="20260527235010_create_usuarios.html#L9" class="js-smell-location">5</a>                  <a href="20260527235010_create_usuarios.html#L10" class="js-smell-location">6</a>                  <a href="20260527235010_create_usuarios.html#L11" class="js-smell-location">7</a>                  <a href="20260527235010_create_usuarios.html#L13" class="js-smell-location">8</a>                  </div>  </li></ol>
+
+    t.timestamps<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Feature-Envy.md" target="_blank"><b>FeatureEnvy</b></a>        </span>      </div>      <span>CreateUsuarios#change refers to 't' more than self (maybe move it to another class?)</span>              <span>Locations:</span>                  <a href="20260527235010_create_usuarios.html#L4" class="js-smell-location">0</a>                  <a href="20260527235010_create_usuarios.html#L5" class="js-smell-location">1</a>                  <a href="20260527235010_create_usuarios.html#L6" class="js-smell-location">2</a>                  <a href="20260527235010_create_usuarios.html#L7" class="js-smell-location">3</a>                  <a href="20260527235010_create_usuarios.html#L8" class="js-smell-location">4</a>                  <a href="20260527235010_create_usuarios.html#L9" class="js-smell-location">5</a>                  <a href="20260527235010_create_usuarios.html#L10" class="js-smell-location">6</a>                  <a href="20260527235010_create_usuarios.html#L11" class="js-smell-location">7</a>                  <a href="20260527235010_create_usuarios.html#L13" class="js-smell-location">8</a>                  </div>  </li></ol>
+  end
+  add_index :usuarios, :matricula, unique: true
+end
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/db/migrate/20260527235026_create_templates_html.html b/doc/tmp/rubycritic/db/migrate/20260527235026_create_templates_html.html new file mode 100644 index 0000000000..05b6a2c86b --- /dev/null +++ b/doc/tmp/rubycritic/db/migrate/20260527235026_create_templates_html.html @@ -0,0 +1,2044 @@ + + + + + + + +20260527235026_create_templates.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-05-27 21:40:34 -0300'>2026-05-27 21:40:34 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>db/migrate /</small> 20260527235026_create_templates.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating a big">
+            A
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">9</span><small> lines of codes</small></div>
+            <div><span class="metric">1</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">3.5</span><small> complexity/method</small></div>
+            <div><span class="metric">1</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">3.54</span><small> complexity</small></div>
+            <div><span class="metric">0</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              3
+              smells
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code">class CreateTemplates &lt; ActiveRecord::Migration[8.1]<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Irresponsible-Module.md" target="_blank"><b>IrresponsibleModule</b></a>        </span>      </div>      <span>CreateTemplates has no descriptive comment</span>          </div>  </li></ol>
+def change
+  create_table :templates do |t|<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Uncommunicative-Variable-Name.md" target="_blank"><b>UncommunicativeVariableName</b></a>        </span>      </div>      <span>CreateTemplates#change has the variable name 't'</span>          </div>  </li></ol>
+    t.string :nome<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Feature-Envy.md" target="_blank"><b>FeatureEnvy</b></a>        </span>      </div>      <span>CreateTemplates#change refers to 't' more than self (maybe move it to another class?)</span>              <span>Locations:</span>                  <a href="20260527235026_create_templates.html#L4" class="js-smell-location">0</a>                  <a href="20260527235026_create_templates.html#L6" class="js-smell-location">1</a>                  </div>  </li></ol>
+
+    t.timestamps<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Feature-Envy.md" target="_blank"><b>FeatureEnvy</b></a>        </span>      </div>      <span>CreateTemplates#change refers to 't' more than self (maybe move it to another class?)</span>              <span>Locations:</span>                  <a href="20260527235026_create_templates.html#L4" class="js-smell-location">0</a>                  <a href="20260527235026_create_templates.html#L6" class="js-smell-location">1</a>                  </div>  </li></ol>
+  end
+end
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/db/migrate/20260527235028_create_elementos_html.html b/doc/tmp/rubycritic/db/migrate/20260527235028_create_elementos_html.html new file mode 100644 index 0000000000..ac23b7a12b --- /dev/null +++ b/doc/tmp/rubycritic/db/migrate/20260527235028_create_elementos_html.html @@ -0,0 +1,2046 @@ + + + + + + + +20260527235028_create_elementos.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-05-27 21:40:34 -0300'>2026-05-27 21:40:34 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>db/migrate /</small> 20260527235028_create_elementos.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating b big">
+            B
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">11</span><small> lines of codes</small></div>
+            <div><span class="metric">1</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">5.9</span><small> complexity/method</small></div>
+            <div><span class="metric">1</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">5.89</span><small> complexity</small></div>
+            <div><span class="metric">23</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              4
+              smells
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code">class CreateElementos &lt; ActiveRecord::Migration[8.1]<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Irresponsible-Module.md" target="_blank"><b>IrresponsibleModule</b></a>        </span>      </div>      <span>CreateElementos has no descriptive comment</span>          </div>  </li></ol>
+def change<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="http://docs.seattlerb.org/flay/" target="_blank"><b>DuplicateCode</b></a>        </span>      </div>      <span>Similar code found in 3 nodes</span>              <span>Locations:</span>                  <a href="20260527235028_create_elementos.html#L2" class="js-smell-location">0</a>                  <a href="20260527235055_create_elemento_forms.html#L2" class="js-smell-location">1</a>                  <a href="20260527235057_create_campo_forms.html#L2" class="js-smell-location">2</a>                  </div>  </li></ol>
+  create_table :elementos do |t|<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Uncommunicative-Variable-Name.md" target="_blank"><b>UncommunicativeVariableName</b></a>        </span>      </div>      <span>CreateElementos#change has the variable name 't'</span>          </div>  </li></ol>
+    t.integer :ordem<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Feature-Envy.md" target="_blank"><b>FeatureEnvy</b></a>        </span>      </div>      <span>CreateElementos#change refers to 't' more than self (maybe move it to another class?)</span>              <span>Locations:</span>                  <a href="20260527235028_create_elementos.html#L4" class="js-smell-location">0</a>                  <a href="20260527235028_create_elementos.html#L5" class="js-smell-location">1</a>                  <a href="20260527235028_create_elementos.html#L6" class="js-smell-location">2</a>                  <a href="20260527235028_create_elementos.html#L8" class="js-smell-location">3</a>                  </div>  </li></ol>
+    t.string :enunciado<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Feature-Envy.md" target="_blank"><b>FeatureEnvy</b></a>        </span>      </div>      <span>CreateElementos#change refers to 't' more than self (maybe move it to another class?)</span>              <span>Locations:</span>                  <a href="20260527235028_create_elementos.html#L4" class="js-smell-location">0</a>                  <a href="20260527235028_create_elementos.html#L5" class="js-smell-location">1</a>                  <a href="20260527235028_create_elementos.html#L6" class="js-smell-location">2</a>                  <a href="20260527235028_create_elementos.html#L8" class="js-smell-location">3</a>                  </div>  </li></ol>
+    t.references :template, null: false, foreign_key: true<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Feature-Envy.md" target="_blank"><b>FeatureEnvy</b></a>        </span>      </div>      <span>CreateElementos#change refers to 't' more than self (maybe move it to another class?)</span>              <span>Locations:</span>                  <a href="20260527235028_create_elementos.html#L4" class="js-smell-location">0</a>                  <a href="20260527235028_create_elementos.html#L5" class="js-smell-location">1</a>                  <a href="20260527235028_create_elementos.html#L6" class="js-smell-location">2</a>                  <a href="20260527235028_create_elementos.html#L8" class="js-smell-location">3</a>                  </div>  </li></ol>
+
+    t.timestamps<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Feature-Envy.md" target="_blank"><b>FeatureEnvy</b></a>        </span>      </div>      <span>CreateElementos#change refers to 't' more than self (maybe move it to another class?)</span>              <span>Locations:</span>                  <a href="20260527235028_create_elementos.html#L4" class="js-smell-location">0</a>                  <a href="20260527235028_create_elementos.html#L5" class="js-smell-location">1</a>                  <a href="20260527235028_create_elementos.html#L6" class="js-smell-location">2</a>                  <a href="20260527235028_create_elementos.html#L8" class="js-smell-location">3</a>                  </div>  </li></ol>
+  end
+end
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/db/migrate/20260527235031_create_campos_html.html b/doc/tmp/rubycritic/db/migrate/20260527235031_create_campos_html.html new file mode 100644 index 0000000000..837737f3ce --- /dev/null +++ b/doc/tmp/rubycritic/db/migrate/20260527235031_create_campos_html.html @@ -0,0 +1,2047 @@ + + + + + + + +20260527235031_create_campos.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-05-27 21:40:34 -0300'>2026-05-27 21:40:34 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>db/migrate /</small> 20260527235031_create_campos.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating b big">
+            B
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">12</span><small> lines of codes</small></div>
+            <div><span class="metric">1</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">7.1</span><small> complexity/method</small></div>
+            <div><span class="metric">1</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">7.07</span><small> complexity</small></div>
+            <div><span class="metric">26</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              5
+              smells
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code">class CreateCampos &lt; ActiveRecord::Migration[8.1]<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Irresponsible-Module.md" target="_blank"><b>IrresponsibleModule</b></a>        </span>      </div>      <span>CreateCampos has no descriptive comment</span>          </div>  </li></ol>
+def change<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="http://docs.seattlerb.org/flay/" target="_blank"><b>DuplicateCode</b></a>        </span>      </div>      <span>Similar code found in 2 nodes</span>              <span>Locations:</span>                  <a href="20260527234838_create_turmas.html#L2" class="js-smell-location">0</a>                  <a href="20260527235031_create_campos.html#L2" class="js-smell-location">1</a>                  </div>  </li>  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Too-Many-Statements.md" target="_blank"><b>TooManyStatements</b></a>        </span>      </div>      <span>CreateCampos#change has approx 6 statements</span>          </div>  </li></ol>
+  create_table :campos do |t|<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Uncommunicative-Variable-Name.md" target="_blank"><b>UncommunicativeVariableName</b></a>        </span>      </div>      <span>CreateCampos#change has the variable name 't'</span>          </div>  </li></ol>
+    t.integer :ordem<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Feature-Envy.md" target="_blank"><b>FeatureEnvy</b></a>        </span>      </div>      <span>CreateCampos#change refers to 't' more than self (maybe move it to another class?)</span>              <span>Locations:</span>                  <a href="20260527235031_create_campos.html#L4" class="js-smell-location">0</a>                  <a href="20260527235031_create_campos.html#L5" class="js-smell-location">1</a>                  <a href="20260527235031_create_campos.html#L6" class="js-smell-location">2</a>                  <a href="20260527235031_create_campos.html#L7" class="js-smell-location">3</a>                  <a href="20260527235031_create_campos.html#L9" class="js-smell-location">4</a>                  </div>  </li></ol>
+    t.string :enunciado<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Feature-Envy.md" target="_blank"><b>FeatureEnvy</b></a>        </span>      </div>      <span>CreateCampos#change refers to 't' more than self (maybe move it to another class?)</span>              <span>Locations:</span>                  <a href="20260527235031_create_campos.html#L4" class="js-smell-location">0</a>                  <a href="20260527235031_create_campos.html#L5" class="js-smell-location">1</a>                  <a href="20260527235031_create_campos.html#L6" class="js-smell-location">2</a>                  <a href="20260527235031_create_campos.html#L7" class="js-smell-location">3</a>                  <a href="20260527235031_create_campos.html#L9" class="js-smell-location">4</a>                  </div>  </li></ol>
+    t.string :tipo_elemento<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Feature-Envy.md" target="_blank"><b>FeatureEnvy</b></a>        </span>      </div>      <span>CreateCampos#change refers to 't' more than self (maybe move it to another class?)</span>              <span>Locations:</span>                  <a href="20260527235031_create_campos.html#L4" class="js-smell-location">0</a>                  <a href="20260527235031_create_campos.html#L5" class="js-smell-location">1</a>                  <a href="20260527235031_create_campos.html#L6" class="js-smell-location">2</a>                  <a href="20260527235031_create_campos.html#L7" class="js-smell-location">3</a>                  <a href="20260527235031_create_campos.html#L9" class="js-smell-location">4</a>                  </div>  </li></ol>
+    t.references :elemento, null: false, foreign_key: true<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Feature-Envy.md" target="_blank"><b>FeatureEnvy</b></a>        </span>      </div>      <span>CreateCampos#change refers to 't' more than self (maybe move it to another class?)</span>              <span>Locations:</span>                  <a href="20260527235031_create_campos.html#L4" class="js-smell-location">0</a>                  <a href="20260527235031_create_campos.html#L5" class="js-smell-location">1</a>                  <a href="20260527235031_create_campos.html#L6" class="js-smell-location">2</a>                  <a href="20260527235031_create_campos.html#L7" class="js-smell-location">3</a>                  <a href="20260527235031_create_campos.html#L9" class="js-smell-location">4</a>                  </div>  </li></ol>
+
+    t.timestamps<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Feature-Envy.md" target="_blank"><b>FeatureEnvy</b></a>        </span>      </div>      <span>CreateCampos#change refers to 't' more than self (maybe move it to another class?)</span>              <span>Locations:</span>                  <a href="20260527235031_create_campos.html#L4" class="js-smell-location">0</a>                  <a href="20260527235031_create_campos.html#L5" class="js-smell-location">1</a>                  <a href="20260527235031_create_campos.html#L6" class="js-smell-location">2</a>                  <a href="20260527235031_create_campos.html#L7" class="js-smell-location">3</a>                  <a href="20260527235031_create_campos.html#L9" class="js-smell-location">4</a>                  </div>  </li></ol>
+  end
+end
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/db/migrate/20260527235053_create_formularios_html.html b/doc/tmp/rubycritic/db/migrate/20260527235053_create_formularios_html.html new file mode 100644 index 0000000000..fdc788abfa --- /dev/null +++ b/doc/tmp/rubycritic/db/migrate/20260527235053_create_formularios_html.html @@ -0,0 +1,2044 @@ + + + + + + + +20260527235053_create_formularios.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-05-27 21:40:34 -0300'>2026-05-27 21:40:34 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>db/migrate /</small> 20260527235053_create_formularios.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating a big">
+            A
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">9</span><small> lines of codes</small></div>
+            <div><span class="metric">1</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">3.5</span><small> complexity/method</small></div>
+            <div><span class="metric">1</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">3.54</span><small> complexity</small></div>
+            <div><span class="metric">0</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              3
+              smells
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code">class CreateFormularios &lt; ActiveRecord::Migration[8.1]<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Irresponsible-Module.md" target="_blank"><b>IrresponsibleModule</b></a>        </span>      </div>      <span>CreateFormularios has no descriptive comment</span>          </div>  </li></ol>
+def change
+  create_table :formularios do |t|<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Uncommunicative-Variable-Name.md" target="_blank"><b>UncommunicativeVariableName</b></a>        </span>      </div>      <span>CreateFormularios#change has the variable name 't'</span>          </div>  </li></ol>
+    t.references :turma, null: false, foreign_key: true<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Feature-Envy.md" target="_blank"><b>FeatureEnvy</b></a>        </span>      </div>      <span>CreateFormularios#change refers to 't' more than self (maybe move it to another class?)</span>              <span>Locations:</span>                  <a href="20260527235053_create_formularios.html#L4" class="js-smell-location">0</a>                  <a href="20260527235053_create_formularios.html#L6" class="js-smell-location">1</a>                  </div>  </li></ol>
+
+    t.timestamps<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Feature-Envy.md" target="_blank"><b>FeatureEnvy</b></a>        </span>      </div>      <span>CreateFormularios#change refers to 't' more than self (maybe move it to another class?)</span>              <span>Locations:</span>                  <a href="20260527235053_create_formularios.html#L4" class="js-smell-location">0</a>                  <a href="20260527235053_create_formularios.html#L6" class="js-smell-location">1</a>                  </div>  </li></ol>
+  end
+end
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/db/migrate/20260527235055_create_elemento_forms_html.html b/doc/tmp/rubycritic/db/migrate/20260527235055_create_elemento_forms_html.html new file mode 100644 index 0000000000..2b9dc0e4f0 --- /dev/null +++ b/doc/tmp/rubycritic/db/migrate/20260527235055_create_elemento_forms_html.html @@ -0,0 +1,2046 @@ + + + + + + + +20260527235055_create_elemento_forms.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-05-27 21:40:34 -0300'>2026-05-27 21:40:34 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>db/migrate /</small> 20260527235055_create_elemento_forms.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating b big">
+            B
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">11</span><small> lines of codes</small></div>
+            <div><span class="metric">1</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">5.9</span><small> complexity/method</small></div>
+            <div><span class="metric">1</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">5.89</span><small> complexity</small></div>
+            <div><span class="metric">23</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              4
+              smells
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code">class CreateElementoForms &lt; ActiveRecord::Migration[8.1]<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Irresponsible-Module.md" target="_blank"><b>IrresponsibleModule</b></a>        </span>      </div>      <span>CreateElementoForms has no descriptive comment</span>          </div>  </li></ol>
+def change<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="http://docs.seattlerb.org/flay/" target="_blank"><b>DuplicateCode</b></a>        </span>      </div>      <span>Similar code found in 3 nodes</span>              <span>Locations:</span>                  <a href="20260527235028_create_elementos.html#L2" class="js-smell-location">0</a>                  <a href="20260527235055_create_elemento_forms.html#L2" class="js-smell-location">1</a>                  <a href="20260527235057_create_campo_forms.html#L2" class="js-smell-location">2</a>                  </div>  </li></ol>
+  create_table :elemento_forms do |t|<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Uncommunicative-Variable-Name.md" target="_blank"><b>UncommunicativeVariableName</b></a>        </span>      </div>      <span>CreateElementoForms#change has the variable name 't'</span>          </div>  </li></ol>
+    t.integer :ordem<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Feature-Envy.md" target="_blank"><b>FeatureEnvy</b></a>        </span>      </div>      <span>CreateElementoForms#change refers to 't' more than self (maybe move it to another class?)</span>              <span>Locations:</span>                  <a href="20260527235055_create_elemento_forms.html#L4" class="js-smell-location">0</a>                  <a href="20260527235055_create_elemento_forms.html#L5" class="js-smell-location">1</a>                  <a href="20260527235055_create_elemento_forms.html#L6" class="js-smell-location">2</a>                  <a href="20260527235055_create_elemento_forms.html#L8" class="js-smell-location">3</a>                  </div>  </li></ol>
+    t.string :enunciado<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Feature-Envy.md" target="_blank"><b>FeatureEnvy</b></a>        </span>      </div>      <span>CreateElementoForms#change refers to 't' more than self (maybe move it to another class?)</span>              <span>Locations:</span>                  <a href="20260527235055_create_elemento_forms.html#L4" class="js-smell-location">0</a>                  <a href="20260527235055_create_elemento_forms.html#L5" class="js-smell-location">1</a>                  <a href="20260527235055_create_elemento_forms.html#L6" class="js-smell-location">2</a>                  <a href="20260527235055_create_elemento_forms.html#L8" class="js-smell-location">3</a>                  </div>  </li></ol>
+    t.references :formulario, null: false, foreign_key: true<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Feature-Envy.md" target="_blank"><b>FeatureEnvy</b></a>        </span>      </div>      <span>CreateElementoForms#change refers to 't' more than self (maybe move it to another class?)</span>              <span>Locations:</span>                  <a href="20260527235055_create_elemento_forms.html#L4" class="js-smell-location">0</a>                  <a href="20260527235055_create_elemento_forms.html#L5" class="js-smell-location">1</a>                  <a href="20260527235055_create_elemento_forms.html#L6" class="js-smell-location">2</a>                  <a href="20260527235055_create_elemento_forms.html#L8" class="js-smell-location">3</a>                  </div>  </li></ol>
+
+    t.timestamps<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Feature-Envy.md" target="_blank"><b>FeatureEnvy</b></a>        </span>      </div>      <span>CreateElementoForms#change refers to 't' more than self (maybe move it to another class?)</span>              <span>Locations:</span>                  <a href="20260527235055_create_elemento_forms.html#L4" class="js-smell-location">0</a>                  <a href="20260527235055_create_elemento_forms.html#L5" class="js-smell-location">1</a>                  <a href="20260527235055_create_elemento_forms.html#L6" class="js-smell-location">2</a>                  <a href="20260527235055_create_elemento_forms.html#L8" class="js-smell-location">3</a>                  </div>  </li></ol>
+  end
+end
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/db/migrate/20260527235057_create_campo_forms_html.html b/doc/tmp/rubycritic/db/migrate/20260527235057_create_campo_forms_html.html new file mode 100644 index 0000000000..6df9d7240d --- /dev/null +++ b/doc/tmp/rubycritic/db/migrate/20260527235057_create_campo_forms_html.html @@ -0,0 +1,2046 @@ + + + + + + + +20260527235057_create_campo_forms.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-05-27 21:40:34 -0300'>2026-05-27 21:40:34 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>db/migrate /</small> 20260527235057_create_campo_forms.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating b big">
+            B
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">11</span><small> lines of codes</small></div>
+            <div><span class="metric">1</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">5.9</span><small> complexity/method</small></div>
+            <div><span class="metric">1</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">5.89</span><small> complexity</small></div>
+            <div><span class="metric">23</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              4
+              smells
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code">class CreateCampoForms &lt; ActiveRecord::Migration[8.1]<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Irresponsible-Module.md" target="_blank"><b>IrresponsibleModule</b></a>        </span>      </div>      <span>CreateCampoForms has no descriptive comment</span>          </div>  </li></ol>
+def change<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="http://docs.seattlerb.org/flay/" target="_blank"><b>DuplicateCode</b></a>        </span>      </div>      <span>Similar code found in 3 nodes</span>              <span>Locations:</span>                  <a href="20260527235028_create_elementos.html#L2" class="js-smell-location">0</a>                  <a href="20260527235055_create_elemento_forms.html#L2" class="js-smell-location">1</a>                  <a href="20260527235057_create_campo_forms.html#L2" class="js-smell-location">2</a>                  </div>  </li></ol>
+  create_table :campo_forms do |t|<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Uncommunicative-Variable-Name.md" target="_blank"><b>UncommunicativeVariableName</b></a>        </span>      </div>      <span>CreateCampoForms#change has the variable name 't'</span>          </div>  </li></ol>
+    t.integer :ordem<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Feature-Envy.md" target="_blank"><b>FeatureEnvy</b></a>        </span>      </div>      <span>CreateCampoForms#change refers to 't' more than self (maybe move it to another class?)</span>              <span>Locations:</span>                  <a href="20260527235057_create_campo_forms.html#L4" class="js-smell-location">0</a>                  <a href="20260527235057_create_campo_forms.html#L5" class="js-smell-location">1</a>                  <a href="20260527235057_create_campo_forms.html#L6" class="js-smell-location">2</a>                  <a href="20260527235057_create_campo_forms.html#L8" class="js-smell-location">3</a>                  </div>  </li></ol>
+    t.string :enunciado<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Feature-Envy.md" target="_blank"><b>FeatureEnvy</b></a>        </span>      </div>      <span>CreateCampoForms#change refers to 't' more than self (maybe move it to another class?)</span>              <span>Locations:</span>                  <a href="20260527235057_create_campo_forms.html#L4" class="js-smell-location">0</a>                  <a href="20260527235057_create_campo_forms.html#L5" class="js-smell-location">1</a>                  <a href="20260527235057_create_campo_forms.html#L6" class="js-smell-location">2</a>                  <a href="20260527235057_create_campo_forms.html#L8" class="js-smell-location">3</a>                  </div>  </li></ol>
+    t.references :elemento_form, null: false, foreign_key: true<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Feature-Envy.md" target="_blank"><b>FeatureEnvy</b></a>        </span>      </div>      <span>CreateCampoForms#change refers to 't' more than self (maybe move it to another class?)</span>              <span>Locations:</span>                  <a href="20260527235057_create_campo_forms.html#L4" class="js-smell-location">0</a>                  <a href="20260527235057_create_campo_forms.html#L5" class="js-smell-location">1</a>                  <a href="20260527235057_create_campo_forms.html#L6" class="js-smell-location">2</a>                  <a href="20260527235057_create_campo_forms.html#L8" class="js-smell-location">3</a>                  </div>  </li></ol>
+
+    t.timestamps<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Feature-Envy.md" target="_blank"><b>FeatureEnvy</b></a>        </span>      </div>      <span>CreateCampoForms#change refers to 't' more than self (maybe move it to another class?)</span>              <span>Locations:</span>                  <a href="20260527235057_create_campo_forms.html#L4" class="js-smell-location">0</a>                  <a href="20260527235057_create_campo_forms.html#L5" class="js-smell-location">1</a>                  <a href="20260527235057_create_campo_forms.html#L6" class="js-smell-location">2</a>                  <a href="20260527235057_create_campo_forms.html#L8" class="js-smell-location">3</a>                  </div>  </li></ol>
+  end
+end
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/db/migrate/20260527235101_create_resposta_forms_html.html b/doc/tmp/rubycritic/db/migrate/20260527235101_create_resposta_forms_html.html new file mode 100644 index 0000000000..e06c726338 --- /dev/null +++ b/doc/tmp/rubycritic/db/migrate/20260527235101_create_resposta_forms_html.html @@ -0,0 +1,2046 @@ + + + + + + + +20260527235101_create_resposta_forms.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-05-27 21:40:34 -0300'>2026-05-27 21:40:34 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>db/migrate /</small> 20260527235101_create_resposta_forms.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating a big">
+            A
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">11</span><small> lines of codes</small></div>
+            <div><span class="metric">1</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">5.9</span><small> complexity/method</small></div>
+            <div><span class="metric">1</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">5.89</span><small> complexity</small></div>
+            <div><span class="metric">0</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              3
+              smells
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code">class CreateRespostaForms &lt; ActiveRecord::Migration[8.1]<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Irresponsible-Module.md" target="_blank"><b>IrresponsibleModule</b></a>        </span>      </div>      <span>CreateRespostaForms has no descriptive comment</span>          </div>  </li></ol>
+def change
+  create_table :resposta_forms do |t|<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Uncommunicative-Variable-Name.md" target="_blank"><b>UncommunicativeVariableName</b></a>        </span>      </div>      <span>CreateRespostaForms#change has the variable name 't'</span>          </div>  </li></ol>
+    t.date :data_submissao<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Feature-Envy.md" target="_blank"><b>FeatureEnvy</b></a>        </span>      </div>      <span>CreateRespostaForms#change refers to 't' more than self (maybe move it to another class?)</span>              <span>Locations:</span>                  <a href="20260527235101_create_resposta_forms.html#L4" class="js-smell-location">0</a>                  <a href="20260527235101_create_resposta_forms.html#L5" class="js-smell-location">1</a>                  <a href="20260527235101_create_resposta_forms.html#L6" class="js-smell-location">2</a>                  <a href="20260527235101_create_resposta_forms.html#L8" class="js-smell-location">3</a>                  </div>  </li></ol>
+    t.references :formulario, null: false, foreign_key: true<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Feature-Envy.md" target="_blank"><b>FeatureEnvy</b></a>        </span>      </div>      <span>CreateRespostaForms#change refers to 't' more than self (maybe move it to another class?)</span>              <span>Locations:</span>                  <a href="20260527235101_create_resposta_forms.html#L4" class="js-smell-location">0</a>                  <a href="20260527235101_create_resposta_forms.html#L5" class="js-smell-location">1</a>                  <a href="20260527235101_create_resposta_forms.html#L6" class="js-smell-location">2</a>                  <a href="20260527235101_create_resposta_forms.html#L8" class="js-smell-location">3</a>                  </div>  </li></ol>
+    t.references :usuario, null: false, foreign_key: true<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Feature-Envy.md" target="_blank"><b>FeatureEnvy</b></a>        </span>      </div>      <span>CreateRespostaForms#change refers to 't' more than self (maybe move it to another class?)</span>              <span>Locations:</span>                  <a href="20260527235101_create_resposta_forms.html#L4" class="js-smell-location">0</a>                  <a href="20260527235101_create_resposta_forms.html#L5" class="js-smell-location">1</a>                  <a href="20260527235101_create_resposta_forms.html#L6" class="js-smell-location">2</a>                  <a href="20260527235101_create_resposta_forms.html#L8" class="js-smell-location">3</a>                  </div>  </li></ol>
+
+    t.timestamps<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Feature-Envy.md" target="_blank"><b>FeatureEnvy</b></a>        </span>      </div>      <span>CreateRespostaForms#change refers to 't' more than self (maybe move it to another class?)</span>              <span>Locations:</span>                  <a href="20260527235101_create_resposta_forms.html#L4" class="js-smell-location">0</a>                  <a href="20260527235101_create_resposta_forms.html#L5" class="js-smell-location">1</a>                  <a href="20260527235101_create_resposta_forms.html#L6" class="js-smell-location">2</a>                  <a href="20260527235101_create_resposta_forms.html#L8" class="js-smell-location">3</a>                  </div>  </li></ol>
+  end
+end
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/db/migrate/20260527235104_create_resposta_elems_html.html b/doc/tmp/rubycritic/db/migrate/20260527235104_create_resposta_elems_html.html new file mode 100644 index 0000000000..36be7ca841 --- /dev/null +++ b/doc/tmp/rubycritic/db/migrate/20260527235104_create_resposta_elems_html.html @@ -0,0 +1,2047 @@ + + + + + + + +20260527235104_create_resposta_elems.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-05-27 21:40:34 -0300'>2026-05-27 21:40:34 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>db/migrate /</small> 20260527235104_create_resposta_elems.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating a big">
+            A
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">12</span><small> lines of codes</small></div>
+            <div><span class="metric">1</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">7.1</span><small> complexity/method</small></div>
+            <div><span class="metric">1</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">7.07</span><small> complexity</small></div>
+            <div><span class="metric">0</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              4
+              smells
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code">class CreateRespostaElems &lt; ActiveRecord::Migration[8.1]<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Irresponsible-Module.md" target="_blank"><b>IrresponsibleModule</b></a>        </span>      </div>      <span>CreateRespostaElems has no descriptive comment</span>          </div>  </li></ol>
+def change<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Too-Many-Statements.md" target="_blank"><b>TooManyStatements</b></a>        </span>      </div>      <span>CreateRespostaElems#change has approx 6 statements</span>          </div>  </li></ol>
+  create_table :resposta_elems do |t|<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Uncommunicative-Variable-Name.md" target="_blank"><b>UncommunicativeVariableName</b></a>        </span>      </div>      <span>CreateRespostaElems#change has the variable name 't'</span>          </div>  </li></ol>
+    t.text :texto_resposta<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Feature-Envy.md" target="_blank"><b>FeatureEnvy</b></a>        </span>      </div>      <span>CreateRespostaElems#change refers to 't' more than self (maybe move it to another class?)</span>              <span>Locations:</span>                  <a href="20260527235104_create_resposta_elems.html#L4" class="js-smell-location">0</a>                  <a href="20260527235104_create_resposta_elems.html#L5" class="js-smell-location">1</a>                  <a href="20260527235104_create_resposta_elems.html#L6" class="js-smell-location">2</a>                  <a href="20260527235104_create_resposta_elems.html#L7" class="js-smell-location">3</a>                  <a href="20260527235104_create_resposta_elems.html#L9" class="js-smell-location">4</a>                  </div>  </li></ol>
+    t.references :resposta_form, null: false, foreign_key: true<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Feature-Envy.md" target="_blank"><b>FeatureEnvy</b></a>        </span>      </div>      <span>CreateRespostaElems#change refers to 't' more than self (maybe move it to another class?)</span>              <span>Locations:</span>                  <a href="20260527235104_create_resposta_elems.html#L4" class="js-smell-location">0</a>                  <a href="20260527235104_create_resposta_elems.html#L5" class="js-smell-location">1</a>                  <a href="20260527235104_create_resposta_elems.html#L6" class="js-smell-location">2</a>                  <a href="20260527235104_create_resposta_elems.html#L7" class="js-smell-location">3</a>                  <a href="20260527235104_create_resposta_elems.html#L9" class="js-smell-location">4</a>                  </div>  </li></ol>
+    t.references :elemento_form, null: false, foreign_key: true<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Feature-Envy.md" target="_blank"><b>FeatureEnvy</b></a>        </span>      </div>      <span>CreateRespostaElems#change refers to 't' more than self (maybe move it to another class?)</span>              <span>Locations:</span>                  <a href="20260527235104_create_resposta_elems.html#L4" class="js-smell-location">0</a>                  <a href="20260527235104_create_resposta_elems.html#L5" class="js-smell-location">1</a>                  <a href="20260527235104_create_resposta_elems.html#L6" class="js-smell-location">2</a>                  <a href="20260527235104_create_resposta_elems.html#L7" class="js-smell-location">3</a>                  <a href="20260527235104_create_resposta_elems.html#L9" class="js-smell-location">4</a>                  </div>  </li></ol>
+    t.references :campo_form, null: false, foreign_key: true<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Feature-Envy.md" target="_blank"><b>FeatureEnvy</b></a>        </span>      </div>      <span>CreateRespostaElems#change refers to 't' more than self (maybe move it to another class?)</span>              <span>Locations:</span>                  <a href="20260527235104_create_resposta_elems.html#L4" class="js-smell-location">0</a>                  <a href="20260527235104_create_resposta_elems.html#L5" class="js-smell-location">1</a>                  <a href="20260527235104_create_resposta_elems.html#L6" class="js-smell-location">2</a>                  <a href="20260527235104_create_resposta_elems.html#L7" class="js-smell-location">3</a>                  <a href="20260527235104_create_resposta_elems.html#L9" class="js-smell-location">4</a>                  </div>  </li></ol>
+
+    t.timestamps<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Feature-Envy.md" target="_blank"><b>FeatureEnvy</b></a>        </span>      </div>      <span>CreateRespostaElems#change refers to 't' more than self (maybe move it to another class?)</span>              <span>Locations:</span>                  <a href="20260527235104_create_resposta_elems.html#L4" class="js-smell-location">0</a>                  <a href="20260527235104_create_resposta_elems.html#L5" class="js-smell-location">1</a>                  <a href="20260527235104_create_resposta_elems.html#L6" class="js-smell-location">2</a>                  <a href="20260527235104_create_resposta_elems.html#L7" class="js-smell-location">3</a>                  <a href="20260527235104_create_resposta_elems.html#L9" class="js-smell-location">4</a>                  </div>  </li></ol>
+  end
+end
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/db/migrate/20260528000107_create_join_table_discente_turma_html.html b/doc/tmp/rubycritic/db/migrate/20260528000107_create_join_table_discente_turma_html.html new file mode 100644 index 0000000000..764720fce4 --- /dev/null +++ b/doc/tmp/rubycritic/db/migrate/20260528000107_create_join_table_discente_turma_html.html @@ -0,0 +1,2043 @@ + + + + + + + +20260528000107_create_join_table_discente_turma.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-05-27 21:40:34 -0300'>2026-05-27 21:40:34 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>db/migrate /</small> 20260528000107_create_join_table_discente_turma.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating a big">
+            A
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">8</span><small> lines of codes</small></div>
+            <div><span class="metric">1</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">1.4</span><small> complexity/method</small></div>
+            <div><span class="metric">1</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">1.41</span><small> complexity</small></div>
+            <div><span class="metric">0</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              2
+              smells
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code">class CreateJoinTableDiscenteTurma &lt; ActiveRecord::Migration[8.1]<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Irresponsible-Module.md" target="_blank"><b>IrresponsibleModule</b></a>        </span>      </div>      <span>CreateJoinTableDiscenteTurma has no descriptive comment</span>          </div>  </li></ol>
+def change
+  create_join_table :discentes, :turmas do |t|<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Uncommunicative-Variable-Name.md" target="_blank"><b>UncommunicativeVariableName</b></a>        </span>      </div>      <span>CreateJoinTableDiscenteTurma#change has the variable name 't'</span>          </div>  </li></ol>
+    # t.index [:discente_id, :turma_id]
+    # t.index [:turma_id, :discente_id]
+  end
+end
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/db/migrate/20260528000109_create_join_table_docente_turma_html.html b/doc/tmp/rubycritic/db/migrate/20260528000109_create_join_table_docente_turma_html.html new file mode 100644 index 0000000000..92383c0122 --- /dev/null +++ b/doc/tmp/rubycritic/db/migrate/20260528000109_create_join_table_docente_turma_html.html @@ -0,0 +1,2043 @@ + + + + + + + +20260528000109_create_join_table_docente_turma.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-05-27 21:40:34 -0300'>2026-05-27 21:40:34 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>db/migrate /</small> 20260528000109_create_join_table_docente_turma.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating a big">
+            A
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">8</span><small> lines of codes</small></div>
+            <div><span class="metric">1</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">1.4</span><small> complexity/method</small></div>
+            <div><span class="metric">1</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">1.41</span><small> complexity</small></div>
+            <div><span class="metric">0</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              2
+              smells
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code">class CreateJoinTableDocenteTurma &lt; ActiveRecord::Migration[8.1]<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Irresponsible-Module.md" target="_blank"><b>IrresponsibleModule</b></a>        </span>      </div>      <span>CreateJoinTableDocenteTurma has no descriptive comment</span>          </div>  </li></ol>
+def change
+  create_join_table :docentes, :turmas do |t|<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Uncommunicative-Variable-Name.md" target="_blank"><b>UncommunicativeVariableName</b></a>        </span>      </div>      <span>CreateJoinTableDocenteTurma#change has the variable name 't'</span>          </div>  </li></ol>
+    # t.index [:docente_id, :turma_id]
+    # t.index [:turma_id, :docente_id]
+  end
+end
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/db/migrate/20260528002258_ajusta_nulos_para_sti_html.html b/doc/tmp/rubycritic/db/migrate/20260528002258_ajusta_nulos_para_sti_html.html new file mode 100644 index 0000000000..24e0909144 --- /dev/null +++ b/doc/tmp/rubycritic/db/migrate/20260528002258_ajusta_nulos_para_sti_html.html @@ -0,0 +1,2042 @@ + + + + + + + +20260528002258_ajusta_nulos_para_sti.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-06-15 16:24:38 -0300'>2026-06-15 16:24:38 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>db/migrate /</small> 20260528002258_ajusta_nulos_para_sti.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating a big">
+            A
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">7</span><small> lines of codes</small></div>
+            <div><span class="metric">1</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">3.0</span><small> complexity/method</small></div>
+            <div><span class="metric">2</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">3.0</span><small> complexity</small></div>
+            <div><span class="metric">0</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              1
+              smell
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code">class AjustaNulosParaSti &lt; ActiveRecord::Migration[8.1]<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Irresponsible-Module.md" target="_blank"><b>IrresponsibleModule</b></a>        </span>      </div>      <span>AjustaNulosParaSti has no descriptive comment</span>          </div>  </li></ol>
+def change
+  change_column_null :usuarios, :curso_id, true
+  change_column_null :usuarios, :departamento_id, true
+  change_column_null :resposta_elems, :campo_form_id, true
+end
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/db/migrate/20260601120000_add_definicao_senha_to_usuarios_html.html b/doc/tmp/rubycritic/db/migrate/20260601120000_add_definicao_senha_to_usuarios_html.html new file mode 100644 index 0000000000..33348f0d72 --- /dev/null +++ b/doc/tmp/rubycritic/db/migrate/20260601120000_add_definicao_senha_to_usuarios_html.html @@ -0,0 +1,2043 @@ + + + + + + + +20260601120000_add_definicao_senha_to_usuarios.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-06-02 16:50:28 -0300'>2026-06-02 16:50:28 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>db/migrate /</small> 20260601120000_add_definicao_senha_to_usuarios.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating a big">
+            A
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">8</span><small> lines of codes</small></div>
+            <div><span class="metric">1</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">3.0</span><small> complexity/method</small></div>
+            <div><span class="metric">1</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">3.0</span><small> complexity</small></div>
+            <div><span class="metric">16</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              2
+              smells
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code">class AddDefinicaoSenhaToUsuarios &lt; ActiveRecord::Migration[8.1]<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Irresponsible-Module.md" target="_blank"><b>IrresponsibleModule</b></a>        </span>      </div>      <span>AddDefinicaoSenhaToUsuarios has no descriptive comment</span>          </div>  </li></ol>
+def change<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="http://docs.seattlerb.org/flay/" target="_blank"><b>DuplicateCode</b></a>        </span>      </div>      <span>Similar code found in 2 nodes</span>              <span>Locations:</span>                  <a href="20260601120000_add_definicao_senha_to_usuarios.html#L2" class="js-smell-location">0</a>                  <a href="20260602090000_add_redefinicao_senha_to_usuarios.html#L2" class="js-smell-location">1</a>                  </div>  </li></ol>
+  add_column :usuarios, :definicao_senha_token, :string
+  add_column :usuarios, :definicao_senha_sent_at, :datetime
+
+  add_index :usuarios, :definicao_senha_token, unique: true
+end
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/db/migrate/20260602090000_add_redefinicao_senha_to_usuarios_html.html b/doc/tmp/rubycritic/db/migrate/20260602090000_add_redefinicao_senha_to_usuarios_html.html new file mode 100644 index 0000000000..5d859f3ec0 --- /dev/null +++ b/doc/tmp/rubycritic/db/migrate/20260602090000_add_redefinicao_senha_to_usuarios_html.html @@ -0,0 +1,2043 @@ + + + + + + + +20260602090000_add_redefinicao_senha_to_usuarios.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-06-02 16:50:28 -0300'>2026-06-02 16:50:28 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>db/migrate /</small> 20260602090000_add_redefinicao_senha_to_usuarios.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating a big">
+            A
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">8</span><small> lines of codes</small></div>
+            <div><span class="metric">1</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">3.0</span><small> complexity/method</small></div>
+            <div><span class="metric">1</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">3.0</span><small> complexity</small></div>
+            <div><span class="metric">16</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              2
+              smells
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code">class AddRedefinicaoSenhaToUsuarios &lt; ActiveRecord::Migration[8.1]<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Irresponsible-Module.md" target="_blank"><b>IrresponsibleModule</b></a>        </span>      </div>      <span>AddRedefinicaoSenhaToUsuarios has no descriptive comment</span>          </div>  </li></ol>
+def change<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="http://docs.seattlerb.org/flay/" target="_blank"><b>DuplicateCode</b></a>        </span>      </div>      <span>Similar code found in 2 nodes</span>              <span>Locations:</span>                  <a href="20260601120000_add_definicao_senha_to_usuarios.html#L2" class="js-smell-location">0</a>                  <a href="20260602090000_add_redefinicao_senha_to_usuarios.html#L2" class="js-smell-location">1</a>                  </div>  </li></ol>
+  add_column :usuarios, :redefinicao_senha_token, :string
+  add_column :usuarios, :redefinicao_senha_sent_at, :datetime
+
+  add_index :usuarios, :redefinicao_senha_token, unique: true
+end
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/db/migrate/20260615105458_add_usuario_to_templates_html.html b/doc/tmp/rubycritic/db/migrate/20260615105458_add_usuario_to_templates_html.html new file mode 100644 index 0000000000..4775781cd8 --- /dev/null +++ b/doc/tmp/rubycritic/db/migrate/20260615105458_add_usuario_to_templates_html.html @@ -0,0 +1,2040 @@ + + + + + + + +20260615105458_add_usuario_to_templates.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-06-15 09:01:08 -0300'>2026-06-15 09:01:08 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>db/migrate /</small> 20260615105458_add_usuario_to_templates.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating a big">
+            A
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">5</span><small> lines of codes</small></div>
+            <div><span class="metric">1</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">1.0</span><small> complexity/method</small></div>
+            <div><span class="metric">1</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">1.0</span><small> complexity</small></div>
+            <div><span class="metric">0</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              1
+              smell
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code">class AddUsuarioToTemplates &lt; ActiveRecord::Migration[8.1]<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Irresponsible-Module.md" target="_blank"><b>IrresponsibleModule</b></a>        </span>      </div>      <span>AddUsuarioToTemplates has no descriptive comment</span>          </div>  </li></ol>
+def change
+  add_reference :templates, :usuario, null: false, foreign_key: true
+end
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/db/migrate/20260616193744_add_titulo_to_formularios_and_make_turma_optional_html.html b/doc/tmp/rubycritic/db/migrate/20260616193744_add_titulo_to_formularios_and_make_turma_optional_html.html new file mode 100644 index 0000000000..5c3b511c85 --- /dev/null +++ b/doc/tmp/rubycritic/db/migrate/20260616193744_add_titulo_to_formularios_and_make_turma_optional_html.html @@ -0,0 +1,2041 @@ + + + + + + + +20260616193744_add_titulo_to_formularios_and_make_turma_optional.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-06-17 10:39:37 -0300'>2026-06-17 10:39:37 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>db/migrate /</small> 20260616193744_add_titulo_to_formularios_and_make_turma_optional.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating a big">
+            A
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">6</span><small> lines of codes</small></div>
+            <div><span class="metric">1</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">3.3</span><small> complexity/method</small></div>
+            <div><span class="metric">2</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">3.26</span><small> complexity</small></div>
+            <div><span class="metric">0</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              1
+              smell
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code">class AddTituloToFormulariosAndMakeTurmaOptional &lt; ActiveRecord::Migration[8.1]<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Irresponsible-Module.md" target="_blank"><b>IrresponsibleModule</b></a>        </span>      </div>      <span>AddTituloToFormulariosAndMakeTurmaOptional has no descriptive comment</span>          </div>  </li></ol>
+def change
+  add_column :formularios, :titulo, :string unless column_exists?(:formularios, :titulo)
+  change_column_null :formularios, :turma_id, true
+end
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/db/migrate/20260616201400_add_tipo_to_elemento_forms_html.html b/doc/tmp/rubycritic/db/migrate/20260616201400_add_tipo_to_elemento_forms_html.html new file mode 100644 index 0000000000..3c0ebabea6 --- /dev/null +++ b/doc/tmp/rubycritic/db/migrate/20260616201400_add_tipo_to_elemento_forms_html.html @@ -0,0 +1,2040 @@ + + + + + + + +20260616201400_add_tipo_to_elemento_forms.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-06-17 10:39:37 -0300'>2026-06-17 10:39:37 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>db/migrate /</small> 20260616201400_add_tipo_to_elemento_forms.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating a big">
+            A
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">5</span><small> lines of codes</small></div>
+            <div><span class="metric">1</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">2.3</span><small> complexity/method</small></div>
+            <div><span class="metric">2</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">2.33</span><small> complexity</small></div>
+            <div><span class="metric">0</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              1
+              smell
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code">class AddTipoToElementoForms &lt; ActiveRecord::Migration[8.1]<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Irresponsible-Module.md" target="_blank"><b>IrresponsibleModule</b></a>        </span>      </div>      <span>AddTipoToElementoForms has no descriptive comment</span>          </div>  </li></ol>
+def change
+  add_column :elemento_forms, :tipo, :string unless column_exists?(:elemento_forms, :tipo)
+end
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/db/queue_schema_html.html b/doc/tmp/rubycritic/db/queue_schema_html.html new file mode 100644 index 0000000000..3765b813a9 --- /dev/null +++ b/doc/tmp/rubycritic/db/queue_schema_html.html @@ -0,0 +1,2164 @@ + + + + + + + +queue_schema.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../overview.html"><img src="../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-05-20 08:32:31 -0300'>2026-05-20 08:32:31 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>db /</small> queue_schema.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating c big">
+            C
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">129</span><small> lines of codes</small></div>
+            <div><span class="metric">0</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">N/A</span><small> complexity/method</small></div>
+            <div><span class="metric">1</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">128.35</span><small> complexity</small></div>
+            <div><span class="metric">0</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              0
+              smell
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code">ActiveRecord::Schema[7.1].define(version: 1) do
+create_table &quot;solid_queue_blocked_executions&quot;, force: :cascade do |t|
+  t.bigint &quot;job_id&quot;, null: false
+  t.string &quot;queue_name&quot;, null: false
+  t.integer &quot;priority&quot;, default: 0, null: false
+  t.string &quot;concurrency_key&quot;, null: false
+  t.datetime &quot;expires_at&quot;, null: false
+  t.datetime &quot;created_at&quot;, null: false
+  t.index [ &quot;concurrency_key&quot;, &quot;priority&quot;, &quot;job_id&quot; ], name: &quot;index_solid_queue_blocked_executions_for_release&quot;
+  t.index [ &quot;expires_at&quot;, &quot;concurrency_key&quot; ], name: &quot;index_solid_queue_blocked_executions_for_maintenance&quot;
+  t.index [ &quot;job_id&quot; ], name: &quot;index_solid_queue_blocked_executions_on_job_id&quot;, unique: true
+end
+
+create_table &quot;solid_queue_claimed_executions&quot;, force: :cascade do |t|
+  t.bigint &quot;job_id&quot;, null: false
+  t.bigint &quot;process_id&quot;
+  t.datetime &quot;created_at&quot;, null: false
+  t.index [ &quot;job_id&quot; ], name: &quot;index_solid_queue_claimed_executions_on_job_id&quot;, unique: true
+  t.index [ &quot;process_id&quot;, &quot;job_id&quot; ], name: &quot;index_solid_queue_claimed_executions_on_process_id_and_job_id&quot;
+end
+
+create_table &quot;solid_queue_failed_executions&quot;, force: :cascade do |t|
+  t.bigint &quot;job_id&quot;, null: false
+  t.text &quot;error&quot;
+  t.datetime &quot;created_at&quot;, null: false
+  t.index [ &quot;job_id&quot; ], name: &quot;index_solid_queue_failed_executions_on_job_id&quot;, unique: true
+end
+
+create_table &quot;solid_queue_jobs&quot;, force: :cascade do |t|
+  t.string &quot;queue_name&quot;, null: false
+  t.string &quot;class_name&quot;, null: false
+  t.text &quot;arguments&quot;
+  t.integer &quot;priority&quot;, default: 0, null: false
+  t.string &quot;active_job_id&quot;
+  t.datetime &quot;scheduled_at&quot;
+  t.datetime &quot;finished_at&quot;
+  t.string &quot;concurrency_key&quot;
+  t.datetime &quot;created_at&quot;, null: false
+  t.datetime &quot;updated_at&quot;, null: false
+  t.index [ &quot;active_job_id&quot; ], name: &quot;index_solid_queue_jobs_on_active_job_id&quot;
+  t.index [ &quot;class_name&quot; ], name: &quot;index_solid_queue_jobs_on_class_name&quot;
+  t.index [ &quot;finished_at&quot; ], name: &quot;index_solid_queue_jobs_on_finished_at&quot;
+  t.index [ &quot;queue_name&quot;, &quot;finished_at&quot; ], name: &quot;index_solid_queue_jobs_for_filtering&quot;
+  t.index [ &quot;scheduled_at&quot;, &quot;finished_at&quot; ], name: &quot;index_solid_queue_jobs_for_alerting&quot;
+end
+
+create_table &quot;solid_queue_pauses&quot;, force: :cascade do |t|
+  t.string &quot;queue_name&quot;, null: false
+  t.datetime &quot;created_at&quot;, null: false
+  t.index [ &quot;queue_name&quot; ], name: &quot;index_solid_queue_pauses_on_queue_name&quot;, unique: true
+end
+
+create_table &quot;solid_queue_processes&quot;, force: :cascade do |t|
+  t.string &quot;kind&quot;, null: false
+  t.datetime &quot;last_heartbeat_at&quot;, null: false
+  t.bigint &quot;supervisor_id&quot;
+  t.integer &quot;pid&quot;, null: false
+  t.string &quot;hostname&quot;
+  t.text &quot;metadata&quot;
+  t.datetime &quot;created_at&quot;, null: false
+  t.string &quot;name&quot;, null: false
+  t.index [ &quot;last_heartbeat_at&quot; ], name: &quot;index_solid_queue_processes_on_last_heartbeat_at&quot;
+  t.index [ &quot;name&quot;, &quot;supervisor_id&quot; ], name: &quot;index_solid_queue_processes_on_name_and_supervisor_id&quot;, unique: true
+  t.index [ &quot;supervisor_id&quot; ], name: &quot;index_solid_queue_processes_on_supervisor_id&quot;
+end
+
+create_table &quot;solid_queue_ready_executions&quot;, force: :cascade do |t|
+  t.bigint &quot;job_id&quot;, null: false
+  t.string &quot;queue_name&quot;, null: false
+  t.integer &quot;priority&quot;, default: 0, null: false
+  t.datetime &quot;created_at&quot;, null: false
+  t.index [ &quot;job_id&quot; ], name: &quot;index_solid_queue_ready_executions_on_job_id&quot;, unique: true
+  t.index [ &quot;priority&quot;, &quot;job_id&quot; ], name: &quot;index_solid_queue_poll_all&quot;
+  t.index [ &quot;queue_name&quot;, &quot;priority&quot;, &quot;job_id&quot; ], name: &quot;index_solid_queue_poll_by_queue&quot;
+end
+
+create_table &quot;solid_queue_recurring_executions&quot;, force: :cascade do |t|
+  t.bigint &quot;job_id&quot;, null: false
+  t.string &quot;task_key&quot;, null: false
+  t.datetime &quot;run_at&quot;, null: false
+  t.datetime &quot;created_at&quot;, null: false
+  t.index [ &quot;job_id&quot; ], name: &quot;index_solid_queue_recurring_executions_on_job_id&quot;, unique: true
+  t.index [ &quot;task_key&quot;, &quot;run_at&quot; ], name: &quot;index_solid_queue_recurring_executions_on_task_key_and_run_at&quot;, unique: true
+end
+
+create_table &quot;solid_queue_recurring_tasks&quot;, force: :cascade do |t|
+  t.string &quot;key&quot;, null: false
+  t.string &quot;schedule&quot;, null: false
+  t.string &quot;command&quot;, limit: 2048
+  t.string &quot;class_name&quot;
+  t.text &quot;arguments&quot;
+  t.string &quot;queue_name&quot;
+  t.integer &quot;priority&quot;, default: 0
+  t.boolean &quot;static&quot;, default: true, null: false
+  t.text &quot;description&quot;
+  t.datetime &quot;created_at&quot;, null: false
+  t.datetime &quot;updated_at&quot;, null: false
+  t.index [ &quot;key&quot; ], name: &quot;index_solid_queue_recurring_tasks_on_key&quot;, unique: true
+  t.index [ &quot;static&quot; ], name: &quot;index_solid_queue_recurring_tasks_on_static&quot;
+end
+
+create_table &quot;solid_queue_scheduled_executions&quot;, force: :cascade do |t|
+  t.bigint &quot;job_id&quot;, null: false
+  t.string &quot;queue_name&quot;, null: false
+  t.integer &quot;priority&quot;, default: 0, null: false
+  t.datetime &quot;scheduled_at&quot;, null: false
+  t.datetime &quot;created_at&quot;, null: false
+  t.index [ &quot;job_id&quot; ], name: &quot;index_solid_queue_scheduled_executions_on_job_id&quot;, unique: true
+  t.index [ &quot;scheduled_at&quot;, &quot;priority&quot;, &quot;job_id&quot; ], name: &quot;index_solid_queue_dispatch_all&quot;
+end
+
+create_table &quot;solid_queue_semaphores&quot;, force: :cascade do |t|
+  t.string &quot;key&quot;, null: false
+  t.integer &quot;value&quot;, default: 1, null: false
+  t.datetime &quot;expires_at&quot;, null: false
+  t.datetime &quot;created_at&quot;, null: false
+  t.datetime &quot;updated_at&quot;, null: false
+  t.index [ &quot;expires_at&quot; ], name: &quot;index_solid_queue_semaphores_on_expires_at&quot;
+  t.index [ &quot;key&quot;, &quot;value&quot; ], name: &quot;index_solid_queue_semaphores_on_key_and_value&quot;
+  t.index [ &quot;key&quot; ], name: &quot;index_solid_queue_semaphores_on_key&quot;, unique: true
+end
+
+add_foreign_key &quot;solid_queue_blocked_executions&quot;, &quot;solid_queue_jobs&quot;, column: &quot;job_id&quot;, on_delete: :cascade
+add_foreign_key &quot;solid_queue_claimed_executions&quot;, &quot;solid_queue_jobs&quot;, column: &quot;job_id&quot;, on_delete: :cascade
+add_foreign_key &quot;solid_queue_failed_executions&quot;, &quot;solid_queue_jobs&quot;, column: &quot;job_id&quot;, on_delete: :cascade
+add_foreign_key &quot;solid_queue_ready_executions&quot;, &quot;solid_queue_jobs&quot;, column: &quot;job_id&quot;, on_delete: :cascade
+add_foreign_key &quot;solid_queue_recurring_executions&quot;, &quot;solid_queue_jobs&quot;, column: &quot;job_id&quot;, on_delete: :cascade
+add_foreign_key &quot;solid_queue_scheduled_executions&quot;, &quot;solid_queue_jobs&quot;, column: &quot;job_id&quot;, on_delete: :cascade
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../assets/javascripts/application.js"></script>
+  <script src="../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/db/schema_html.html b/doc/tmp/rubycritic/db/schema_html.html new file mode 100644 index 0000000000..fde68f16ef --- /dev/null +++ b/doc/tmp/rubycritic/db/schema_html.html @@ -0,0 +1,2204 @@ + + + + + + + +schema.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../overview.html"><img src="../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-06-16 17:39:08 -0300'>2026-06-16 17:39:08 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>db /</small> schema.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating d big">
+            D
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">176</span><small> lines of codes</small></div>
+            <div><span class="metric">0</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">N/A</span><small> complexity/method</small></div>
+            <div><span class="metric">5</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">149.3</span><small> complexity</small></div>
+            <div><span class="metric">248</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              4
+              smells
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code"># This file is auto-generated from the current state of the database. Instead
+ +

# of editing this file, please use the migrations feature of Active Record to # incrementally modify your database, and then regenerate this schema definition. # # This file is the source Rails uses to define your schema when running ‘bin/rails # db:schema:load`. When creating a new database, `bin/rails db:schema:load` tends to # be faster and is potentially less error prone than running all of your # migrations from scratch. Old migrations may fail to apply correctly if those # migrations use external dependencies or application code. # # It&#39;s strongly recommended that you check this file into your version control system.

+ +

ActiveRecord::Schema.define(version: 2026_06_16_201400) do

+ +
create_table &quot;campo_forms&quot;, charset: &quot;utf8mb4&quot;, collation: &quot;utf8mb4_0900_ai_ci&quot;, force: :cascade do |t|
+  t.datetime &quot;created_at&quot;, null: false
+  t.bigint &quot;elemento_form_id&quot;, null: false
+  t.string &quot;enunciado&quot;
+  t.integer &quot;ordem&quot;
+  t.datetime &quot;updated_at&quot;, null: false
+  t.index [&quot;elemento_form_id&quot;], name: &quot;index_campo_forms_on_elemento_form_id&quot;
+end
+
+create_table &quot;campos&quot;, charset: &quot;utf8mb4&quot;, collation: &quot;utf8mb4_0900_ai_ci&quot;, force: :cascade do |t|<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="http://docs.seattlerb.org/flay/" target="_blank"><b>DuplicateCode</b></a>        </span>      </div>      <span>Similar code found in 2 nodes</span>              <span>Locations:</span>                  <a href="schema.html#L23" class="js-smell-location">0</a>                  <a href="schema.html#L128" class="js-smell-location">1</a>                  </div>  </li></ol>
+  t.datetime &quot;created_at&quot;, null: false
+  t.bigint &quot;elemento_id&quot;, null: false
+  t.string &quot;enunciado&quot;
+  t.integer &quot;ordem&quot;
+  t.string &quot;tipo_elemento&quot;
+  t.datetime &quot;updated_at&quot;, null: false
+  t.index [&quot;elemento_id&quot;], name: &quot;index_campos_on_elemento_id&quot;
+end
+
+create_table &quot;cursos&quot;, charset: &quot;utf8mb4&quot;, collation: &quot;utf8mb4_0900_ai_ci&quot;, force: :cascade do |t|<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="http://docs.seattlerb.org/flay/" target="_blank"><b>DuplicateCode</b></a>        </span>      </div>      <span>Similar code found in 2 nodes</span>              <span>Locations:</span>                  <a href="schema.html#L33" class="js-smell-location">0</a>                  <a href="schema.html#L56" class="js-smell-location">1</a>                  </div>  </li></ol>
+  t.string &quot;codigo&quot;
+  t.datetime &quot;created_at&quot;, null: false
+  t.bigint &quot;departamento_id&quot;, null: false
+  t.string &quot;nome&quot;
+  t.datetime &quot;updated_at&quot;, null: false
+  t.index [&quot;codigo&quot;], name: &quot;index_cursos_on_codigo&quot;, unique: true
+  t.index [&quot;departamento_id&quot;], name: &quot;index_cursos_on_departamento_id&quot;
+end
+
+create_table &quot;departamentos&quot;, charset: &quot;utf8mb4&quot;, collation: &quot;utf8mb4_0900_ai_ci&quot;, force: :cascade do |t|
+  t.string &quot;codigo&quot;
+  t.datetime &quot;created_at&quot;, null: false
+  t.string &quot;nome&quot;
+  t.datetime &quot;updated_at&quot;, null: false
+  t.index [&quot;codigo&quot;], name: &quot;index_departamentos_on_codigo&quot;, unique: true
+end
+
+create_table &quot;discentes_turmas&quot;, id: false, charset: &quot;utf8mb4&quot;, collation: &quot;utf8mb4_0900_ai_ci&quot;, force: :cascade do |t|<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="http://docs.seattlerb.org/flay/" target="_blank"><b>DuplicateCode</b></a>        </span>      </div>      <span>Similar code found in 2 nodes</span>              <span>Locations:</span>                  <a href="schema.html#L51" class="js-smell-location">0</a>                  <a href="schema.html#L66" class="js-smell-location">1</a>                  </div>  </li></ol>
+  t.bigint &quot;discente_id&quot;, null: false
+  t.bigint &quot;turma_id&quot;, null: false
+end
+
+create_table &quot;disciplinas&quot;, charset: &quot;utf8mb4&quot;, collation: &quot;utf8mb4_0900_ai_ci&quot;, force: :cascade do |t|<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="http://docs.seattlerb.org/flay/" target="_blank"><b>DuplicateCode</b></a>        </span>      </div>      <span>Similar code found in 2 nodes</span>              <span>Locations:</span>                  <a href="schema.html#L33" class="js-smell-location">0</a>                  <a href="schema.html#L56" class="js-smell-location">1</a>                  </div>  </li></ol>
+  t.string &quot;codigo&quot;
+  t.datetime &quot;created_at&quot;, null: false
+  t.bigint &quot;departamento_id&quot;, null: false
+  t.string &quot;nome&quot;
+  t.datetime &quot;updated_at&quot;, null: false
+  t.index [&quot;codigo&quot;], name: &quot;index_disciplinas_on_codigo&quot;, unique: true
+  t.index [&quot;departamento_id&quot;], name: &quot;index_disciplinas_on_departamento_id&quot;
+end
+
+create_table &quot;docentes_turmas&quot;, id: false, charset: &quot;utf8mb4&quot;, collation: &quot;utf8mb4_0900_ai_ci&quot;, force: :cascade do |t|<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="http://docs.seattlerb.org/flay/" target="_blank"><b>DuplicateCode</b></a>        </span>      </div>      <span>Similar code found in 2 nodes</span>              <span>Locations:</span>                  <a href="schema.html#L51" class="js-smell-location">0</a>                  <a href="schema.html#L66" class="js-smell-location">1</a>                  </div>  </li></ol>
+  t.bigint &quot;docente_id&quot;, null: false
+  t.bigint &quot;turma_id&quot;, null: false
+end
+
+create_table &quot;elemento_forms&quot;, charset: &quot;utf8mb4&quot;, collation: &quot;utf8mb4_0900_ai_ci&quot;, force: :cascade do |t|
+  t.datetime &quot;created_at&quot;, null: false
+  t.string &quot;enunciado&quot;
+  t.bigint &quot;formulario_id&quot;, null: false
+  t.integer &quot;ordem&quot;
+  t.string &quot;tipo&quot;
+  t.datetime &quot;updated_at&quot;, null: false
+  t.index [&quot;formulario_id&quot;], name: &quot;index_elemento_forms_on_formulario_id&quot;
+end
+
+create_table &quot;elementos&quot;, charset: &quot;utf8mb4&quot;, collation: &quot;utf8mb4_0900_ai_ci&quot;, force: :cascade do |t|
+  t.datetime &quot;created_at&quot;, null: false
+  t.string &quot;enunciado&quot;
+  t.integer &quot;ordem&quot;
+  t.bigint &quot;template_id&quot;, null: false
+  t.datetime &quot;updated_at&quot;, null: false
+  t.index [&quot;template_id&quot;], name: &quot;index_elementos_on_template_id&quot;
+end
+
+create_table &quot;formularios&quot;, charset: &quot;utf8mb4&quot;, collation: &quot;utf8mb4_0900_ai_ci&quot;, force: :cascade do |t|
+  t.datetime &quot;created_at&quot;, null: false
+  t.string &quot;titulo&quot;
+  t.bigint &quot;turma_id&quot;
+  t.datetime &quot;updated_at&quot;, null: false
+  t.index [&quot;turma_id&quot;], name: &quot;index_formularios_on_turma_id&quot;
+end
+
+create_table &quot;resposta_elems&quot;, charset: &quot;utf8mb4&quot;, collation: &quot;utf8mb4_0900_ai_ci&quot;, force: :cascade do |t|
+  t.bigint &quot;campo_form_id&quot;
+  t.datetime &quot;created_at&quot;, null: false
+  t.bigint &quot;elemento_form_id&quot;, null: false
+  t.bigint &quot;resposta_form_id&quot;, null: false
+  t.text &quot;texto_resposta&quot;
+  t.datetime &quot;updated_at&quot;, null: false
+  t.index [&quot;campo_form_id&quot;], name: &quot;index_resposta_elems_on_campo_form_id&quot;
+  t.index [&quot;elemento_form_id&quot;], name: &quot;index_resposta_elems_on_elemento_form_id&quot;
+  t.index [&quot;resposta_form_id&quot;], name: &quot;index_resposta_elems_on_resposta_form_id&quot;
+end
+
+create_table &quot;resposta_forms&quot;, charset: &quot;utf8mb4&quot;, collation: &quot;utf8mb4_0900_ai_ci&quot;, force: :cascade do |t|
+  t.datetime &quot;created_at&quot;, null: false
+  t.date &quot;data_submissao&quot;
+  t.bigint &quot;formulario_id&quot;, null: false
+  t.datetime &quot;updated_at&quot;, null: false
+  t.bigint &quot;usuario_id&quot;, null: false
+  t.index [&quot;formulario_id&quot;], name: &quot;index_resposta_forms_on_formulario_id&quot;
+  t.index [&quot;usuario_id&quot;], name: &quot;index_resposta_forms_on_usuario_id&quot;
+end
+
+create_table &quot;templates&quot;, charset: &quot;utf8mb4&quot;, collation: &quot;utf8mb4_0900_ai_ci&quot;, force: :cascade do |t|
+  t.datetime &quot;created_at&quot;, null: false
+  t.string &quot;nome&quot;
+  t.datetime &quot;updated_at&quot;, null: false
+  t.bigint &quot;usuario_id&quot;, null: false
+  t.index [&quot;usuario_id&quot;], name: &quot;index_templates_on_usuario_id&quot;
+end
+
+create_table &quot;turmas&quot;, charset: &quot;utf8mb4&quot;, collation: &quot;utf8mb4_0900_ai_ci&quot;, force: :cascade do |t|<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="http://docs.seattlerb.org/flay/" target="_blank"><b>DuplicateCode</b></a>        </span>      </div>      <span>Similar code found in 2 nodes</span>              <span>Locations:</span>                  <a href="schema.html#L23" class="js-smell-location">0</a>                  <a href="schema.html#L128" class="js-smell-location">1</a>                  </div>  </li></ol>
+  t.datetime &quot;created_at&quot;, null: false
+  t.bigint &quot;disciplina_id&quot;, null: false
+  t.string &quot;horario&quot;
+  t.string &quot;numero_da_turma&quot;
+  t.string &quot;semestre&quot;
+  t.datetime &quot;updated_at&quot;, null: false
+  t.index [&quot;disciplina_id&quot;], name: &quot;index_turmas_on_disciplina_id&quot;
+end
+
+create_table &quot;usuarios&quot;, charset: &quot;utf8mb4&quot;, collation: &quot;utf8mb4_0900_ai_ci&quot;, force: :cascade do |t|<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="http://docs.seattlerb.org/flog/" target="_blank"><b>HighComplexity</b></a>        </span>      </div>      <span>create_table#usuarios has a flog score of 26</span>          </div>  </li></ol>
+  t.datetime &quot;created_at&quot;, null: false
+  t.bigint &quot;curso_id&quot;
+  t.datetime &quot;definicao_senha_sent_at&quot;
+  t.string &quot;definicao_senha_token&quot;
+  t.bigint &quot;departamento_id&quot;
+  t.string &quot;email&quot;
+  t.string &quot;formacao&quot;
+  t.string &quot;matricula&quot;
+  t.string &quot;nome&quot;
+  t.datetime &quot;redefinicao_senha_sent_at&quot;
+  t.string &quot;redefinicao_senha_token&quot;
+  t.string &quot;senha_hash&quot;
+  t.string &quot;type&quot;
+  t.datetime &quot;updated_at&quot;, null: false
+  t.index [&quot;curso_id&quot;], name: &quot;index_usuarios_on_curso_id&quot;
+  t.index [&quot;definicao_senha_token&quot;], name: &quot;index_usuarios_on_definicao_senha_token&quot;, unique: true
+  t.index [&quot;departamento_id&quot;], name: &quot;index_usuarios_on_departamento_id&quot;
+  t.index [&quot;matricula&quot;], name: &quot;index_usuarios_on_matricula&quot;, unique: true
+  t.index [&quot;redefinicao_senha_token&quot;], name: &quot;index_usuarios_on_redefinicao_senha_token&quot;, unique: true
+end
+
+add_foreign_key &quot;campo_forms&quot;, &quot;elemento_forms&quot;
+add_foreign_key &quot;campos&quot;, &quot;elementos&quot;
+add_foreign_key &quot;cursos&quot;, &quot;departamentos&quot;
+add_foreign_key &quot;disciplinas&quot;, &quot;departamentos&quot;
+add_foreign_key &quot;elemento_forms&quot;, &quot;formularios&quot;
+add_foreign_key &quot;elementos&quot;, &quot;templates&quot;
+add_foreign_key &quot;formularios&quot;, &quot;turmas&quot;
+add_foreign_key &quot;resposta_elems&quot;, &quot;campo_forms&quot;
+add_foreign_key &quot;resposta_elems&quot;, &quot;elemento_forms&quot;
+add_foreign_key &quot;resposta_elems&quot;, &quot;resposta_forms&quot;
+add_foreign_key &quot;resposta_forms&quot;, &quot;formularios&quot;
+add_foreign_key &quot;resposta_forms&quot;, &quot;usuarios&quot;
+add_foreign_key &quot;templates&quot;, &quot;usuarios&quot;
+add_foreign_key &quot;turmas&quot;, &quot;disciplinas&quot;
+add_foreign_key &quot;usuarios&quot;, &quot;cursos&quot;
+add_foreign_key &quot;usuarios&quot;, &quot;departamentos&quot;
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../assets/javascripts/application.js"></script>
+  <script src="../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/db/seeds_html.html b/doc/tmp/rubycritic/db/seeds_html.html new file mode 100644 index 0000000000..9e06c96f01 --- /dev/null +++ b/doc/tmp/rubycritic/db/seeds_html.html @@ -0,0 +1,2290 @@ + + + + + + + +seeds.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../overview.html"><img src="../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-06-17 10:47:15 -0300'>2026-06-17 10:47:15 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>db /</small> seeds.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating d big">
+            D
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">271</span><small> lines of codes</small></div>
+            <div><span class="metric">1</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">57.1</span><small> complexity/method</small></div>
+            <div><span class="metric">10</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">57.13</span><small> complexity</small></div>
+            <div><span class="metric">168</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              12
+              smells
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code"># This file should ensure the existence of records required to run the application in every environment.
+ +

# The code here should be idempotent so that it can be executed at any point in every environment.

+ +

# Departamentos dept_cic = Departamento.find_or_create_by!(codigo: &quot;CIC&quot;) do |d|

+ +
d.nome = &quot;Ciência da Computação&quot;
+ +

end

+ +

dept_mat = Departamento.find_or_create_by!(codigo: &quot;MAT&quot;) do |d|

+ +
d.nome = &quot;Matemática&quot;
+ +

end

+ +

# Cursos curso_cc = Curso.find_or_create_by!(codigo: &quot;CC&quot;) do |c|

+ +
c.nome = &quot;Bacharelado em Ciência da Computação&quot;
+c.departamento = dept_cic
+ +

end

+ +

# Disciplinas disc_ed = Disciplina.find_or_create_by!(codigo: &quot;CIC0001&quot;) do |d|

+ +
d.nome = &quot;Estrutura de Dados&quot;
+d.departamento = dept_cic
+ +

end

+ +

disc_isc = Disciplina.find_or_create_by!(codigo: &quot;CIC0002&quot;) do |d|

+ +
d.nome = &quot;Introdução aos Sistemas de Computação&quot;
+d.departamento = dept_cic
+ +

end

+ +

disc_apc = Disciplina.find_or_create_by!(codigo: &quot;CIC0003&quot;) do |d|

+ +
d.nome = &quot;Algoritmos e Programação de Computadores&quot;
+d.departamento = dept_cic
+ +

end

+ +

# Turmas turma_ed_a = Turma.find_or_create_by!(numero_da_turma: &quot;A&quot;, semestre: &quot;2026.1&quot;, disciplina: disc_ed) do |t|

+ +
t.horario = &quot;35T23&quot;
+ +

end

+ +

turma_ed_b = Turma.find_or_create_by!(numero_da_turma: &quot;B&quot;, semestre: &quot;2026.1&quot;, disciplina: disc_ed) do |t|

+ +
t.horario = &quot;35M23&quot;
+ +

end

+ +

# Introdução aos Sistemas de Computação - Turma A turma_isc_a = Turma.find_or_create_by!(numero_da_turma: &quot;A&quot;, semestre: &quot;2026.1&quot;, disciplina: disc_isc) do |t|

+ +
t.horario = &quot;24T23&quot;
+ +

end

+ +

# Usuários (Docente, Discente, Admin) # A migration AjustaNulosParaSti permite que curso e departamento sejam nulos, # mas vamos associá-los aos nossos testes para dados mais ricos.

+ +

# Docentes docente_1 = Docente.find_or_initialize_by(email: &quot;docente1@teste.com&quot;) docente_1.nome ||= &quot;Professor de ED&quot; docente_1.matricula ||= &quot;241000001&quot; docente_1.senha = &quot;teste123&quot; docente_1.senha_confirmation = &quot;teste123&quot; docente_1.departamento = dept_cic docente_1.formacao = &quot;doutorado&quot; docente_1.save!

+ +

docente_2 = Docente.find_or_initialize_by(email: &quot;docente2@teste.com&quot;) docente_2.nome ||= &quot;Professor de ISC&quot; docente_2.matricula ||= &quot;241000011&quot; docente_2.senha = &quot;teste123&quot; docente_2.senha_confirmation = &quot;teste123&quot; docente_2.departamento = dept_cic docente_2.formacao = &quot;doutorado&quot; docente_2.save!

+ +

docente_3 = Docente.find_or_initialize_by(email: &quot;docente3@teste.com&quot;) docente_3.nome ||= &quot;Zequinha Banana&quot; docente_3.matricula ||= &quot;241000069&quot; docente_3.senha = &quot;teste123&quot; docente_3.senha_confirmation = &quot;teste123&quot; docente_3.departamento = dept_cic docente_3.formacao = &quot;doutorado&quot; docente_3.save!

+ +

# Admin admin = Administrador.find_or_initialize_by(email: &quot;admin@teste.com&quot;) admin.nome ||= &quot;Admin Teste&quot; admin.matricula ||= &quot;240000003&quot; admin.senha = &quot;teste123&quot; admin.senha_confirmation = &quot;teste123&quot; admin.departamento = dept_cic admin.save!

+ +

# Discentes (Lista de novos alunos) alunos_dados = [

+ +
{ email: &quot;discente1@teste.com&quot;, nome: &quot;Ana Silva&quot;, matricula: &quot;241000002&quot; },
+{ email: &quot;discente2@teste.com&quot;, nome: &quot;Bruno Santos&quot;, matricula: &quot;241000004&quot; },
+{ email: &quot;discente3@teste.com&quot;, nome: &quot;Carlos Oliveira&quot;, matricula: &quot;241000005&quot; },
+{ email: &quot;discente4@teste.com&quot;, nome: &quot;Diana Costa&quot;, matricula: &quot;241000006&quot; },
+{ email: &quot;discente5@teste.com&quot;, nome: &quot;Eduardo Ribeiro&quot;, matricula: &quot;241000007&quot; }
+ +

]

+ +

alunos = alunos_dados.map do |dados|

+ +
aluno = Discente.find_or_initialize_by(email: dados[:email])
+aluno.nome ||= dados[:nome]
+aluno.matricula ||= dados[:matricula]
+aluno.senha = &quot;teste123&quot;
+aluno.senha_confirmation = &quot;teste123&quot;
+aluno.curso = curso_cc
+aluno.save!
+aluno
+ +

end docente = Docente.find_or_initialize_by(email: &quot;gusfring.a@gmail.com&quot;) docente.nome ||= &quot;GUS&quot; docente.matricula ||= &quot;241000067&quot; docente.senha = &quot;teste123&quot; docente.senha_confirmation = &quot;teste123&quot; docente.departamento = dept_cic docente.formacao = &quot;doutorado&quot; docente.save!

+ +

# ========================================== # VINCULANDO USUÁRIOS ÀS TURMAS # ==========================================

+ +

# Professores nas turmas docente_1.turmas &lt;&lt; turma_ed_a unless docente_1.turmas.include?(turma_ed_a) docente_1.turmas &lt;&lt; turma_ed_b unless docente_1.turmas.include?(turma_ed_b) docente_2.turmas &lt;&lt; turma_isc_a unless docente_2.turmas.include?(turma_isc_a) docente_3.turmas &lt;&lt; turma_ed_a unless docente_3.turmas.include?(turma_ed_a)

+ +

# Distribuindo alunos nas turmas para gerar variação de dados # Turma ED A: Alunos 1, 2 e 3

+
alunos, alunos, alunos[2
+
+

].each do |aluno|<ol class=“nocode errors smells”> <li> <div class=“description”> <div class=“heading”> <span> <i class=“fa fa-warning” aria-hidden=“true”></i> <a href=“docs.seattlerb.org/flay/” target=“_blank”>DuplicateCode</a> </span> </div> <span>Similar code found in 3 nodes</span> <span>Locations:</span> <a href=“seeds.html#L130” class=“js-smell-location”>0</a> <a href=“seeds.html#L135” class=“js-smell-location”>1</a> <a href=“seeds.html#L140” class=“js-smell-location”>2</a> </div> </li></ol>

+
+ +
aluno.turmas &lt;&lt; turma_ed_a unless aluno.turmas.include?(turma_ed_a)
+ +

end

+ +

# Turma ED B: Alunos 3, 4 e 5

+
alunos, alunos, alunos[4
+
+

].each do |aluno|<ol class=“nocode errors smells”> <li> <div class=“description”> <div class=“heading”> <span> <i class=“fa fa-warning” aria-hidden=“true”></i> <a href=“docs.seattlerb.org/flay/” target=“_blank”>DuplicateCode</a> </span> </div> <span>Similar code found in 3 nodes</span> <span>Locations:</span> <a href=“seeds.html#L130” class=“js-smell-location”>0</a> <a href=“seeds.html#L135” class=“js-smell-location”>1</a> <a href=“seeds.html#L140” class=“js-smell-location”>2</a> </div> </li></ol>

+
+ +
aluno.turmas &lt;&lt; turma_ed_b unless aluno.turmas.include?(turma_ed_b)
+ +

end

+ +

# Turma ISC A: Alunos 1, 4 e 5

+
alunos, alunos, alunos[3
+
+

].each do |aluno|<ol class=“nocode errors smells”> <li> <div class=“description”> <div class=“heading”> <span> <i class=“fa fa-warning” aria-hidden=“true”></i> <a href=“docs.seattlerb.org/flay/” target=“_blank”>DuplicateCode</a> </span> </div> <span>Similar code found in 3 nodes</span> <span>Locations:</span> <a href=“seeds.html#L130” class=“js-smell-location”>0</a> <a href=“seeds.html#L135” class=“js-smell-location”>1</a> <a href=“seeds.html#L140” class=“js-smell-location”>2</a> </div> </li></ol>

+
+ +
aluno.turmas &lt;&lt; turma_isc_a unless aluno.turmas.include?(turma_isc_a)
+ +

end

+ +

# ========================================== # TEMPLATES E ESTRUTURA BASE DE FORMULÁRIOS # ========================================== # Usamos find_or_initialize_by para evitar o salvamento imediato e não quebrar a validação template = Template.find_or_initialize_by(nome: &quot;Avaliação de Disciplina Padrão&quot;)

+ +

if template.new_record?

+ +
template.administrador = admin
+
+# ---------------------------------------------------------
+# Elemento 1: Múltipla Escolha (1 a 5)
+# ---------------------------------------------------------
+elemento_nota = template.elementos.build(enunciado: &quot;Avalie a didática do professor&quot;, ordem: 1)
+
+(1..5).each do |valor|
+  elemento_nota.campos.build(enunciado: valor.to_s, ordem: valor, tipo_elemento: &quot;Múltipla Escolha&quot;)
+end
+
+# ---------------------------------------------------------
+# Elemento 2: Múltipla Escolha (Dificuldade)
+# ---------------------------------------------------------
+elemento_opcoes = template.elementos.build(enunciado: &quot;Como você avalia a dificuldade das listas de exercícios?&quot;, ordem: 2)
+
+[ &quot;Muito Fácil&quot;, &quot;Adequada&quot;, &quot;Muito Difícil&quot; ].each_with_index do |opcao, index|
+  elemento_opcoes.campos.build(enunciado: opcao, ordem: index + 1, tipo_elemento: &quot;Múltipla Escolha&quot;)
+end
+
+# ---------------------------------------------------------
+# Elemento 3: Texto Livre
+# ---------------------------------------------------------
+elemento_texto = template.elementos.build(enunciado: &quot;Deixe um comentário ou sugestão sobre a disciplina&quot;, ordem: 3)
+
+elemento_texto.campos.build(enunciado: nil, ordem: 1, tipo_elemento: &quot;Texto&quot;)
+
+# Salva o bloco inteiro (Template + Elementos + Campos) de uma vez, satisfazendo a validação
+template.save!
+ +

end

+ +

# ========================================== # FORMULÁRIOS DAS TURMAS E RESPOSTAS # ==========================================

+ +

# Método auxiliar corrigido para clonar TODOS os campos e associar a resposta ao campo correto def configurar_formulario_e_respostas(turma, template_base, dados_alunos)<ol class=“nocode errors smells”> <li> <div class=“description”> <div class=“heading”> <span> <i class=“fa fa-warning” aria-hidden=“true”></i> <a href=“docs.seattlerb.org/flog/” target=“_blank”>HighComplexity</a> </span> </div> <span>main#configurar_formulario_e_respostas has a flog score of 57</span> </div> </li> <li> <div class=“description”> <div class=“heading”> <span> <i class=“fa fa-warning” aria-hidden=“true”></i> <a href=“github.com/troessner/reek/blob/master/docs/Too-Many-Statements.md” target=“_blank”>TooManyStatements</a> </span> </div> <span>configurar_formulario_e_respostas has approx 22 statements</span> </div> </li> <li> <div class=“description”> <div class=“heading”> <span> <i class=“fa fa-warning” aria-hidden=“true”></i> <a href=“github.com/troessner/reek/blob/master/docs/Utility-Function.md” target=“_blank”>UtilityFunction</a> </span> </div> <span>configurar_formulario_e_respostas doesn’t depend on instance state (maybe move it to another class?)</span> </div> </li></ol>

+ +
formulario = Formulario.find_or_create_by!(turma: turma)
+
+# 1. Clona todos os elementos e TODOS os seus respectivos campos para o formulário
+template_base.elementos.order(:ordem).each do |elemento_base|
+  tipo_do_elemento = elemento_base.campos.first&amp;.tipo_elemento || &quot;Múltipla Escolha&quot;<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>configurar_formulario_e_respostas calls 'elemento_base.campos' 2 times</span>              <span>Locations:</span>                  <a href="seeds.html#L192" class="js-smell-location">0</a>                  <a href="seeds.html#L204" class="js-smell-location">1</a>                  </div>  </li></ol>
+
+  ef = ElementoForm.find_or_create_by!(enunciado: elemento_base.enunciado, formulario: formulario) do |e|<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Nested-Iterators.md" target="_blank"><b>NestedIterators</b></a>        </span>      </div>      <span>configurar_formulario_e_respostas contains iterators nested 2 deep</span>              <span>Locations:</span>                  <a href="seeds.html#L194" class="js-smell-location">0</a>                  <a href="seeds.html#L216" class="js-smell-location">1</a>                  </div>  </li>  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Uncommunicative-Variable-Name.md" target="_blank"><b>UncommunicativeVariableName</b></a>        </span>      </div>      <span>configurar_formulario_e_respostas has the variable name 'e'</span>          </div>  </li></ol>
+    e.ordem = elemento_base.ordem
+    e.tipo = tipo_do_elemento
+  end
+
+  ef.update!(tipo: tipo_do_elemento) if ef.tipo.nil?<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Nil-Check.md" target="_blank"><b>NilCheck</b></a>        </span>      </div>      <span>configurar_formulario_e_respostas performs a nil-check</span>          </div>  </li></ol>
+
+  next if tipo_do_elemento == &quot;Texto&quot;
+
+  # Cria os campos (opções) apenas para elementos de múltipla escolha
+  elemento_base.campos.order(:ordem).each do |campo_base|<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>configurar_formulario_e_respostas calls 'elemento_base.campos' 2 times</span>              <span>Locations:</span>                  <a href="seeds.html#L192" class="js-smell-location">0</a>                  <a href="seeds.html#L204" class="js-smell-location">1</a>                  </div>  </li></ol>
+    CampoForm.find_or_create_by!(enunciado: campo_base.enunciado, elemento_form: ef) do |c|<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Nested-Iterators.md" target="_blank"><b>NestedIterators</b></a>        </span>      </div>      <span>configurar_formulario_e_respostas contains iterators nested 3 deep</span>              <span>Locations:</span>                  <a href="seeds.html#L205" class="js-smell-location">0</a>                  <a href="seeds.html#L229" class="js-smell-location">1</a>                  </div>  </li>  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Uncommunicative-Variable-Name.md" target="_blank"><b>UncommunicativeVariableName</b></a>        </span>      </div>      <span>configurar_formulario_e_respostas has the variable name 'c'</span>          </div>  </li></ol>
+      c.ordem = campo_base.ordem
+    end
+  end
+end
+
+# 2. Cria as respostas baseadas nos dados fornecidos
+dados_alunos.each do |dado|
+  aluno = dado[:aluno]
+  respostas = dado[:respostas] # Array com as strings das respostas na ordem das perguntas
+
+  resposta_form = RespostaForm.find_or_create_by!(formulario: formulario, usuario: aluno) do |rf|<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Nested-Iterators.md" target="_blank"><b>NestedIterators</b></a>        </span>      </div>      <span>configurar_formulario_e_respostas contains iterators nested 2 deep</span>              <span>Locations:</span>                  <a href="seeds.html#L194" class="js-smell-location">0</a>                  <a href="seeds.html#L216" class="js-smell-location">1</a>                  </div>  </li></ol>
+    rf.data_submissao = Date.today
+  end
+
+  # Itera sobre os elementos criados no formulário para salvar cada resposta
+  formulario.elemento_forms.order(:ordem).each_with_index do |ef, index|
+    texto_respondido = respostas[index].to_s
+
+    # Busca o campo correspondente:
+    # - Se for Múltipla Escolha, acha o campo que tem o enunciado igual à opção marcada (ex: &quot;5&quot; ou &quot;Adequada&quot;)
+    # - Se for Texto, pega o único campo disponível (onde o enunciado é nil)
+    cf = ef.campo_forms.find_by(enunciado: texto_respondido) || ef.campo_forms.first<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Duplicate-Method-Call.md" target="_blank"><b>DuplicateMethodCall</b></a>        </span>      </div>      <span>configurar_formulario_e_respostas calls 'ef.campo_forms' 2 times</span>          </div>  </li></ol>
+
+    RespostaElem.find_or_create_by!(resposta_form: resposta_form, elemento_form: ef) do |re|<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="https://github.com/troessner/reek/blob/master/docs/Nested-Iterators.md" target="_blank"><b>NestedIterators</b></a>        </span>      </div>      <span>configurar_formulario_e_respostas contains iterators nested 3 deep</span>              <span>Locations:</span>                  <a href="seeds.html#L205" class="js-smell-location">0</a>                  <a href="seeds.html#L229" class="js-smell-location">1</a>                  </div>  </li></ol>
+      re.texto_resposta = texto_respondido
+      re.campo_form = cf
+    end
+  end
+end
+ +

end

+ +

# Configurando dados para Estrutura de Dados - Turma A configurar_formulario_e_respostas(<ol class=“nocode errors smells”> <li> <div class=“description”> <div class=“heading”> <span> <i class=“fa fa-warning” aria-hidden=“true”></i> <a href=“docs.seattlerb.org/flay/” target=“_blank”>DuplicateCode</a> </span> </div> <span>Similar code found in 3 nodes</span> <span>Locations:</span> <a href=“seeds.html#L238” class=“js-smell-location”>0</a> <a href=“seeds.html#L249” class=“js-smell-location”>1</a> <a href=“seeds.html#L260” class=“js-smell-location”>2</a> </div> </li></ol>

+ +
turma_ed_a,
+template,
+[
+  { aluno: alunos[0], respostas: [ &quot;5&quot;, &quot;Adequada&quot;, &quot;Ótima didática, recomendo!&quot; ] },
+  { aluno: alunos[1], respostas: [ &quot;4&quot;, &quot;Muito Difícil&quot;, &quot;As listas poderiam ter mais exemplos práticos.&quot; ] },
+  { aluno: alunos[2], respostas: [ &quot;5&quot;, &quot;Adequada&quot;, &quot;Sem reclamações, matéria excelente.&quot; ] }
+]
+ +

)

+ +

# Configurando dados para Estrutura de Dados - Turma B configurar_formulario_e_respostas(<ol class=“nocode errors smells”> <li> <div class=“description”> <div class=“heading”> <span> <i class=“fa fa-warning” aria-hidden=“true”></i> <a href=“docs.seattlerb.org/flay/” target=“_blank”>DuplicateCode</a> </span> </div> <span>Similar code found in 3 nodes</span> <span>Locations:</span> <a href=“seeds.html#L238” class=“js-smell-location”>0</a> <a href=“seeds.html#L249” class=“js-smell-location”>1</a> <a href=“seeds.html#L260” class=“js-smell-location”>2</a> </div> </li></ol>

+ +
turma_ed_b,
+template,
+[
+  { aluno: alunos[2], respostas: [ &quot;3&quot;, &quot;Muito Difícil&quot;, &quot;O ritmo das aulas está muito acelerado.&quot; ] },
+  { aluno: alunos[3], respostas: [ &quot;4&quot;, &quot;Adequada&quot;, &quot;Gostei da metodologia.&quot; ] },
+  { aluno: alunos[4], respostas: [ &quot;2&quot;, &quot;Muito Difícil&quot;, &quot;Preciso de mais monitoria para acompanhar.&quot; ] }
+]
+ +

)

+ +

# Configurando dados para Introdução aos Sistemas de Computação - Turma A configurar_formulario_e_respostas(<ol class=“nocode errors smells”> <li> <div class=“description”> <div class=“heading”> <span> <i class=“fa fa-warning” aria-hidden=“true”></i> <a href=“docs.seattlerb.org/flay/” target=“_blank”>DuplicateCode</a> </span> </div> <span>Similar code found in 3 nodes</span> <span>Locations:</span> <a href=“seeds.html#L238” class=“js-smell-location”>0</a> <a href=“seeds.html#L249” class=“js-smell-location”>1</a> <a href=“seeds.html#L260” class=“js-smell-location”>2</a> </div> </li></ol>

+ +
turma_isc_a,
+template,
+[
+  { aluno: alunos[0], respostas: [ &quot;5&quot;, &quot;Muito Fácil&quot;, &quot;Projetos práticos são muito divertidos!&quot; ] },
+  { aluno: alunos[4], respostas: [ &quot;5&quot;, &quot;Adequada&quot;, &quot;O professor tira todas as dúvidas e os projetos ajudam muito.&quot; ] },
+  { aluno: alunos[3], respostas: [ &quot;4&quot;, &quot;Adequada&quot;, &quot;Gostaria de mais exercícios de fixação antes das provas.&quot; ] }
+]
+ +

)

+ +

puts &quot;Seeds finalizados com sucesso! Campos padronizados como Texto e Múltipla Escolha.“ puts &quot;Seeds finalizados com sucesso&quot; </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../assets/javascripts/application.js"></script>
+  <script src="../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/features/step_definitions/atualizar_dados_sigaa_steps_html.html b/doc/tmp/rubycritic/features/step_definitions/atualizar_dados_sigaa_steps_html.html new file mode 100644 index 0000000000..25afbcf0e7 --- /dev/null +++ b/doc/tmp/rubycritic/features/step_definitions/atualizar_dados_sigaa_steps_html.html @@ -0,0 +1,2095 @@ + + + + + + + +atualizar_dados_sigaa_steps.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-06-17 10:39:37 -0300'>2026-06-17 10:39:37 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>features/step_definitions /</small> atualizar_dados_sigaa_steps.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating d big">
+            D
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">45</span><small> lines of codes</small></div>
+            <div><span class="metric">0</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">N/A</span><small> complexity/method</small></div>
+            <div><span class="metric">5</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">101.75</span><small> complexity</small></div>
+            <div><span class="metric">144</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              1
+              smell
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code"># Reutilizar o gerenciamento de paginas dos outros steps
+ +

Dado(&#39;que os dados do SIGAA foram atualizados com sucesso&#39;) do<ol class=“nocode errors smells”> <li> <div class=“description”> <div class=“heading”> <span> <i class=“fa fa-warning” aria-hidden=“true”></i> <a href=“docs.seattlerb.org/flay/” target=“_blank”>DuplicateCode</a> </span> </div> <span>Similar code found in 8 nodes</span> <span>Locations:</span> <a href=“atualizar_dados_sigaa_steps.html#L3” class=“js-smell-location”>0</a> <a href=“atualizar_dados_sigaa_steps.html#L10” class=“js-smell-location”>1</a> <a href=“atualizar_dados_sigaa_steps.html#L17” class=“js-smell-location”>2</a> <a href=“atualizar_dados_sigaa_steps.html#L24” class=“js-smell-location”>3</a> <a href=“importar_dados_sigaa_steps.html#L6” class=“js-smell-location”>4</a> <a href=“importar_dados_sigaa_steps.html#L13” class=“js-smell-location”>5</a> <a href=“importar_dados_sigaa_steps.html#L20” class=“js-smell-location”>6</a> <a href=“importar_dados_sigaa_steps.html#L27” class=“js-smell-location”>7</a> </div> </li></ol>

+ +
allow(SigaaImporter).to receive(:update_from_files).and_return(&quot;atualização realizada com sucesso&quot;)
+arquivo = Rack::Test::UploadedFile.new(Rails.root.join(&quot;classes.json&quot;), &quot;application/json&quot;)
+page.driver.post(admin_sincronizar_sigaa_path(@admin), { acao: &#39;atualizar&#39;, arquivo_classes: arquivo, arquivo_membros: arquivo })
+visit admin_gerenciamento_path(@admin)
+ +

end

+ +

Dado(&#39;que eu tentei atualizar os dados do SIGAA mas ocorreu um erro&#39;) do<ol class=“nocode errors smells”> <li> <div class=“description”> <div class=“heading”> <span> <i class=“fa fa-warning” aria-hidden=“true”></i> <a href=“docs.seattlerb.org/flay/” target=“_blank”>DuplicateCode</a> </span> </div> <span>Similar code found in 8 nodes</span> <span>Locations:</span> <a href=“atualizar_dados_sigaa_steps.html#L3” class=“js-smell-location”>0</a> <a href=“atualizar_dados_sigaa_steps.html#L10” class=“js-smell-location”>1</a> <a href=“atualizar_dados_sigaa_steps.html#L17” class=“js-smell-location”>2</a> <a href=“atualizar_dados_sigaa_steps.html#L24” class=“js-smell-location”>3</a> <a href=“importar_dados_sigaa_steps.html#L6” class=“js-smell-location”>4</a> <a href=“importar_dados_sigaa_steps.html#L13” class=“js-smell-location”>5</a> <a href=“importar_dados_sigaa_steps.html#L20” class=“js-smell-location”>6</a> <a href=“importar_dados_sigaa_steps.html#L27” class=“js-smell-location”>7</a> </div> </li></ol>

+ +
allow(SigaaImporter).to receive(:update_from_files).and_return(&quot;falha&quot;)
+arquivo = Rack::Test::UploadedFile.new(Rails.root.join(&quot;classes.json&quot;), &quot;application/json&quot;)
+page.driver.post(admin_sincronizar_sigaa_path(@admin), { acao: &#39;atualizar&#39;, arquivo_classes: arquivo, arquivo_membros: arquivo })
+visit admin_gerenciamento_path(@admin)
+ +

end

+ +

Dado(&#39;que os dados do SIGAA já estão atualizados na base de dados do sistema&#39;) do<ol class=“nocode errors smells”> <li> <div class=“description”> <div class=“heading”> <span> <i class=“fa fa-warning” aria-hidden=“true”></i> <a href=“docs.seattlerb.org/flay/” target=“_blank”>DuplicateCode</a> </span> </div> <span>Similar code found in 8 nodes</span> <span>Locations:</span> <a href=“atualizar_dados_sigaa_steps.html#L3” class=“js-smell-location”>0</a> <a href=“atualizar_dados_sigaa_steps.html#L10” class=“js-smell-location”>1</a> <a href=“atualizar_dados_sigaa_steps.html#L17” class=“js-smell-location”>2</a> <a href=“atualizar_dados_sigaa_steps.html#L24” class=“js-smell-location”>3</a> <a href=“importar_dados_sigaa_steps.html#L6” class=“js-smell-location”>4</a> <a href=“importar_dados_sigaa_steps.html#L13” class=“js-smell-location”>5</a> <a href=“importar_dados_sigaa_steps.html#L20” class=“js-smell-location”>6</a> <a href=“importar_dados_sigaa_steps.html#L27” class=“js-smell-location”>7</a> </div> </li></ol>

+ +
allow(SigaaImporter).to receive(:update_from_files).and_return(&quot;os dados do SIGAA já estão atualizados e não serão atualizados novamente&quot;)
+arquivo = Rack::Test::UploadedFile.new(Rails.root.join(&quot;classes.json&quot;), &quot;application/json&quot;)
+page.driver.post(admin_sincronizar_sigaa_path(@admin), { acao: &#39;atualizar&#39;, arquivo_classes: arquivo, arquivo_membros: arquivo })
+visit admin_gerenciamento_path(@admin)
+ +

end

+ +

Dado(&#39;que alguns dados do SIGAA já estão atualizados na base de dados do sistema&#39;) do<ol class=“nocode errors smells”> <li> <div class=“description”> <div class=“heading”> <span> <i class=“fa fa-warning” aria-hidden=“true”></i> <a href=“docs.seattlerb.org/flay/” target=“_blank”>DuplicateCode</a> </span> </div> <span>Similar code found in 8 nodes</span> <span>Locations:</span> <a href=“atualizar_dados_sigaa_steps.html#L3” class=“js-smell-location”>0</a> <a href=“atualizar_dados_sigaa_steps.html#L10” class=“js-smell-location”>1</a> <a href=“atualizar_dados_sigaa_steps.html#L17” class=“js-smell-location”>2</a> <a href=“atualizar_dados_sigaa_steps.html#L24” class=“js-smell-location”>3</a> <a href=“importar_dados_sigaa_steps.html#L6” class=“js-smell-location”>4</a> <a href=“importar_dados_sigaa_steps.html#L13” class=“js-smell-location”>5</a> <a href=“importar_dados_sigaa_steps.html#L20” class=“js-smell-location”>6</a> <a href=“importar_dados_sigaa_steps.html#L27” class=“js-smell-location”>7</a> </div> </li></ol>

+ +
allow(SigaaImporter).to receive(:update_from_files).and_return(&quot;alguns dados já estão atualizados e não serão atualizados novamente, mas os dados restantes serão atualizados com sucesso&quot;)
+arquivo = Rack::Test::UploadedFile.new(Rails.root.join(&quot;classes.json&quot;), &quot;application/json&quot;)
+page.driver.post(admin_sincronizar_sigaa_path(@admin), { acao: &#39;atualizar&#39;, arquivo_classes: arquivo, arquivo_membros: arquivo })
+visit admin_gerenciamento_path(@admin)
+ +

end

+ +

Então(&#39;as turmas, matérias e participantes do SIGAA estão atualizados no sistema com os dados atuais do SIGAA&#39;) do

+ +
expect(page).to have_content(&#39;As turmas, matérias e participantes do SIGAA estão atualizados no sistema com os dados atuais do SIGAA.&#39;)
+ +

end

+ +

Então(&#39;uma mensagem de erro é exibida informando que a atualização falhou&#39;) do

+ +
expect(page).to have_content(&#39;erro informando que a atualização falhou&#39;)
+ +

end

+ +

Então(&#39;uma mensagem é exibida informando que os dados já estão atualizados e não serão atualizados novamente&#39;) do

+ +
expect(page).to have_content(&#39;os dados do SIGAA já estão atualizados e não serão atualizados novamente&#39;)
+ +

end

+ +

Então(&#39;uma mensagem é exibida informando que alguns dados já estão atualizados e não serão atualizados novamente, mas os dados restantes serão atualizados com sucesso&#39;) do

+ +
expect(page).to have_content(&#39;alguns dados já estão atualizados e não serão atualizados novamente, mas os dados restantes serão atualizados com sucesso&#39;)
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/features/step_definitions/cadastro_steps_html.html b/doc/tmp/rubycritic/features/step_definitions/cadastro_steps_html.html new file mode 100644 index 0000000000..b7a2b2ae03 --- /dev/null +++ b/doc/tmp/rubycritic/features/step_definitions/cadastro_steps_html.html @@ -0,0 +1,2096 @@ + + + + + + + +cadastro_steps.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-06-17 10:39:37 -0300'>2026-06-17 10:39:37 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>features/step_definitions /</small> cadastro_steps.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating c big">
+            C
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">54</span><small> lines of codes</small></div>
+            <div><span class="metric">0</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">N/A</span><small> complexity/method</small></div>
+            <div><span class="metric">7</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">75.85</span><small> complexity</small></div>
+            <div><span class="metric">67</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              3
+              smells
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code">Dado(&#39;que estou na página de gerenciamento&#39;) do<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="http://docs.seattlerb.org/flog/" target="_blank"><b>HighComplexity</b></a>        </span>      </div>      <span>Dado#que estou na página de gerenciamento has a flog score of 36</span>          </div>  </li></ol>
+departamento = Departamento.first || Departamento.create!(nome: &quot;Ciência da Computação&quot;, codigo: &quot;CIC&quot;)
+@admin = Administrador.first || Administrador.create!(
+  nome: &quot;Admin Teste&quot;,
+  matricula: &quot;admin&quot;,
+  email: &quot;admin@teste.com&quot;,
+  senha: &quot;Senha123&quot;,
+  departamento: departamento
+)
+
+allow_any_instance_of(ApplicationController).to receive(:current_user).and_return(@admin)
+
+allow_any_instance_of(AdminController).to receive(:set_admin) do |controller|<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="http://docs.seattlerb.org/flay/" target="_blank"><b>DuplicateCode</b></a>        </span>      </div>      <span>Similar code found in 2 nodes</span>              <span>Locations:</span>                  <a href="cadastro_steps.html#L13" class="js-smell-location">0</a>                  <a href="cadastro_steps.html#L17" class="js-smell-location">1</a>                  </div>  </li></ol>
+  controller.instance_variable_set(:@admin, Administrador.find(controller.params[:admin_id]))
+end
+
+allow_any_instance_of(TemplatesController).to receive(:set_admin) do |controller|<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="http://docs.seattlerb.org/flay/" target="_blank"><b>DuplicateCode</b></a>        </span>      </div>      <span>Similar code found in 2 nodes</span>              <span>Locations:</span>                  <a href="cadastro_steps.html#L13" class="js-smell-location">0</a>                  <a href="cadastro_steps.html#L17" class="js-smell-location">1</a>                  </div>  </li></ol>
+  controller.instance_variable_set(:@admin, Administrador.find(controller.params[:admin_id]))
+end
+
+visit admin_gerenciamento_path(@admin)
+ +

end

+ +

Dado(&#39;que eu importei os dados do SIGAA com sucesso&#39;) do

+ +
dep = Departamento.find_or_create_by!(codigo: &quot;NAO_ESP&quot;) { |d| d.nome = &quot;Não especificado&quot; }
+curso = Curso.find_or_create_by!(codigo: &quot;TST&quot;) do |c|
+  c.nome = &quot;Curso Teste&quot;
+  c.departamento = dep
+end
+Discente.find_or_create_by!(matricula: &quot;USR001&quot;) do |u|
+  u.nome = &quot;Usuário Teste&quot;
+  u.email = &quot;usuario@teste.com&quot;
+  u.curso = curso
+end
+ +

end

+ +

Então(&#39;o e-mail de usuário {string} está cadastrado no sistema com senha indefinida&#39;) do |email|

+ +
usuario = Usuario.find_by(email: email)
+expect(usuario).to be_present,
+  &quot;Esperava encontrar um usuário com email &#39;#{email}&#39;, mas não encontrei.&quot;
+expect(usuario.senha_hash).to be_blank,
+  &quot;Esperava que o usuário &#39;#{email}&#39; não tivesse senha definida, mas tinha.&quot;
+ +

end

+ +

Então(&#39;um email de definição de senha é enviado para o email {string}&#39;) do |email|<ol class=“nocode errors smells”> <li> <div class=“description”> <div class=“heading”> <span> <i class=“fa fa-warning” aria-hidden=“true”></i> <a href=“docs.seattlerb.org/flay/” target=“_blank”>DuplicateCode</a> </span> </div> <span>Similar code found in 2 nodes</span> <span>Locations:</span> <a href=“cadastro_steps.html#L45” class=“js-smell-location”>0</a> <a href=“senha_steps.html#L43” class=“js-smell-location”>1</a> </div> </li></ol>

+ +
usuario = Usuario.find_by!(email: email)
+ActionMailer::Base.deliveries.clear
+usuario.enviar_email_definicao_senha!
+
+@email_destino = email
+
+enviados = ActionMailer::Base.deliveries.select { |m| m.to == [ email ] }
+expect(enviados).not_to be_empty
+
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/features/step_definitions/criar_formulario_steps_html.html b/doc/tmp/rubycritic/features/step_definitions/criar_formulario_steps_html.html new file mode 100644 index 0000000000..06fb7fed68 --- /dev/null +++ b/doc/tmp/rubycritic/features/step_definitions/criar_formulario_steps_html.html @@ -0,0 +1,2157 @@ + + + + + + + +criar_formulario_steps.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-06-17 18:58:45 -0300'>2026-06-17 18:58:45 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>features/step_definitions /</small> criar_formulario_steps.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating c big">
+            C
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">99</span><small> lines of codes</small></div>
+            <div><span class="metric">0</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">N/A</span><small> complexity/method</small></div>
+            <div><span class="metric">5</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">93.94</span><small> complexity</small></div>
+            <div><span class="metric">24</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              3
+              smells
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code"># frozen_string_literal: true
+ +

Dado(&#39;que eu estou logado como professor&#39;) do

+ +
departamento = Departamento.find_or_create_by!(nome: &#39;Departamento de Teste&#39;, codigo: &#39;TST&#39;)
+
+@admin = Administrador.find_or_create_by!(email: &#39;professor@teste.com&#39;) do |a|<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="http://docs.seattlerb.org/flay/" target="_blank"><b>DuplicateCode</b></a>        </span>      </div>      <span>Similar code found in 2 nodes</span>              <span>Locations:</span>                  <a href="criar_formulario_steps.html#L6" class="js-smell-location">0</a>                  <a href="responder_formulario_steps.html#L8" class="js-smell-location">1</a>                  </div>  </li></ol>
+  a.nome = &#39;Professor Teste&#39;
+  a.matricula = &#39;prof001&#39;
+  a.senha = &#39;Senha123&#39;
+  a.senha_confirmation = &#39;Senha123&#39;
+  a.departamento = departamento
+end
+
+allow_any_instance_of(ApplicationController).to receive(:current_user).and_return(@admin)
+allow_any_instance_of(AdminController).to receive(:set_admin) do |controller|
+  controller.instance_variable_set(:@admin, @admin)
+end
+ +

end

+ +

Dado(&#39;eu estou na página de criação de formulários&#39;) do<ol class=“nocode errors smells”> <li> <div class=“description”> <div class=“heading”> <span> <i class=“fa fa-warning” aria-hidden=“true”></i> <a href=“docs.seattlerb.org/flog/” target=“_blank”>HighComplexity</a> </span> </div> <span>Dado#eu estou na página de criação de formulários has a flog score of 29</span> </div> </li></ol>

+ +
departamento = Departamento.find_or_create_by!(nome: &#39;Departamento de Teste&#39;, codigo: &#39;TST&#39;)
+
+disciplina = Disciplina.find_or_create_by!(codigo: &#39;CIC0001&#39;) do |d|
+  d.nome = &#39;Engenharia de Software&#39;
+  d.departamento = departamento
+end
+
+@turma = Turma.find_or_create_by!(
+  disciplina: disciplina,
+  numero_da_turma: &#39;01&#39;,
+  semestre: &#39;2026.1&#39;
+) do |t|
+  t.horario = &#39;235M12&#39;
+end
+
+@template = Template.find_or_create_by!(nome: &#39;Avaliação Padrão&#39;, usuario_id: @admin.id) do |t|
+  elemento = t.elementos.build(enunciado: &#39;Como você avalia o professor?&#39;, ordem: 1)
+  elemento.campos.build(
+    tipo_elemento: &#39;Múltipla Escolha&#39;,
+    enunciado: &#39;Ótimo&#39;,
+    ordem: 1
+  )
+  elemento.campos.build(
+    tipo_elemento: &#39;Múltipla Escolha&#39;,
+    enunciado: &#39;Bom&#39;,
+    ordem: 2
+  )
+  elemento.campos.build(
+    tipo_elemento: &#39;Múltipla Escolha&#39;,
+    enunciado: &#39;Regular&#39;,
+    ordem: 3
+  )
+  elemento.campos.build(
+    tipo_elemento: &#39;Múltipla Escolha&#39;,
+    enunciado: &#39;Ruim&#39;,
+    ordem: 4
+  )
+end
+
+visit admin_enviar_formularios_path(@admin)
+ +

end

+ +

Quando(&#39;eu escolho um template para o formulário&#39;) do

+ +
select @template.nome, from: &#39;template_id&#39;
+ +

end

+ +

Quando(&#39;escolho um template para o formulário&#39;) do

+ +
select @template.nome, from: &#39;template_id&#39;
+ +

end

+ +

Quando(&#39;escolho uma turma para enviar o formulário&#39;) do

+ +
check &quot;turma_ids_#{@turma.id}&quot;
+
+ +

end

+ +

Quando(&#39;envio o formulário&#39;) do

+ +
click_button &#39;Criar Formulário&#39;
+ +

end

+ +

Quando(&#39;eu não escolho um template para o formulário&#39;) do

+ +
# deliberately do nothing - leave template select at default blank option
+
+ +

end

+ +

Quando(&#39;eu não escolho uma turma para enviar o formulário&#39;) do

+ +
# deliberately do nothing - leave no turma checkboxes checked
+
+ +

end

+ +

Então(&#39;eu devo ver a mensagem {string}&#39;) do |mensagem|

+ +
expect(page).to have_content(mensagem)
+
+ +

end

+ +

Então(&#39;o formulário deve estar disponível para os alunos da turma selecionada&#39;) do<ol class=“nocode errors smells”> <li> <div class=“description”> <div class=“heading”> <span> <i class=“fa fa-warning” aria-hidden=“true”></i> <a href=“docs.seattlerb.org/flog/” target=“_blank”>HighComplexity</a> </span> </div> <span>Então#o formulário deve estar disponível para os alunos da turma selecionada has a flog score of 26</span> </div> </li></ol>

+ +
formulario = Formulario.find_by(turma: @turma)
+expect(formulario).to be_present
+expect(formulario.titulo).to eq(&quot;#{@turma.disciplina.nome} - #{@turma.semestre}&quot;)
+
+elemento_forms_count = formulario.elemento_forms.count
+template_elementos_count = @template.elementos.count
+expect(elemento_forms_count).to eq(template_elementos_count)
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/features/step_definitions/criar_formulario_template_steps_html.html b/doc/tmp/rubycritic/features/step_definitions/criar_formulario_template_steps_html.html new file mode 100644 index 0000000000..e97ec2d8ac --- /dev/null +++ b/doc/tmp/rubycritic/features/step_definitions/criar_formulario_template_steps_html.html @@ -0,0 +1,2231 @@ + + + + + + + +criar_formulario_template_steps.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-06-17 10:39:37 -0300'>2026-06-17 10:39:37 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>features/step_definitions /</small> criar_formulario_template_steps.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating f big">
+            F
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">158</span><small> lines of codes</small></div>
+            <div><span class="metric">0</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">N/A</span><small> complexity/method</small></div>
+            <div><span class="metric">8</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">214.43</span><small> complexity</small></div>
+            <div><span class="metric">159</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              6
+              smells
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code"># frozen_string_literal: true
+ +

# Step definitions for: Criar formulário baseado em template

+ +

Dado(&#39;que eu estou logado como administrador&#39;) do

+ +
depto = Departamento.find_or_create_by!(nome: &#39;Departamento&#39;, codigo: &#39;TST&#39;)<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="http://docs.seattlerb.org/flay/" target="_blank"><b>DuplicateCode</b></a>        </span>      </div>      <span>Similar code found in 2 nodes</span>              <span>Locations:</span>                  <a href="criar_formulario_template_steps.html#L6" class="js-smell-location">0</a>                  <a href="template_steps.html#L2" class="js-smell-location">1</a>                  </div>  </li></ol>
+
+@admin = Administrador.find_or_create_by!(email: &#39;admin@unb.br&#39;) do |u|
+  u.senha_hash = &#39;123456&#39;
+  u.nome = &#39;Admin&#39;
+  u.matricula = &#39;123456789&#39;
+  u.departamento = depto
+end
+
+allow_any_instance_of(ApplicationController).to receive(:current_user).and_return(@admin)
+
+allow_any_instance_of(AdminController).to receive(:set_admin) do |controller|
+  controller.instance_variable_set(:@admin, @admin)
+end
+ +

end

+ +

Dado(&#39;que existe um template chamado {string} com as seguintes perguntas:&#39;) do |nome_template, table|<ol class=“nocode errors smells”> <li> <div class=“description”> <div class=“heading”> <span> <i class=“fa fa-warning” aria-hidden=“true”></i> <a href=“docs.seattlerb.org/flog/” target=“_blank”>HighComplexity</a> </span> </div> <span>Dado#que existe um template chamado {string} com as seguintes perguntas: has a flog score of 38</span> </div> </li></ol>

+ +
@admin ||= Administrador.first
+
+@template = Template.new(nome: nome_template, administrador: @admin)
+
+table.hashes.each_with_index do |row, index|
+  elemento = @template.elementos.build(enunciado: row[&#39;Pergunta&#39;], ordem: index + 1)
+
+  tipo = row[&#39;Tipo&#39;]
+  opcoes_str = row[&#39;Opções&#39;] || &#39;&#39;
+
+  if tipo == &#39;Texto&#39; || opcoes_str.blank?
+    elemento.campos.build(tipo_elemento: &#39;Texto&#39;, ordem: 1)
+  else
+    opcoes = opcoes_str.split(&#39;,&#39;).map(&amp;:strip)
+    opcoes.each_with_index do |opcao, opt_idx|<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="http://docs.seattlerb.org/flay/" target="_blank"><b>DuplicateCode</b></a>        </span>      </div>      <span>Similar code found in 2 nodes</span>              <span>Locations:</span>                  <a href="criar_formulario_template_steps.html#L37" class="js-smell-location">0</a>                  <a href="template_steps.html#L162" class="js-smell-location">1</a>                  </div>  </li></ol>
+      elemento.campos.build(tipo_elemento: tipo, enunciado: opcao, ordem: opt_idx + 1)
+    end
+  end
+end
+
+@template.save!
+ +

end

+ +

Dado(&#39;que existem as seguintes turmas no semestre {string}:&#39;) do |semestre, table|

+ +
depto = Departamento.find_or_create_by!(nome: &#39;Departamento&#39;, codigo: &#39;TST&#39;)
+
+table.hashes.each do |row|
+  disciplina = Disciplina.find_or_create_by!(codigo: row[&#39;Código&#39;]) do |d|<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="http://docs.seattlerb.org/flay/" target="_blank"><b>DuplicateCode</b></a>        </span>      </div>      <span>Similar code found in 2 nodes</span>              <span>Locations:</span>                  <a href="../../app/services/sigaa_importer.html#L12" class="js-smell-location">0</a>                  <a href="criar_formulario_template_steps.html#L50" class="js-smell-location">1</a>                  </div>  </li></ol>
+    d.nome = row[&#39;Disciplina&#39;]
+    d.departamento = depto
+  end
+
+  Turma.find_or_create_by!(
+    disciplina: disciplina,
+    numero_da_turma: row[&#39;Turma&#39;],
+    semestre: semestre
+  ) do |t|
+    t.horario = &#39;Seg 08:00-10:00&#39;
+  end
+end
+
+@turmas_disponiveis = Turma.where(semestre: semestre)
+ +

end

+ +

Quando(&#39;eu acesso a página de criação de formulário a partir de template&#39;) do

+ +
visit admin_enviar_formularios_path(@admin)
+
+ +

end

+ +

Quando(&#39;eu seleciono o template {string}&#39;) do |nome_template|

+ +
select nome_template, from: &#39;template_id&#39;
+ +

end

+ +

Quando(&#39;eu não seleciono nenhum template&#39;) do

+ +
# Garante que o campo de template permanece em branco
+select &#39;Template&#39;, from: &#39;template_id&#39;
+ +

end

+ +

Quando(&#39;eu seleciono as turmas {string}&#39;) do |turma_info|

+ +
partes = turma_info.split(&#39; - &#39;)<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="http://docs.seattlerb.org/flay/" target="_blank"><b>DuplicateCode</b></a>        </span>      </div>      <span>Identical code found in 2 nodes</span>              <span>Locations:</span>                  <a href="criar_formulario_template_steps.html#L81" class="js-smell-location">0</a>                  <a href="criar_formulario_template_steps.html#L93" class="js-smell-location">1</a>                  </div>  </li></ol>
+codigo = partes[0]
+nome_disciplina = partes[1]
+numero_turma = partes[2]
+
+disciplina = Disciplina.find_by!(codigo: codigo, nome: nome_disciplina)
+turma = Turma.find_by!(disciplina: disciplina, numero_da_turma: numero_turma)
+check &quot;turma_ids_#{turma.id}&quot;
+ +

end

+ +

Quando(&#39;eu seleciono as turmas {string} e {string}&#39;) do |turma1_info, turma2_info|

+ +
[ turma1_info, turma2_info ].each do |turma_info|
+  partes = turma_info.split(&#39; - &#39;)<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="http://docs.seattlerb.org/flay/" target="_blank"><b>DuplicateCode</b></a>        </span>      </div>      <span>Identical code found in 2 nodes</span>              <span>Locations:</span>                  <a href="criar_formulario_template_steps.html#L81" class="js-smell-location">0</a>                  <a href="criar_formulario_template_steps.html#L93" class="js-smell-location">1</a>                  </div>  </li></ol>
+  codigo = partes[0]
+  nome_disciplina = partes[1]
+  numero_turma = partes[2]
+
+  disciplina = Disciplina.find_by!(codigo: codigo, nome: nome_disciplina)
+  turma = Turma.find_by!(disciplina: disciplina, numero_da_turma: numero_turma)
+  check &quot;turma_ids_#{turma.id}&quot;
+end
+ +

end

+ +

Quando(&#39;eu clico em {string}&#39;) do |botao|

+ +
click_button botao
+
+ +

end

+ +

Quando(&#39;eu não seleciono nenhuma turma&#39;) do

+ +
# Nenhum checkbox marcado — ação implícita
+
+ +

end

+ +

Então(&#39;o formulário deve conter as perguntas do template {string}&#39;) do |nome_template|<ol class=“nocode errors smells”> <li> <div class=“description”> <div class=“heading”> <span> <i class=“fa fa-warning” aria-hidden=“true”></i> <a href=“docs.seattlerb.org/flog/” target=“_blank”>HighComplexity</a> </span> </div> <span>Então#o formulário deve conter as perguntas do template {string} has a flog score of 33</span> </div> </li></ol>

+ +
template = Template.find_by!(nome: nome_template)
+formulario = Formulario.last
+expect(formulario.elemento_forms.count).to eq(template.elementos.count)
+formulario.elemento_forms.order(:ordem).each_with_index do |ef, i|
+  expect(ef.enunciado).to eq(template.elementos.order(:ordem)[i].enunciado)
+end
+
+ +

end

+ +

Então(&#39;o formulário deve estar associado à turma {string}&#39;) do |nome_turma_info|

+ +
partes = nome_turma_info.split(&#39; - &#39;)
+nome_disciplina = partes[0]
+numero_turma = partes[1]
+
+disciplina = Disciplina.find_by!(nome: nome_disciplina)
+turma = Turma.find_by!(disciplina: disciplina, numero_da_turma: numero_turma)
+expect(Formulario.last.turma).to eq(turma)
+ +

end

+ +

Então(&#39;deve existir um formulário para a turma {string}&#39;) do |nome_turma_info|

+ +
partes = nome_turma_info.split(&#39; - &#39;)
+nome_disciplina = partes[0]
+numero_turma = partes[1]
+
+disciplina = Disciplina.find_by!(nome: nome_disciplina)
+turma = Turma.find_by!(disciplina: disciplina, numero_da_turma: numero_turma)
+expect(Formulario.exists?(turma: turma)).to be true
+ +

end

+ +

Então(&#39;cada formulário deve conter as perguntas do template {string}&#39;) do |nome_template|

+ +
template = Template.find_by!(nome: nome_template)
+Formulario.all.each do |formulario|
+  expect(formulario.elemento_forms.count).to eq(template.elementos.count)
+end
+
+ +

end

+ +

Então(&#39;eu devo ver a lista de templates disponíveis&#39;) do

+ +
Template.all.each do |template|
+  expect(page).to have_content(template.nome)
+end
+
+ +

end

+ +

Então(&#39;eu devo ver a lista de turmas do semestre {string} disponíveis&#39;) do |semestre|

+ +
Turma.where(semestre: semestre).each do |turma|
+  expect(page).to have_content(turma.disciplina.nome)
+end
+
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/features/step_definitions/exportar_csv_steps_html.html b/doc/tmp/rubycritic/features/step_definitions/exportar_csv_steps_html.html new file mode 100644 index 0000000000..fbd25fb030 --- /dev/null +++ b/doc/tmp/rubycritic/features/step_definitions/exportar_csv_steps_html.html @@ -0,0 +1,2263 @@ + + + + + + + +exportar_csv_steps.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-06-17 10:47:15 -0300'>2026-06-17 10:47:15 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>features/step_definitions /</small> exportar_csv_steps.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating d big">
+            D
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">204</span><small> lines of codes</small></div>
+            <div><span class="metric">0</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">N/A</span><small> complexity/method</small></div>
+            <div><span class="metric">4</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">218.47</span><small> complexity</small></div>
+            <div><span class="metric">0</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              4
+              smells
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code"># encoding: UTF-8
+ +

require &#39;csv&#39;

+ +

Dado(&quot;que estou na página de Resultados&quot;) do

+ +
@departamento = Departamento.create!(
+  codigo: &quot;DEP01&quot;,
+  nome:   &quot;Departamento de Computação&quot;
+)
+
+@admin = Administrador.create!(
+  matricula:    &quot;ADM001&quot;,
+  nome:         &quot;Admin Teste&quot;,
+  email:        &quot;admin@teste.com&quot;,
+  departamento: @departamento
+)
+
+# Reutiliza o step de login já existente nos steps de autenticação
+step &#39;que meu usuário está cadastrado com o email &quot;admin@teste.com&quot; e senha &quot;senha123&quot;&#39;
+step &#39;eu tento realizar o login com o email &quot;admin@teste.com&quot; e a senha &quot;senha123&quot;&#39;
+
+visit admin_resultados_path(@admin)
+ +

end

+ +

Dado(&quot;vejo os formulários enviados para todas as turmas do meu departamento&quot;) do

+ +
expect(page).to have_current_path(admin_resultados_path(@admin))
+
+ +

end

+ +

Dado(&quot;existe a {string} de {string} que possui um formulário associado a ela&quot;) do |nome_turma, nome_disciplina|

+ +
@disciplina = Disciplina.create!(
+  codigo:      &quot;ED001&quot;,
+  nome:        nome_disciplina,
+  departamento: @departamento
+)
+
+@turma = Turma.create!(
+  numero_da_turma: nome_turma,
+  semestre:        &quot;2024.1&quot;,
+  horario:         &quot;SEG 08:00-10:00&quot;,
+  disciplina:      @disciplina
+)
+
+@formulario = Formulario.create!(turma: @turma)
+
+@elemento1 = ElementoForm.create!(
+  ordem:       1,
+  enunciado:   &quot;Como você avalia o professor?&quot;,
+  formulario:  @formulario
+)
+
+@elemento2 = ElementoForm.create!(
+  ordem:       2,
+  enunciado:   &quot;Como você avalia a disciplina?&quot;,
+  formulario:  @formulario
+)
+ +

end

+ +

Dado(&quot;este formulário já possui respostas enviadas pelos alunos&quot;) do<ol class=“nocode errors smells”> <li> <div class=“description”> <div class=“heading”> <span> <i class=“fa fa-warning” aria-hidden=“true”></i> <a href=“docs.seattlerb.org/flog/” target=“_blank”>HighComplexity</a> </span> </div> <span>Dado#este formulário já possui respostas enviadas pelos alunos has a flog score of 36</span> </div> </li></ol>

+ +
@curso_aluno = Curso.create!(
+  codigo:       &quot;CC01&quot;,
+  nome:         &quot;Ciência da Computação&quot;,
+  departamento: @departamento
+)
+
+@aluno = Discente.create!(
+  matricula:    &quot;ALU001&quot;,
+  nome:         &quot;Aluno Teste&quot;,
+  email:        &quot;aluno@teste.com&quot;,
+  curso:        @curso_aluno,
+  departamento: @departamento
+)
+
+@resposta = RespostaForm.create!(
+  formulario:     @formulario,
+  usuario:        @aluno,
+  data_submissao: Date.today
+)
+
+@template = Template.new(nome: &quot;Template Padrão&quot;, administrador: @admin)
+elemento_base = @template.elementos.build(ordem: 1, enunciado: &quot;Avaliação&quot;)
+elemento_base.campos.build(ordem: 1, enunciado: &quot;Muito bom&quot;,  tipo_elemento: &quot;Múltipla Escolha&quot;)
+elemento_base.campos.build(ordem: 2, enunciado: &quot;Excelente&quot;,  tipo_elemento: &quot;Múltipla Escolha&quot;)
+@template.save!
+
+[ @elemento1, @elemento2 ].each do |ef|
+  elemento_base.campos.each do |campo_base|
+    CampoForm.find_or_create_by!(enunciado: campo_base.enunciado, elemento_form: ef) do |cf|
+      cf.ordem = campo_base.ordem
+    end
+  end
+end
+
+{
+  @elemento1 =&gt; &quot;Muito bom&quot;,
+  @elemento2 =&gt; &quot;Excelente&quot;
+}.each do |ef, texto|
+  cf = ef.campo_forms.find_by!(enunciado: texto)
+
+  RespostaElem.create!(
+    texto_resposta: texto,
+    resposta_form:  @resposta,
+    elemento_form:  ef,
+    campo_form:     cf
+  )
+end
+
+visit admin_resultados_path(@admin)
+ +

end

+ +

# Happy Path

+ +

Quando(&quot;eu sigo {string}&quot;) do |link|

+ +
formulario_alvo = defined?(@formulario_vazio) ? @formulario_vazio : @formulario
+find(:link, link, href: /#{formulario_alvo.id}/).click
+
+ +

end

+ +

Então(&quot;o download do arquivo {string} é iniciado&quot;) do |_nome_ignorado|<ol class=“nocode errors smells”> <li> <div class=“description”> <div class=“heading”> <span> <i class=“fa fa-warning” aria-hidden=“true”></i> <a href=“docs.seattlerb.org/flog/” target=“_blank”>HighComplexity</a> </span> </div> <span>Então#o download do arquivo {string} é iniciado has a flog score of 32</span> </div> </li></ol>

+ +
num_turma    = @formulario.turma.numero_da_turma.parameterize(separator: &#39;_&#39;)
+nome_materia = @formulario.turma.disciplina.nome.parameterize(separator: &#39;_&#39;)
+nome_esperado = &quot;formulario_#{@formulario.id}_turma_#{num_turma}_#{nome_materia}&quot;
+
+content_disposition = page.response_headers[&quot;Content-Disposition&quot;]
+
+expect(content_disposition).to be_present,
+  &quot;Esperava um header Content-Disposition indicando download, mas não havia nenhum.&quot;
+
+expect(content_disposition).to include(&quot;attachment&quot;),
+  &quot;Esperava &#39;attachment&#39; no Content-Disposition, mas foi: #{content_disposition}&quot;
+
+expect(content_disposition).to include(nome_esperado),
+  &quot;Esperava &#39;#{nome_esperado}&#39; no nome do arquivo, &quot; \
+  &quot;mas o header foi: #{content_disposition}&quot;
+ +

end

+ +

Então(&quot;o arquivo deve conter as colunas Usuário da Resposta, Data de Submissão e elementos do formulário&quot;) do<ol class=“nocode errors smells”> <li> <div class=“description”> <div class=“heading”> <span> <i class=“fa fa-warning” aria-hidden=“true”></i> <a href=“docs.seattlerb.org/flog/” target=“_blank”>HighComplexity</a> </span> </div> <span>Então#o arquivo deve conter as colunas Usuário da Resposta, Data de Submissão e elementos do formulário has a flog score of 37</span> </div> </li></ol>

+ +
csv_content = CSV.parse(page.body)
+cabecalho   = csv_content.first
+
+expect(cabecalho).to include(&quot;Usuário da Resposta&quot;),
+  &quot;Esperava a coluna &#39;Usuário da Resposta&#39; no cabeçalho, mas foi: #{cabecalho.inspect}&quot;
+
+expect(cabecalho).to include(&quot;Data de Submissão&quot;),
+  &quot;Esperava a coluna &#39;Data de Submissão&#39; no cabeçalho, mas foi: #{cabecalho.inspect}&quot;
+
+ElementoForm.where(formulario_id: @formulario.id).order(:ordem).each do |elem|
+  expect(cabecalho).to include(elem.enunciado),
+    &quot;Esperava a coluna &#39;#{elem.enunciado}&#39; no cabeçalho, mas foi: #{cabecalho.inspect}&quot;
+end
+ +

end

+ +

Então(&quot;o arquivo deve conter como linhas as respostas de cada usuário&quot;) do<ol class=“nocode errors smells”> <li> <div class=“description”> <div class=“heading”> <span> <i class=“fa fa-warning” aria-hidden=“true”></i> <a href=“docs.seattlerb.org/flog/” target=“_blank”>HighComplexity</a> </span> </div> <span>Então#o arquivo deve conter como linhas as respostas de cada usuário has a flog score of 39</span> </div> </li></ol>

+ +
csv_content = CSV.parse(page.body)
+
+linhas_de_dados = csv_content[1..]
+
+expect(linhas_de_dados).not_to be_empty,
+  &quot;Esperava pelo menos uma linha de dados no CSV, mas o arquivo só possui o cabeçalho.&quot;
+
+nomes_nas_linhas = linhas_de_dados.map(&amp;:first)
+expect(nomes_nas_linhas).to include(@aluno.nome),
+  &quot;Esperava encontrar &#39;#{@aluno.nome}&#39; nas linhas de dados, mas encontrei: #{nomes_nas_linhas.inspect}&quot;
+
+RespostaElem.where(resposta_form_id: @resposta.id).each do |re|
+  conteudo_csv = linhas_de_dados.flatten
+  expect(conteudo_csv).to include(re.texto_resposta),
+    &quot;Esperava encontrar a resposta &#39;#{re.texto_resposta}&#39; no CSV.&quot;
+end
+ +

end

+ +

# Sad Path

+ +

Dado(&quot;que a {string} possui outro formulário&quot;) do |nome_turma|

+ +
@turma_sad = Turma.find_by(numero_da_turma: nome_turma) || @turma
+
+@formulario_vazio = Formulario.create!(turma: @turma_sad)
+
+ElementoForm.create!(
+  ordem:      1,
+  enunciado:  &quot;Pergunta sem respostas&quot;,
+  formulario: @formulario_vazio
+)
+ +

end

+ +

Dado(&quot;este formulário não recebeu nenhuma resposta até o momento&quot;) do

+ +
expect(
+  RespostaForm.where(formulario_id: @formulario_vazio.id).count
+).to eq(0), &quot;Esperava 0 respostas para o formulário vazio, mas havia algumas.&quot;
+
+visit admin_resultados_path(@admin)
+ +

end

+ +

Então(&quot;vejo a mensagem de erro {string}&quot;) do |mensagem_esperada|

+ +
expect(page).to have_content(mensagem_esperada),
+  &quot;Esperava ver &#39;#{mensagem_esperada}&#39; na página, mas não encontrei.&quot;
+ +

end

+ +

Então(&quot;nenhum download de arquivo é iniciado&quot;) do

+ +
content_disposition = page.response_headers[&quot;Content-Disposition&quot;]
+
+expect(content_disposition).to be_nil.or(
+  satisfy { |cd| !cd.to_s.include?(&quot;attachment&quot;) }
+), &quot;Não esperava um header de download &#39;attachment&#39;, mas encontrei: #{content_disposition}&quot;
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/features/step_definitions/importar_dados_sigaa_steps_html.html b/doc/tmp/rubycritic/features/step_definitions/importar_dados_sigaa_steps_html.html new file mode 100644 index 0000000000..97e1f909b9 --- /dev/null +++ b/doc/tmp/rubycritic/features/step_definitions/importar_dados_sigaa_steps_html.html @@ -0,0 +1,2102 @@ + + + + + + + +importar_dados_sigaa_steps.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-06-17 10:39:37 -0300'>2026-06-17 10:39:37 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>features/step_definitions /</small> importar_dados_sigaa_steps.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating d big">
+            D
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">48</span><small> lines of codes</small></div>
+            <div><span class="metric">0</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">N/A</span><small> complexity/method</small></div>
+            <div><span class="metric">6</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">102.85</span><small> complexity</small></div>
+            <div><span class="metric">144</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              1
+              smell
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code">
+ +

Dado(&#39;que os dados do SIGAA estão disponíveis para importação&#39;) do

+ +
# Por padrão, o SigaaImporter importará os dados do arquivo JSON enviado, então não é necessário configurar nada aqui.
+
+ +

end

+ +

Dado(&#39;que os dados do SIGAA foram importados com sucesso&#39;) do<ol class=“nocode errors smells”> <li> <div class=“description”> <div class=“heading”> <span> <i class=“fa fa-warning” aria-hidden=“true”></i> <a href=“docs.seattlerb.org/flay/” target=“_blank”>DuplicateCode</a> </span> </div> <span>Similar code found in 8 nodes</span> <span>Locations:</span> <a href=“atualizar_dados_sigaa_steps.html#L3” class=“js-smell-location”>0</a> <a href=“atualizar_dados_sigaa_steps.html#L10” class=“js-smell-location”>1</a> <a href=“atualizar_dados_sigaa_steps.html#L17” class=“js-smell-location”>2</a> <a href=“atualizar_dados_sigaa_steps.html#L24” class=“js-smell-location”>3</a> <a href=“importar_dados_sigaa_steps.html#L6” class=“js-smell-location”>4</a> <a href=“importar_dados_sigaa_steps.html#L13” class=“js-smell-location”>5</a> <a href=“importar_dados_sigaa_steps.html#L20” class=“js-smell-location”>6</a> <a href=“importar_dados_sigaa_steps.html#L27” class=“js-smell-location”>7</a> </div> </li></ol>

+ +
allow(SigaaImporter).to receive(:import_from_files).and_return(&quot;importação realizada com sucesso&quot;)
+arquivo = Rack::Test::UploadedFile.new(Rails.root.join(&quot;classes.json&quot;), &quot;application/json&quot;)
+page.driver.post(admin_sincronizar_sigaa_path(@admin), { acao: &#39;importar&#39;, arquivo_classes: arquivo, arquivo_membros: arquivo })
+visit admin_gerenciamento_path(@admin)
+ +

end

+ +

Dado(&#39;que eu tentei importar os dados do SIGAA mas ocorreu um erro&#39;) do<ol class=“nocode errors smells”> <li> <div class=“description”> <div class=“heading”> <span> <i class=“fa fa-warning” aria-hidden=“true”></i> <a href=“docs.seattlerb.org/flay/” target=“_blank”>DuplicateCode</a> </span> </div> <span>Similar code found in 8 nodes</span> <span>Locations:</span> <a href=“atualizar_dados_sigaa_steps.html#L3” class=“js-smell-location”>0</a> <a href=“atualizar_dados_sigaa_steps.html#L10” class=“js-smell-location”>1</a> <a href=“atualizar_dados_sigaa_steps.html#L17” class=“js-smell-location”>2</a> <a href=“atualizar_dados_sigaa_steps.html#L24” class=“js-smell-location”>3</a> <a href=“importar_dados_sigaa_steps.html#L6” class=“js-smell-location”>4</a> <a href=“importar_dados_sigaa_steps.html#L13” class=“js-smell-location”>5</a> <a href=“importar_dados_sigaa_steps.html#L20” class=“js-smell-location”>6</a> <a href=“importar_dados_sigaa_steps.html#L27” class=“js-smell-location”>7</a> </div> </li></ol>

+ +
allow(SigaaImporter).to receive(:import_from_files).and_return(&quot;a importação falhou&quot;)
+arquivo = Rack::Test::UploadedFile.new(Rails.root.join(&quot;classes.json&quot;), &quot;application/json&quot;)
+page.driver.post(admin_sincronizar_sigaa_path(@admin), { acao: &#39;importar&#39;, arquivo_classes: arquivo, arquivo_membros: arquivo })
+visit admin_gerenciamento_path(@admin)
+ +

end

+ +

Dado(&#39;que os dados do SIGAA já existem na base de dados do sistema&#39;) do<ol class=“nocode errors smells”> <li> <div class=“description”> <div class=“heading”> <span> <i class=“fa fa-warning” aria-hidden=“true”></i> <a href=“docs.seattlerb.org/flay/” target=“_blank”>DuplicateCode</a> </span> </div> <span>Similar code found in 8 nodes</span> <span>Locations:</span> <a href=“atualizar_dados_sigaa_steps.html#L3” class=“js-smell-location”>0</a> <a href=“atualizar_dados_sigaa_steps.html#L10” class=“js-smell-location”>1</a> <a href=“atualizar_dados_sigaa_steps.html#L17” class=“js-smell-location”>2</a> <a href=“atualizar_dados_sigaa_steps.html#L24” class=“js-smell-location”>3</a> <a href=“importar_dados_sigaa_steps.html#L6” class=“js-smell-location”>4</a> <a href=“importar_dados_sigaa_steps.html#L13” class=“js-smell-location”>5</a> <a href=“importar_dados_sigaa_steps.html#L20” class=“js-smell-location”>6</a> <a href=“importar_dados_sigaa_steps.html#L27” class=“js-smell-location”>7</a> </div> </li></ol>

+ +
allow(SigaaImporter).to receive(:import_from_files).and_return(&quot;os dados já existem e não foram duplicados&quot;)
+arquivo = Rack::Test::UploadedFile.new(Rails.root.join(&quot;classes.json&quot;), &quot;application/json&quot;)
+page.driver.post(admin_sincronizar_sigaa_path(@admin), { acao: &#39;importar&#39;, arquivo_classes: arquivo, arquivo_membros: arquivo })
+visit admin_gerenciamento_path(@admin)
+ +

end

+ +

Dado(&#39;que alguns dados do SIGAA já existem na base de dados do sistema&#39;) do<ol class=“nocode errors smells”> <li> <div class=“description”> <div class=“heading”> <span> <i class=“fa fa-warning” aria-hidden=“true”></i> <a href=“docs.seattlerb.org/flay/” target=“_blank”>DuplicateCode</a> </span> </div> <span>Similar code found in 8 nodes</span> <span>Locations:</span> <a href=“atualizar_dados_sigaa_steps.html#L3” class=“js-smell-location”>0</a> <a href=“atualizar_dados_sigaa_steps.html#L10” class=“js-smell-location”>1</a> <a href=“atualizar_dados_sigaa_steps.html#L17” class=“js-smell-location”>2</a> <a href=“atualizar_dados_sigaa_steps.html#L24” class=“js-smell-location”>3</a> <a href=“importar_dados_sigaa_steps.html#L6” class=“js-smell-location”>4</a> <a href=“importar_dados_sigaa_steps.html#L13” class=“js-smell-location”>5</a> <a href=“importar_dados_sigaa_steps.html#L20” class=“js-smell-location”>6</a> <a href=“importar_dados_sigaa_steps.html#L27” class=“js-smell-location”>7</a> </div> </li></ol>

+ +
allow(SigaaImporter).to receive(:import_from_files).and_return(&quot;alguns dados já foram importados e não serão importados novamente&quot;)
+arquivo = Rack::Test::UploadedFile.new(Rails.root.join(&quot;classes.json&quot;), &quot;application/json&quot;)
+page.driver.post(admin_sincronizar_sigaa_path(@admin), { acao: &#39;importar&#39;, arquivo_classes: arquivo, arquivo_membros: arquivo })
+visit admin_gerenciamento_path(@admin)
+ +

end

+ +

Então(&#39;as turmas, matérias e participantes do SIGAA estão presentes no sistema&#39;) do

+ +
expect(page).to have_content(&#39;As turmas, matérias e participantes do SIGAA estão presentes no sistema&#39;)
+ +

end

+ +

Então(&#39;uma mensagem de erro é exibida informando que a importação falhou&#39;) do

+ +
expect(page).to have_content(&#39;erro informando que a importação falhou&#39;)
+ +

end

+ +

Então(&#39;uma mensagem é exibida informando que os dados já foram importados e não serão importados novamente&#39;) do

+ +
expect(page).to have_content(&#39;os dados do SIGAA já existem na base de dados do sistema e não serão importados novamente&#39;)
+ +

end

+ +

Então(&#39;uma mensagem é exibida informando que alguns dados já foram importados e não serão importados novamente, mas os dados restantes serão importados com sucesso&#39;) do

+ +
expect(page).to have_content(&#39;alguns dados já foram importados e não serão importados novamente, mas os dados restantes serão importados com sucesso&#39;)
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/features/step_definitions/login_steps_html.html b/doc/tmp/rubycritic/features/step_definitions/login_steps_html.html new file mode 100644 index 0000000000..a96e92792e --- /dev/null +++ b/doc/tmp/rubycritic/features/step_definitions/login_steps_html.html @@ -0,0 +1,2139 @@ + + + + + + + +login_steps.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-06-16 22:11:51 -0300'>2026-06-16 22:11:51 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>features/step_definitions /</small> login_steps.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating b big">
+            B
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">75</span><small> lines of codes</small></div>
+            <div><span class="metric">0</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">N/A</span><small> complexity/method</small></div>
+            <div><span class="metric">6</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">73.34</span><small> complexity</small></div>
+            <div><span class="metric">38</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              1
+              smell
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code">Dado(&#39;eu estou na página de login&#39;) do
+visit root_path
+ +

end

+ +

Dado(&#39;que meu usuário está cadastrado com o email {string}&#39;) do |email|

+ +
Usuario.find_or_create_by!(email: email) do |u|
+  u.matricula = &quot;#{rand(100000..999999)}&quot;
+  u.nome = &quot;Usuário Teste&quot;
+end
+ +

end

+ +

Dado(&#39;que meu email {string} não está cadastrado no sistema&#39;) do |email|

+ +
Usuario.where(email: email).delete_all
+
+ +

end

+ +

Dado(&#39;que meu usuário está cadastrado com o email {string} e senha {string}&#39;) do |email, senha|

+ +
usuario = Usuario.find_or_initialize_by(email: email)
+usuario.matricula ||= &quot;#{rand(100000..999999)}&quot;
+usuario.nome ||= &quot;Usuário Teste&quot;
+usuario.senha = senha
+usuario.senha_confirmation = senha
+usuario.save!
+ +

end

+ +

Dado(&#39;que minha matrícula {string} está cadastrada no sistema e senha {string}&#39;) do |matricula, senha|

+ +
usuario = Usuario.find_or_initialize_by(matricula: matricula)
+usuario.email ||= &quot;#{matricula}@teste.com&quot;
+usuario.nome ||= &quot;Usuário Teste&quot;
+usuario.senha = senha
+usuario.senha_confirmation = senha
+usuario.save!
+ +

end

+ +

Dado(&#39;que minha senha para {string} não está definida&#39;) do |email|

+ +
usuario = Usuario.find_by!(email: email)
+usuario.update!(senha_hash: nil)
+
+ +

end

+ +

Quando(&#39;eu tento realizar o login com o email {string} e a senha {string}&#39;) do |email_usuario, senha_usuario|<ol class=“nocode errors smells”> <li> <div class=“description”> <div class=“heading”> <span> <i class=“fa fa-warning” aria-hidden=“true”></i> <a href=“docs.seattlerb.org/flay/” target=“_blank”>DuplicateCode</a> </span> </div> <span>Similar code found in 2 nodes</span> <span>Locations:</span> <a href=“login_steps.html#L39” class=“js-smell-location”>0</a> <a href=“login_steps.html#L46” class=“js-smell-location”>1</a> </div> </li></ol>

+ +
visit root_path
+fill_in &quot;login&quot;, with: email_usuario
+fill_in &quot;senha&quot;, with: senha_usuario
+click_button &quot;Entrar&quot;
+ +

end

+ +

Quando(&#39;eu tento realizar o login com matrícula {string} e a senha {string}&#39;) do |matricula_usuario, senha_usuario|<ol class=“nocode errors smells”> <li> <div class=“description”> <div class=“heading”> <span> <i class=“fa fa-warning” aria-hidden=“true”></i> <a href=“docs.seattlerb.org/flay/” target=“_blank”>DuplicateCode</a> </span> </div> <span>Similar code found in 2 nodes</span> <span>Locations:</span> <a href=“login_steps.html#L39” class=“js-smell-location”>0</a> <a href=“login_steps.html#L46” class=“js-smell-location”>1</a> </div> </li></ol>

+ +
visit root_path
+fill_in &quot;login&quot;, with: matricula_usuario
+fill_in &quot;senha&quot;, with: senha_usuario
+click_button &quot;Entrar&quot;
+ +

end

+ +

Quando(&#39;eu tento realizar o login sem informar meu email ou matrícula e com senha {string}&#39;) do |senha_usuario|

+ +
visit root_path
+fill_in &quot;senha&quot;, with: senha_usuario
+click_button &quot;Entrar&quot;
+ +

end

+ +

Quando(&#39;eu tento realizar o login com email {string} sem informar minha senha&#39;) do |email_usuario|

+ +
visit root_path
+fill_in &quot;login&quot;, with: email_usuario
+click_button &quot;Entrar&quot;
+ +

end

+ +

Então(&#39;vejo a mensagem {string}&#39;) do |string|

+ +
expect(page).to have_content(string)
+
+ +

end

+ +

Então(&#39;permaneço na página de login&#39;) do

+ +
expect(page).to have_current_path(root_path)
+
+ +

end

+ +

Então(&#39;sou direcionado para a página inicial&#39;) do

+ +
expect(page).to have_current_path(/\/(admin\/\d+|usuarios\/\d+)\/avaliacoes/)
+
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/features/step_definitions/responder_formulario_steps_html.html b/doc/tmp/rubycritic/features/step_definitions/responder_formulario_steps_html.html new file mode 100644 index 0000000000..30f58f2b5f --- /dev/null +++ b/doc/tmp/rubycritic/features/step_definitions/responder_formulario_steps_html.html @@ -0,0 +1,2164 @@ + + + + + + + +responder_formulario_steps.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-06-17 10:39:37 -0300'>2026-06-17 10:39:37 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>features/step_definitions /</small> responder_formulario_steps.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating c big">
+            C
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">107</span><small> lines of codes</small></div>
+            <div><span class="metric">0</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">N/A</span><small> complexity/method</small></div>
+            <div><span class="metric">5</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">131.19</span><small> complexity</small></div>
+            <div><span class="metric">56</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              3
+              smells
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code">Dado(&#39;que eu estou logado como discente&#39;) do
+depto = Departamento.find_or_create_by!(nome: &#39;Departamento&#39;, codigo: &#39;TST&#39;)
+curso = Curso.find_or_create_by!(codigo: &#39;TST&#39;) do |c|
+  c.nome = &#39;Curso Teste&#39;
+  c.departamento = depto
+end
+
+@discente = Discente.find_or_create_by!(matricula: &#39;2024001&#39;) do |u|<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="http://docs.seattlerb.org/flay/" target="_blank"><b>DuplicateCode</b></a>        </span>      </div>      <span>Similar code found in 2 nodes</span>              <span>Locations:</span>                  <a href="criar_formulario_steps.html#L6" class="js-smell-location">0</a>                  <a href="responder_formulario_steps.html#L8" class="js-smell-location">1</a>                  </div>  </li></ol>
+  u.nome = &#39;Discente Teste&#39;
+  u.email = &#39;discente@teste.com&#39;
+  u.senha = &#39;Senha123&#39;
+  u.senha_confirmation = &#39;Senha123&#39;
+  u.curso = curso
+end
+
+allow_any_instance_of(ApplicationController).to receive(:current_user).and_return(@discente)
+ +

end

+ +

Dado(&#39;existe um formulário ativo para minha turma&#39;) do<ol class=“nocode errors smells”> <li> <div class=“description”> <div class=“heading”> <span> <i class=“fa fa-warning” aria-hidden=“true”></i> <a href=“docs.seattlerb.org/flog/” target=“_blank”>HighComplexity</a> </span> </div> <span>Dado#existe um formulário ativo para minha turma has a flog score of 41</span> </div> </li></ol>

+ +
depto = Departamento.find_or_create_by!(nome: &#39;Departamento&#39;, codigo: &#39;TST&#39;)
+disciplina = Disciplina.find_or_create_by!(codigo: &#39;CIC0001&#39;) do |d|
+  d.nome = &#39;Engenharia de Software&#39;
+  d.departamento = depto
+end
+
+turma = Turma.find_or_create_by!(
+  disciplina: disciplina,
+  numero_da_turma: &#39;01&#39;,
+  semestre: &#39;2026.1&#39;
+) do |t|
+  t.horario = &#39;235M12&#39;
+end
+
+@discente.turmas &lt;&lt; turma unless @discente.turmas.include?(turma)
+
+@formulario = Formulario.find_or_create_by!(turma: turma) do |f|
+  f.titulo = &#39;Avaliação de Turma 2026.1&#39;
+end
+
+elemento = @formulario.elemento_forms.find_or_create_by!(ordem: 1) do |ef|<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="http://docs.seattlerb.org/flay/" target="_blank"><b>DuplicateCode</b></a>        </span>      </div>      <span>Similar code found in 2 nodes</span>              <span>Locations:</span>                  <a href="responder_formulario_steps.html#L40" class="js-smell-location">0</a>                  <a href="responder_formulario_steps.html#L50" class="js-smell-location">1</a>                  </div>  </li></ol>
+  ef.enunciado = &#39;Como você avalia o professor?&#39;
+  ef.tipo = &#39;Múltipla Escolha&#39;
+end
+
+elemento.campo_forms.find_or_create_by!(ordem: 1) { |c| c.enunciado = &#39;Ótimo&#39; }
+elemento.campo_forms.find_or_create_by!(ordem: 2) { |c| c.enunciado = &#39;Bom&#39; }
+elemento.campo_forms.find_or_create_by!(ordem: 3) { |c| c.enunciado = &#39;Regular&#39; }
+elemento.campo_forms.find_or_create_by!(ordem: 4) { |c| c.enunciado = &#39;Ruim&#39; }
+
+elemento2 = @formulario.elemento_forms.find_or_create_by!(ordem: 2) do |ef|<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="http://docs.seattlerb.org/flay/" target="_blank"><b>DuplicateCode</b></a>        </span>      </div>      <span>Similar code found in 2 nodes</span>              <span>Locations:</span>                  <a href="responder_formulario_steps.html#L40" class="js-smell-location">0</a>                  <a href="responder_formulario_steps.html#L50" class="js-smell-location">1</a>                  </div>  </li></ol>
+  ef.enunciado = &#39;Comente sobre a didática&#39;
+  ef.tipo = &#39;Texto&#39;
+end
+
+elemento2.campo_forms.find_or_create_by!(ordem: 1)
+ +

end

+ +

Dado(&#39;eu estou na página de formulários disponíveis&#39;) do

+ +
visit usuarios_avaliacoes_path(@discente)
+
+ +

end

+ +

Quando(&#39;eu clico para responder o formulário&#39;) do

+ +
click_link @formulario.turma.disciplina.nome
+
+ +

end

+ +

Então(&#39;eu devo visualizar os detalhes e perguntas pertinentes a ele&#39;) do

+ +
@formulario.elemento_forms.each do |ef|
+  expect(page).to have_content(ef.enunciado)
+end
+
+ +

end

+ +

Quando(&#39;eu respondo todos os campos do formulário&#39;) do

+ +
@formulario.elemento_forms.order(:ordem).each do |ef|
+  if ef.tipo == &#39;Texto&#39;
+    fill_in &quot;respostas[#{ef.id}]&quot;, with: &#39;Uma resposta qualquer&#39;
+  else
+    primeiro_campo = ef.campo_forms.order(:ordem).first
+    find(&quot;input[type=&#39;radio&#39;][name=&#39;respostas[#{ef.id}]&#39;][value=&#39;#{primeiro_campo.id}&#39;]&quot;).click
+  end
+end
+ +

end

+ +

Quando(&#39;eu envio o fomulário&#39;) do

+ +
click_button type: &#39;submit&#39;
+ +

end

+ +

Quando(&#39;eu envio o formulário&#39;) do

+ +
click_button type: &#39;submit&#39;
+ +

end

+ +

# Então(&#39;eu devo ver a mensagem {string}&#39;) do |mensagem| # expect(page).to have_content(mensagem) # end

+ +

Então(&#39;a resposta deve ser registrada no sistema&#39;) do

+ +
expect(RespostaForm.exists?(formulario: @formulario, usuario: @discente)).to be true
+
+ +

end

+ +

Então(&#39;eu não devo mais ser capaz de responder ao mesmo formulário&#39;) do

+ +
click_link @formulario.turma.disciplina.nome
+expect(page).to have_content(&quot;Você já respondeu este formulário.&quot;)
+ +

end

+ +

Quando(&#39;eu deixo uma pergunta obrigatória em branco&#39;) do

+ +
campo_texto = @formulario.elemento_forms.find_by(tipo: &#39;Texto&#39;)
+fill_in &quot;respostas[#{campo_texto.id}]&quot;, with: &#39;&#39;
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/features/step_definitions/senha_steps_html.html b/doc/tmp/rubycritic/features/step_definitions/senha_steps_html.html new file mode 100644 index 0000000000..767896fb0a --- /dev/null +++ b/doc/tmp/rubycritic/features/step_definitions/senha_steps_html.html @@ -0,0 +1,2137 @@ + + + + + + + +senha_steps.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-06-15 16:24:38 -0300'>2026-06-15 16:24:38 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>features/step_definitions /</small> senha_steps.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating d big">
+            D
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">76</span><small> lines of codes</small></div>
+            <div><span class="metric">0</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">N/A</span><small> complexity/method</small></div>
+            <div><span class="metric">2</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">104.21</span><small> complexity</small></div>
+            <div><span class="metric">143</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              4
+              smells
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code">Dado(&#39;que o e-mail de usuário {string} está cadastrado no sistema com senha indefinida&#39;) do |email|
+usuario = Usuario.find_or_initialize_by(email: email)
+usuario.matricula ||= &quot;#{rand(100000..999999)}&quot;
+usuario.nome ||= &quot;Usuário Teste&quot;
+usuario.senha_hash = nil
+usuario.save!
+ +

end

+ +

Quando(&#39;eu acesso o link de definição de senha recebido por e-mail&#39;) do<ol class=“nocode errors smells”> <li> <div class=“description”> <div class=“heading”> <span> <i class=“fa fa-warning” aria-hidden=“true”></i> <a href=“docs.seattlerb.org/flay/” target=“_blank”>DuplicateCode</a> </span> </div> <span>Similar code found in 2 nodes</span> <span>Locations:</span> <a href=“senha_steps.html#L9” class=“js-smell-location”>0</a> <a href=“senha_steps.html#L61” class=“js-smell-location”>1</a> </div> </li> <li> <div class=“description”> <div class=“heading”> <span> <i class=“fa fa-warning” aria-hidden=“true”></i> <a href=“docs.seattlerb.org/flog/” target=“_blank”>HighComplexity</a> </span> </div> <span>Quando#eu acesso o link de definição de senha recebido por e-mail has a flog score of 31</span> </div> </li></ol>

+ +
email_destino = @email_destino || raise(&quot;Email de destino não definido nos steps&quot;)
+
+mensagem = ActionMailer::Base.deliveries.reverse.find { |m| m.to == [ email_destino ] }
+raise(&quot;Nenhum email enviado para #{email_destino}&quot;) if mensagem.nil?
+
+corpo = mensagem.text_part&amp;.body&amp;.decoded || mensagem.html_part&amp;.body&amp;.decoded || mensagem.body.decoded
+url = corpo[%r{https?://\S+}]
+raise(&quot;Não encontrei URL no email&quot;) if url.nil?
+
+visit url
+ +

end

+ +

Quando(&#39;eu informo a nova senha {string} e confirmo a senha {string}&#39;) do |senha, confirmacao|

+ +
fill_in &quot;senha&quot;, with: senha
+fill_in &quot;senha_confirmation&quot;, with: confirmacao
+ +

end

+ +

Quando(&#39;eu confirmo a definição de senha&#39;) do

+ +
click_button &quot;Definir senha&quot;
+
+ +

end

+ +

Quando(&#39;eu informo o email {string}&#39;) do |email|

+ +
fill_in &quot;email&quot;, with: email
+ +

end

+ +

Quando(&#39;eu solicito a redefinição de senha&#39;) do

+ +
click_button &quot;Solicitar redefinição&quot;
+
+ +

end

+ +

Quando(&#39;eu solicito a redefinição de senha sem informar meu email&#39;) do

+ +
click_button &quot;Solicitar redefinição&quot;
+
+ +

end

+ +

Então(&#39;um email de redefinição de senha é enviado para o email {string}&#39;) do |email|<ol class=“nocode errors smells”> <li> <div class=“description”> <div class=“heading”> <span> <i class=“fa fa-warning” aria-hidden=“true”></i> <a href=“docs.seattlerb.org/flay/” target=“_blank”>DuplicateCode</a> </span> </div> <span>Similar code found in 2 nodes</span> <span>Locations:</span> <a href=“cadastro_steps.html#L45” class=“js-smell-location”>0</a> <a href=“senha_steps.html#L43” class=“js-smell-location”>1</a> </div> </li></ol>

+ +
usuario = Usuario.find_by!(email: email)
+ActionMailer::Base.deliveries.clear
+usuario.enviar_email_redefinicao_senha!
+
+@email_destino = email
+
+enviados = ActionMailer::Base.deliveries.select { |m| m.to == [ email ] }
+expect(enviados).not_to be_empty
+
+ +

end

+ +

Dado(&#39;que eu solicitei a redefinição de senha para o email {string}&#39;) do |email|

+ +
usuario = Usuario.find_by!(email: email)
+ActionMailer::Base.deliveries.clear
+usuario.enviar_email_redefinicao_senha!
+@email_destino = email
+
+ +

end

+ +

Quando(&#39;eu acesso o link de redefinição de senha recebido por e-mail&#39;) do<ol class=“nocode errors smells”> <li> <div class=“description”> <div class=“heading”> <span> <i class=“fa fa-warning” aria-hidden=“true”></i> <a href=“docs.seattlerb.org/flay/” target=“_blank”>DuplicateCode</a> </span> </div> <span>Similar code found in 2 nodes</span> <span>Locations:</span> <a href=“senha_steps.html#L9” class=“js-smell-location”>0</a> <a href=“senha_steps.html#L61” class=“js-smell-location”>1</a> </div> </li> <li> <div class=“description”> <div class=“heading”> <span> <i class=“fa fa-warning” aria-hidden=“true”></i> <a href=“docs.seattlerb.org/flog/” target=“_blank”>HighComplexity</a> </span> </div> <span>Quando#eu acesso o link de redefinição de senha recebido por e-mail has a flog score of 31</span> </div> </li></ol>

+ +
email_destino = @email_destino || raise(&quot;Email de destino não definido nos steps&quot;)
+
+mensagem = ActionMailer::Base.deliveries.reverse.find { |m| m.to == [ email_destino ] }
+raise(&quot;Nenhum email enviado para #{email_destino}&quot;) if mensagem.nil?
+
+corpo = mensagem.text_part&amp;.body&amp;.decoded || mensagem.html_part&amp;.body&amp;.decoded || mensagem.body.decoded
+url = corpo[%r{https?://\S+}]
+raise(&quot;Não encontrei URL no email&quot;) if url.nil?
+
+visit url
+ +

end

+ +

Quando(&#39;eu confirmo a redefinição de senha&#39;) do

+ +
click_button &quot;Redefinir senha&quot;
+
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/features/step_definitions/template_steps_html.html b/doc/tmp/rubycritic/features/step_definitions/template_steps_html.html new file mode 100644 index 0000000000..89234a144c --- /dev/null +++ b/doc/tmp/rubycritic/features/step_definitions/template_steps_html.html @@ -0,0 +1,2262 @@ + + + + + + + +template_steps.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-06-15 16:24:38 -0300'>2026-06-15 16:24:38 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>features/step_definitions /</small> template_steps.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating d big">
+            D
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">173</span><small> lines of codes</small></div>
+            <div><span class="metric">0</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">N/A</span><small> complexity/method</small></div>
+            <div><span class="metric">4</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">266.36</span><small> complexity</small></div>
+            <div><span class="metric">64</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              4
+              smells
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code">Given(/^I [aA]m authenticated as an &quot;([^&quot;]*)&quot;$/) do |role|
+depto = Departamento.find_or_create_by!(nome: &#39;Departamento&#39;, codigo: &#39;TST&#39;)<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="http://docs.seattlerb.org/flay/" target="_blank"><b>DuplicateCode</b></a>        </span>      </div>      <span>Similar code found in 2 nodes</span>              <span>Locations:</span>                  <a href="criar_formulario_template_steps.html#L6" class="js-smell-location">0</a>                  <a href="template_steps.html#L2" class="js-smell-location">1</a>                  </div>  </li></ol>
+
+@admin = Administrador.find_or_create_by!(email: &#39;admin@unb.br&#39;) do |u|
+  u.senha_hash = &#39;123456&#39;
+  u.nome = &#39;Admin&#39;
+  u.matricula = &#39;123456789&#39;
+  u.departamento = depto
+end
+
+allow_any_instance_of(ApplicationController).to receive(:current_user).and_return(@admin)
+
+allow_any_instance_of(TemplatesController).to receive(:set_admin) do |controller|
+  controller.instance_variable_set(:@admin, @admin)
+end
+ +

end

+ +

Given(&#39;I Am on the home page&#39;) do

+ +
visit inicio_path
+
+ +

end

+ +

Given(&#39;I go to the {string} page&#39;) do |page|

+ +
admin = Administrador.first
+visit admin_templates_path(admin) if page == &quot;Meus Templates&quot;
+ +

end

+ +

Given(&#39;I am on the {string} page&#39;) do |page_name|

+ +
expect(page).to have_content(&quot;Nome do template:&quot;)
+ +

end

+ +

When(&#39;I follow {string}&#39;) do |link|

+ +
if link == &quot;Adicionar novo template&quot;
+  admin = Administrador.first
+  visit new_admin_template_path(admin)
+else
+  click_link_or_button(link)
+end
+ +

end

+ +

When(&#39;I follow {string} for {string}&#39;) do |acao, template_nome|

+ +
card = find(&#39;.card&#39;, text: template_nome)
+card.find(&quot;[aria-label=&#39;#{acao}&#39;]&quot;).click
+ +

end

+ +

When(&#39;I press {string}&#39;) do |botao|

+ +
if page.has_button?(&#39;Criar&#39;)
+  click_button &#39;Criar&#39;
+else
+  click_button &#39;Salvar&#39;
+end
+ +

end

+ +

When(&#39;I confirm the deletion&#39;) do end

+ +

Given(&#39;I have added the template&#39;) do |table|

+ +
dados = table.rows_hash
+valor = dados[&#39;titulo&#39;].gsub(/^&quot;|&quot;$/, &#39;&#39;)
+fill_in &quot;Nome do template:&quot;, with: valor
+ +

end

+ +

Given(&#39;I add the following elementos:&#39;) do |table|<ol class=“nocode errors smells”> <li> <div class=“description”> <div class=“heading”> <span> <i class=“fa fa-warning” aria-hidden=“true”></i> <a href=“docs.seattlerb.org/flog/” target=“_blank”>HighComplexity</a> </span> </div> <span>Given#I add the following elementos: has a flog score of 54</span> </div> </li></ol>

+ +
table.hashes.each_with_index do |row, index|
+  find(&#39;.add-question-btn&#39;, visible: :all).click if index &gt; 0
+
+  within all(&#39;.question-block:not(.deleted-block)&#39;).last do
+    find(&#39;.figma-input-line-full[placeholder=&quot;Digite a pergunta...&quot;]&#39;).set(row[&#39;enunciado_elemento&#39;])
+
+    tipo = row[&#39;tipo_campo&#39;] == &#39;multipla_escolha&#39; ? &#39;Múltipla Escolha&#39; : &#39;Texto&#39;
+    find(&#39;.select-tipo&#39;).find(&quot;option[value=&#39;#{tipo}&#39;]&quot;).select_option
+
+    if tipo == &#39;Múltipla Escolha&#39;
+      opcoes = row[&#39;enunciado_campo&#39;].split(&#39;:&#39;).map(&amp;:strip).reject(&amp;:empty?)
+      opcoes.each_with_index do |opcao, opt_idx|
+        find(&#39;.btn-add-option&#39;).click if opt_idx &gt; 0
+        all(&#39;.option-row:not(.deleted-option) input.figma-input-line-full&#39;).last.set(opcao)
+      end
+    end
+  end
+end
+ +

end

+ +

Given(&#39;I dont add elementos&#39;) do

+ +
find(&#39;input.destroy-question-input&#39;, visible: :hidden).set(&#39;1&#39;)
+ +

end

+ +

When(&#39;I change the {string} to {string}&#39;) do |campo, valor|

+ +
fill_in &quot;Nome do template:&quot;, with: valor if campo == &quot;titulo&quot;
+ +

end

+ +

When(&#39;I change the elemento {string} to {string}&#39;) do |antigo, novo|

+ +
if novo.empty?
+  input = find(&quot;input.figma-input-line-full[value=&#39;#{antigo.strip}&#39;]&quot;)
+  bloco = input.ancestor(&#39;.question-block&#39;)
+  within(bloco) do
+    find(&#39;input.destroy-question-input&#39;, visible: :hidden).set(&#39;1&#39;)
+  end
+else
+  input = find(&quot;input.figma-input-line-full[value=&#39;#{antigo.strip}&#39;]&quot;)
+  input.set(novo)
+end
+ +

end

+ +

Then(&#39;I should see a success message {string}&#39;) do |msg|

+ +
expect(page).to have_content(msg)
+
+ +

end

+ +

Then(&#39;I should see an error message {string}&#39;) do |msg|

+ +
expect(page).to have_content(msg)
+
+ +

end

+ +

Then(&#39;the template {string} should be listed in my templates&#39;) do |nome|

+ +
expect(page).to have_content(nome)
+
+ +

end

+ +

Then(&#39;I should see {string}&#39;) do |texto|

+ +
expect(page).to have_content(texto)
+
+ +

end

+ +

Then(&#39;I should not see {string}&#39;) do |texto|

+ +
expect(page).not_to have_content(texto)
+
+ +

end

+ +

Then(&#39;I should see the message {string}&#39;) do |msg|

+ +
expect(page).to have_content(msg)
+
+ +

end

+ +

Then(&#39;I should see options to {string} and {string} for each template&#39;) do |acao1, acao2|

+ +
expect(page).to have_selector(&quot;[aria-label=&#39;#{acao1}&#39;]&quot;)
+expect(page).to have_selector(&quot;[aria-label=&#39;#{acao2}&#39;]&quot;)
+ +

end

+ +

Then(&#39;I should see a button {string}&#39;) do |botao|

+ +
expect(page).to have_selector(&quot;a, button&quot;, text: botao)
+ +

end

+ +

Then(&#39;the template {string} should have the following elementos:&#39;) do |nome, table|

+ +
template = Template.find_by(nome: nome)
+expect(template.elementos.count).to eq(table.hashes.count)
+
+ +

end

+ +

Given(&#39;I have the following templates saved:&#39;) do |table|

+ +
admin = Administrador.first
+table.hashes.each do |row|
+  template = Template.new(nome: row[&#39;titulo&#39;], administrador: admin)
+  elemento = template.elementos.build(enunciado: &quot;Questão Fantasma&quot;, ordem: 1)
+  elemento.campos.build(tipo_elemento: &quot;Texto&quot;, ordem: 1)
+  template.save!
+end
+ +

end

+ +

Given(&#39;the template {string} has the following elementos:&#39;) do |nome, table|<ol class=“nocode errors smells”> <li> <div class=“description”> <div class=“heading”> <span> <i class=“fa fa-warning” aria-hidden=“true”></i> <a href=“docs.seattlerb.org/flog/” target=“_blank”>HighComplexity</a> </span> </div> <span>Given#the template {string} has the following elementos: has a flog score of 42</span> </div> </li></ol>

+ +
template = Template.find_by(nome: nome)
+template.elementos.destroy_all # Limpa a fantasma
+
+table.hashes.each_with_index do |row, index|
+  tipo = row[&#39;tipo_campo&#39;] == &#39;multipla_escolha&#39; ? &#39;Múltipla Escolha&#39; : &#39;Texto&#39;
+  elemento = template.elementos.create!(enunciado: row[&#39;enunciado_elemento&#39;], ordem: index + 1)
+
+  if tipo == &#39;Múltipla Escolha&#39;
+    opcoes = row[&#39;enunciado_campo&#39;].split(&#39;:&#39;).map(&amp;:strip).reject(&amp;:empty?)
+    opcoes.each_with_index do |opcao, opt_idx|<ol class="nocode errors smells">  <li>    <div class="description">      <div class="heading">        <span>          <i class="fa fa-warning" aria-hidden="true"></i>          <a href="http://docs.seattlerb.org/flay/" target="_blank"><b>DuplicateCode</b></a>        </span>      </div>      <span>Similar code found in 2 nodes</span>              <span>Locations:</span>                  <a href="criar_formulario_template_steps.html#L37" class="js-smell-location">0</a>                  <a href="template_steps.html#L162" class="js-smell-location">1</a>                  </div>  </li></ol>
+      elemento.campos.create!(tipo_elemento: tipo, enunciado: opcao, ordem: opt_idx + 1)
+    end
+  else
+    elemento.campos.create!(tipo_elemento: tipo, ordem: 1)
+  end
+end
+ +

end

+ +

Given(&#39;I have no templates saved&#39;) do

+ +
Template.destroy_all
+
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/features/support/env_html.html b/doc/tmp/rubycritic/features/support/env_html.html new file mode 100644 index 0000000000..287392a2df --- /dev/null +++ b/doc/tmp/rubycritic/features/support/env_html.html @@ -0,0 +1,2080 @@ + + + + + + + +env.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="../../assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="../../assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="../../overview.html"><img src="../../assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="../../overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="../../simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <div class="row">
+<!--Page Title -->
+<div class="Page_Title">
+  <div class="file-time">
+    <span class="committed-at">
+
+        Updated <time class='js-timeago' datetime='2026-06-21 19:16:01 -0300'>2026-06-21 19:16:01 -0300</time>
+
+    </span>
+  </div>
+  <div>
+    <h3><small>features/support /</small> env.rb</h3>
+  </div>
+</div>
+<!--End Page Title -->
+<div class="Content_Wrapper">
+  <!-- code detail -->
+  <div class="code-top-detail clearfix row">
+    <div class="col-md-8">
+      <div class="row">
+        <div class="col-md-1">
+          <div class="rating a big">
+            A
+          </div>
+        </div>
+        <div class="code-statistics col-md-11">
+          <div class="col-md-3">
+            <div><span class="metric">72</span><small> lines of codes</small></div>
+            <div><span class="metric">0</span><small> methods</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">N/A</span><small> complexity/method</small></div>
+            <div><span class="metric">3</span><small> churn</small></div>
+          </div>
+          <div class="col-md-3">
+            <div><span class="metric">0.0</span><small> complexity</small></div>
+            <div><span class="metric">0</span><small> duplications</small></div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="col-md-4">
+      <div class="code-tabs">
+        <ul class="nav nav-pills right-to-left">
+          <li><a href="#" id="toggle-code" class="toggle-button button">code</a></li>
+          <li class="active">
+            <a href="#" id="toggle-smells" class="toggle-button button">
+              0
+              smell
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+
+  <code class="prettyprint linenums lang-ruby file-code js-file-code"># IMPORTANT: This file is generated by cucumber-rails - edit at your own peril.
+ +

# It is recommended to regenerate this file in the future when you upgrade to a # newer version of cucumber-rails. Consider adding your own code to a new file # instead of editing this one. Cucumber will automatically load all features/**/*.rb # files.

+ +

require &#39;simplecov&#39; SimpleCov.start &#39;rails&#39; do

+ +
add_filter &#39;/spec/&#39;
+add_filter &#39;/config/&#39;
+ +

end SimpleCov.command_name &#39;Cucumber&#39;

+ +

require &#39;cucumber/rails&#39;

+ +

# By default, any exception happening in your Rails application will bubble up # to Cucumber so that your scenario will fail. This is a different from how # your application behaves in the production environment, where an error page will # be rendered instead. # # Sometimes we want to override this default behaviour and allow Rails to rescue # exceptions and display an error page (just like when the app is running in production). # Typical scenarios where you want to do this is when you test your error pages. # There are two ways to allow Rails to rescue exceptions: # # 1) Tag your scenario (or feature) with @allow-rescue # # 2) Set the value below to true. Beware that doing this globally is not # recommended as it will mask a lot of errors for you! # ActionController::Base.allow_rescue = false

+ +

# Remove/comment out the lines below if your app doesn&#39;t have a database. # For some databases (like MongoDB and CouchDB) you may need to use :truncation instead. begin

+ +
DatabaseCleaner.strategy = :transaction
+
+ +

rescue NameError

+ +
raise &quot;You need to add database_cleaner to your Gemfile (in the :test group) if you wish to use it.&quot;
+ +

end

+ +

# You may also want to configure DatabaseCleaner to use different strategies for certain features and scenarios. # See the DatabaseCleaner documentation for details. Example: # # Before(&#39;@no-txn,@selenium,@culerity,@celerity,@javascript&#39;) do # # { except: [:widgets] } may not do what you expect here # # as Cucumber::Rails::Database.javascript_strategy overrides # # this setting. # DatabaseCleaner.strategy = :truncation # end # # Before(&#39;not @no-txn&#39;, &#39;not @selenium&#39;, &#39;not @culerity&#39;, &#39;not @celerity&#39;, &#39;not @javascript&#39;) do # DatabaseCleaner.strategy = :transaction # end #

+ +

# Possible values are :truncation and :transaction # The :transaction strategy is faster, but might give you threading problems. # See github.com/cucumber/cucumber-rails/blob/master/features/choose_javascript_database_strategy.feature Cucumber::Rails::Database.javascript_strategy = :truncation

+ +

# Make RSpec mocks available in Cucumber steps (allow_any_instance_of, allow, etc.) require &#39;rspec/mocks&#39; World(RSpec::Mocks::ExampleMethods)

+ +

Before do

+ +
RSpec::Mocks.setup
+
+ +

end

+ +

After do

+ +
RSpec::Mocks.verify
+RSpec::Mocks.teardown
+
+ +

end </code>

+ +
</div>
+ +

</div>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="../../assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="../../assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="../../assets/vendor/javascripts/prettify.js"></script>
+  <script src="../../assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="../../assets/javascripts/application.js"></script>
+  <script src="../../assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/overview_html.html b/doc/tmp/rubycritic/overview_html.html new file mode 100644 index 0000000000..d9017b9b08 --- /dev/null +++ b/doc/tmp/rubycritic/overview_html.html @@ -0,0 +1,1816 @@ + + + + + + + +overview.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="overview.html"><img src="assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <!-- Page Content -->
+ +

<div id=“page-content-wrapper”>

+ +
<div class="container-fluid">
+  <div class="row">
+    <!--Page Title -->
+    <div class="Page_Title">
+     <h3>Overview</h3>
+    </div>
+    <!--End Page Title -->
+    <div class="Content_Wrapper">
+      <!--Grade Wrapper-->
+      <div class="col-xs-12 col-sm-4 col-md-6 col-lg-4">
+        <div class="Graph_Cards fadeIn">
+        <div id="gpa-chart" class="chart-container"></div>
+        <div id="addText" ></div>
+        </div>
+      </div>
+      <!--End Grade Wrapper-->
+
+      <!--Churn vs Complexity graph-->
+      <div class="col-xs-12 col-sm-7 col-md-6 col-lg-8">
+        <div class="Graph_Cards fadeIn">
+
+            <div id="churn-vs-complexity-graph-container" class="chart-container"></div>
+
+          <script>
+           var turbulenceData = [{"name":"AdminController","x":17,"y":136.93,"rating":"C"},{"name":"ApplicationController","x":6,"y":11.99,"rating":"A"},{"name":"CampoFormsController","x":5,"y":53.58,"rating":"F"},{"name":"CamposController","x":5,"y":53.58,"rating":"F"},{"name":"AdminAutenticavel","x":0,"y":10.89,"rating":"A"},{"name":"CursosController","x":5,"y":53.58,"rating":"F"},{"name":"DefinicaoSenhasController","x":4,"y":53.38,"rating":"B"},{"name":"DepartamentosController","x":5,"y":53.58,"rating":"F"},{"name":"DiscentesController","x":5,"y":53.58,"rating":"F"},{"name":"DisciplinasController","x":5,"y":53.58,"rating":"F"},{"name":"DocentesController","x":5,"y":53.58,"rating":"F"},{"name":"ElementoFormsController","x":5,"y":53.58,"rating":"F"},{"name":"ElementosController","x":5,"y":53.58,"rating":"F"},{"name":"FormulariosController","x":5,"y":53.58,"rating":"F"},{"name":"HomeController","x":6,"y":0.0,"rating":"A"},{"name":"RedefinicaoSenhasController","x":3,"y":58.39,"rating":"B"},{"name":"RespostaElemsController","x":5,"y":53.58,"rating":"F"},{"name":"RespostaFormsController","x":5,"y":53.58,"rating":"F"},{"name":"SessionsController","x":11,"y":48.4,"rating":"A"},{"name":"TemplatesController","x":8,"y":81.47,"rating":"C"},{"name":"TurmasController","x":5,"y":53.58,"rating":"F"},{"name":"UsuariosController","x":9,"y":164.61,"rating":"F"},{"name":"AdminHelper","x":1,"y":0.0,"rating":"A"},{"name":"ApplicationHelper","x":4,"y":10.55,"rating":"A"},{"name":"CampoFormsHelper","x":1,"y":0.0,"rating":"A"},{"name":"CamposHelper","x":1,"y":0.0,"rating":"A"},{"name":"CursosHelper","x":1,"y":0.0,"rating":"A"},{"name":"DepartamentosHelper","x":1,"y":0.0,"rating":"A"},{"name":"DiscentesHelper","x":1,"y":0.0,"rating":"A"},{"name":"DisciplinasHelper","x":1,"y":0.0,"rating":"A"},{"name":"DocentesHelper","x":1,"y":0.0,"rating":"A"},{"name":"ElementoFormsHelper","x":1,"y":0.0,"rating":"A"},{"name":"ElementosHelper","x":1,"y":0.0,"rating":"A"},{"name":"FormulariosHelper","x":1,"y":0.0,"rating":"A"},{"name":"RespostaElemsHelper","x":1,"y":0.0,"rating":"A"},{"name":"RespostaFormsHelper","x":1,"y":0.0,"rating":"A"},{"name":"TemplatesHelper","x":1,"y":0.0,"rating":"A"},{"name":"TurmasHelper","x":1,"y":0.0,"rating":"A"},{"name":"UsuariosHelper","x":1,"y":0.0,"rating":"A"},{"name":"ApplicationJob","x":1,"y":0.0,"rating":"A"},{"name":"ApplicationMailer","x":2,"y":0.0,"rating":"A"},{"name":"UsuarioMailer","x":2,"y":9.67,"rating":"A"},{"name":"Administrador","x":4,"y":0.0,"rating":"A"},{"name":"ApplicationRecord","x":1,"y":0.0,"rating":"A"},{"name":"Campo","x":3,"y":0.0,"rating":"A"},{"name":"CampoForm","x":3,"y":0.0,"rating":"A"},{"name":"Curso","x":3,"y":0.0,"rating":"A"},{"name":"Departamento","x":3,"y":0.0,"rating":"A"},{"name":"Discente","x":4,"y":0.0,"rating":"A"},{"name":"Disciplina","x":3,"y":0.0,"rating":"A"},{"name":"Docente","x":4,"y":0.0,"rating":"A"},{"name":"Elemento","x":4,"y":0.0,"rating":"A"},{"name":"ElementoForm","x":3,"y":0.0,"rating":"A"},{"name":"Formulario","x":5,"y":0.0,"rating":"A"},{"name":"RespostaElem","x":3,"y":0.0,"rating":"A"},{"name":"RespostaForm","x":3,"y":0.0,"rating":"A"},{"name":"Template","x":5,"y":40.84,"rating":"A"},{"name":"Turma","x":4,"y":0.0,"rating":"A"},{"name":"Usuario","x":4,"y":43.76,"rating":"A"},{"name":"SigaaImporter","x":7,"y":204.8,"rating":"D"}];
+           var score = 49.85;
+          </script>
+        </div>
+      </div>
+      <!--End Churn vs Complexity graph-->
+
+      <!--Summary Wrapper-->
+      <div class="col-xs-12 col-sm-12 col-md-12 col-lg-12">
+        <div class="Graph_Cards Summary_Wrapper_Main fadeIn-3">
+          <h4>Summary</h4>
+
+          <div class="Summary_Wrapper">
+
+              <div class="col-xs-12 col-sm-6 col-md-6 col-lg-4">
+                <div class="summary_wrap Green_DR">
+                  <div class="pull-left Summary_Title col-xs-3 col-sm-3 col-md-3 col-lg-3">
+                    <h3>A</h3>
+                  </div>
+                  <div class="pull-right Summary_Content col-xs-9 col-sm-9 col-md-9 col-lg-9">
+                    <ul class="list-inline">
+                      <li><h4 id="ratingAfileCount">41</h4><span>files</span></li>
+                      <li><h4 id="ratingAfileCount">107</h4><span>churns</span></li>
+                      <li><h4 id="ratingAfileCount">36</h4><span>smells</span></li>
+                    </ul>
+                  </div>
+                </div>
+              </div>
+
+              <div class="col-xs-12 col-sm-6 col-md-6 col-lg-4">
+                <div class="summary_wrap Green_Light">
+                  <div class="pull-left Summary_Title col-xs-3 col-sm-3 col-md-3 col-lg-3">
+                    <h3>B</h3>
+                  </div>
+                  <div class="pull-right Summary_Content col-xs-9 col-sm-9 col-md-9 col-lg-9">
+                    <ul class="list-inline">
+                      <li><h4 id="ratingAfileCount">2</h4><span>files</span></li>
+                      <li><h4 id="ratingAfileCount">7</h4><span>churns</span></li>
+                      <li><h4 id="ratingAfileCount">12</h4><span>smells</span></li>
+                    </ul>
+                  </div>
+                </div>
+              </div>
+
+              <div class="col-xs-12 col-sm-6 col-md-6 col-lg-4">
+                <div class="summary_wrap Yellow_Color">
+                  <div class="pull-left Summary_Title col-xs-3 col-sm-3 col-md-3 col-lg-3">
+                    <h3>C</h3>
+                  </div>
+                  <div class="pull-right Summary_Content col-xs-9 col-sm-9 col-md-9 col-lg-9">
+                    <ul class="list-inline">
+                      <li><h4 id="ratingAfileCount">2</h4><span>files</span></li>
+                      <li><h4 id="ratingAfileCount">25</h4><span>churns</span></li>
+                      <li><h4 id="ratingAfileCount">26</h4><span>smells</span></li>
+                    </ul>
+                  </div>
+                </div>
+              </div>
+
+              <div class="col-xs-12 col-sm-6 col-md-6 col-lg-4">
+                <div class="summary_wrap Orange_Color">
+                  <div class="pull-left Summary_Title col-xs-3 col-sm-3 col-md-3 col-lg-3">
+                    <h3>D</h3>
+                  </div>
+                  <div class="pull-right Summary_Content col-xs-9 col-sm-9 col-md-9 col-lg-9">
+                    <ul class="list-inline">
+                      <li><h4 id="ratingAfileCount">1</h4><span>files</span></li>
+                      <li><h4 id="ratingAfileCount">7</h4><span>churns</span></li>
+                      <li><h4 id="ratingAfileCount">29</h4><span>smells</span></li>
+                    </ul>
+                  </div>
+                </div>
+              </div>
+
+              <div class="col-xs-12 col-sm-6 col-md-6 col-lg-4">
+                <div class="summary_wrap Red_Color">
+                  <div class="pull-left Summary_Title col-xs-3 col-sm-3 col-md-3 col-lg-3">
+                    <h3>F</h3>
+                  </div>
+                  <div class="pull-right Summary_Content col-xs-9 col-sm-9 col-md-9 col-lg-9">
+                    <ul class="list-inline">
+                      <li><h4 id="ratingAfileCount">14</h4><span>files</span></li>
+                      <li><h4 id="ratingAfileCount">74</h4><span>churns</span></li>
+                      <li><h4 id="ratingAfileCount">173</h4><span>smells</span></li>
+                    </ul>
+                  </div>
+                </div>
+              </div>
+
+          </div>
+        </div>
+      </div>
+      <!--End Summary Wrapper-->
+    </div>
+  </div>
+</div>
+ +

</div> <!– /#page-content-wrapper –>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="assets/vendor/javascripts/prettify.js"></script>
+  <script src="assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="assets/javascripts/application.js"></script>
+  <script src="assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/simple_cov_index_html.html b/doc/tmp/rubycritic/simple_cov_index_html.html new file mode 100644 index 0000000000..71d6a72558 --- /dev/null +++ b/doc/tmp/rubycritic/simple_cov_index_html.html @@ -0,0 +1,2919 @@ + + + + + + + +simple_cov_index.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="overview.html"><img src="assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <!-- Page Content -->
+ +

<div id=“page-content-wrapper”>

+ +
<div class="container-fluid">
+  <div class="row">
+    <!--Page Title -->
+    <div class="Page_Title">
+      <h3>Coverage</h3>
+    </div>
+    <!--End Page Title -->
+    <div class="Content_Wrapper">
+      <table id="coverageTable" class="table index-table sortable-table tablesorter">
+        <thead>
+          <tr>
+
+              <th width="10%" class="table-header">Rating<span class="sort-type"></span></th>
+
+            <th width="80%" class="table-header">Name<span class="sort-type"></span></th>
+            <th width="10%" class="table-header">Coverage<span class="sort-type"></span></th>
+          </tr>
+        </thead>
+
+          <tr>
+
+              <td>
+                <div class="rating f">
+                  F
+                </div>
+              </td>
+
+            <td>
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/jobs/application_job.html">
+                    ApplicationJob
+                  </a>
+                </li>
+              </ul>
+            </td>
+            <td>0.00%</td>
+          </tr>
+
+          <tr>
+
+              <td>
+                <div class="rating f">
+                  F
+                </div>
+              </td>
+
+            <td>
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/services/sigaa_importer.html">
+                    SigaaImporter
+                  </a>
+                </li>
+              </ul>
+            </td>
+            <td>32.12%</td>
+          </tr>
+
+          <tr>
+
+              <td>
+                <div class="rating f">
+                  F
+                </div>
+              </td>
+
+            <td>
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/mailers/usuario_mailer.html">
+                    UsuarioMailer
+                  </a>
+                </li>
+              </ul>
+            </td>
+            <td>66.67%</td>
+          </tr>
+
+          <tr>
+
+              <td>
+                <div class="rating f">
+                  F
+                </div>
+              </td>
+
+            <td>
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/controllers/templates_controller.html">
+                    TemplatesController
+                  </a>
+                </li>
+              </ul>
+            </td>
+            <td>68.09%</td>
+          </tr>
+
+          <tr>
+
+              <td>
+                <div class="rating d">
+                  D
+                </div>
+              </td>
+
+            <td>
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/helpers/application_helper.html">
+                    ApplicationHelper
+                  </a>
+                </li>
+              </ul>
+            </td>
+            <td>85.71%</td>
+          </tr>
+
+          <tr>
+
+              <td>
+                <div class="rating d">
+                  D
+                </div>
+              </td>
+
+            <td>
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/controllers/usuarios_controller.html">
+                    UsuariosController
+                  </a>
+                </li>
+              </ul>
+            </td>
+            <td>91.78%</td>
+          </tr>
+
+          <tr>
+
+              <td>
+                <div class="rating c">
+                  C
+                </div>
+              </td>
+
+            <td>
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/models/usuario.html">
+                    Usuario
+                  </a>
+                </li>
+              </ul>
+            </td>
+            <td>92.50%</td>
+          </tr>
+
+          <tr>
+
+              <td>
+                <div class="rating c">
+                  C
+                </div>
+              </td>
+
+            <td>
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/controllers/sessions_controller.html">
+                    SessionsController
+                  </a>
+                </li>
+              </ul>
+            </td>
+            <td>93.94%</td>
+          </tr>
+
+          <tr>
+
+              <td>
+                <div class="rating b">
+                  B
+                </div>
+              </td>
+
+            <td>
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/controllers/admin_controller.html">
+                    AdminController
+                  </a>
+                </li>
+              </ul>
+            </td>
+            <td>97.70%</td>
+          </tr>
+
+          <tr>
+
+              <td>
+                <div class="rating a">
+                  A
+                </div>
+              </td>
+
+            <td>
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/helpers/resposta_elems_helper.html">
+                    RespostaElemsHelper
+                  </a>
+                </li>
+              </ul>
+            </td>
+            <td>100.00%</td>
+          </tr>
+
+          <tr>
+
+              <td>
+                <div class="rating a">
+                  A
+                </div>
+              </td>
+
+            <td>
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/helpers/resposta_forms_helper.html">
+                    RespostaFormsHelper
+                  </a>
+                </li>
+              </ul>
+            </td>
+            <td>100.00%</td>
+          </tr>
+
+          <tr>
+
+              <td>
+                <div class="rating a">
+                  A
+                </div>
+              </td>
+
+            <td>
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/helpers/templates_helper.html">
+                    TemplatesHelper
+                  </a>
+                </li>
+              </ul>
+            </td>
+            <td>100.00%</td>
+          </tr>
+
+          <tr>
+
+              <td>
+                <div class="rating a">
+                  A
+                </div>
+              </td>
+
+            <td>
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/helpers/turmas_helper.html">
+                    TurmasHelper
+                  </a>
+                </li>
+              </ul>
+            </td>
+            <td>100.00%</td>
+          </tr>
+
+          <tr>
+
+              <td>
+                <div class="rating a">
+                  A
+                </div>
+              </td>
+
+            <td>
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/helpers/usuarios_helper.html">
+                    UsuariosHelper
+                  </a>
+                </li>
+              </ul>
+            </td>
+            <td>100.00%</td>
+          </tr>
+
+          <tr>
+
+              <td>
+                <div class="rating a">
+                  A
+                </div>
+              </td>
+
+            <td>
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/controllers/campos_controller.html">
+                    CamposController
+                  </a>
+                </li>
+              </ul>
+            </td>
+            <td>100.00%</td>
+          </tr>
+
+          <tr>
+
+              <td>
+                <div class="rating a">
+                  A
+                </div>
+              </td>
+
+            <td>
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/mailers/application_mailer.html">
+                    ApplicationMailer
+                  </a>
+                </li>
+              </ul>
+            </td>
+            <td>100.00%</td>
+          </tr>
+
+          <tr>
+
+              <td>
+                <div class="rating a">
+                  A
+                </div>
+              </td>
+
+            <td>
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/controllers/campo_forms_controller.html">
+                    CampoFormsController
+                  </a>
+                </li>
+              </ul>
+            </td>
+            <td>100.00%</td>
+          </tr>
+
+          <tr>
+
+              <td>
+                <div class="rating a">
+                  A
+                </div>
+              </td>
+
+            <td>
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/models/administrador.html">
+                    Administrador
+                  </a>
+                </li>
+              </ul>
+            </td>
+            <td>100.00%</td>
+          </tr>
+
+          <tr>
+
+              <td>
+                <div class="rating a">
+                  A
+                </div>
+              </td>
+
+            <td>
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/models/application_record.html">
+                    ApplicationRecord
+                  </a>
+                </li>
+              </ul>
+            </td>
+            <td>100.00%</td>
+          </tr>
+
+          <tr>
+
+              <td>
+                <div class="rating a">
+                  A
+                </div>
+              </td>
+
+            <td>
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/models/campo.html">
+                    Campo
+                  </a>
+                </li>
+              </ul>
+            </td>
+            <td>100.00%</td>
+          </tr>
+
+          <tr>
+
+              <td>
+                <div class="rating a">
+                  A
+                </div>
+              </td>
+
+            <td>
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/models/campo_form.html">
+                    CampoForm
+                  </a>
+                </li>
+              </ul>
+            </td>
+            <td>100.00%</td>
+          </tr>
+
+          <tr>
+
+              <td>
+                <div class="rating a">
+                  A
+                </div>
+              </td>
+
+            <td>
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/models/curso.html">
+                    Curso
+                  </a>
+                </li>
+              </ul>
+            </td>
+            <td>100.00%</td>
+          </tr>
+
+          <tr>
+
+              <td>
+                <div class="rating a">
+                  A
+                </div>
+              </td>
+
+            <td>
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/models/departamento.html">
+                    Departamento
+                  </a>
+                </li>
+              </ul>
+            </td>
+            <td>100.00%</td>
+          </tr>
+
+          <tr>
+
+              <td>
+                <div class="rating a">
+                  A
+                </div>
+              </td>
+
+            <td>
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/models/discente.html">
+                    Discente
+                  </a>
+                </li>
+              </ul>
+            </td>
+            <td>100.00%</td>
+          </tr>
+
+          <tr>
+
+              <td>
+                <div class="rating a">
+                  A
+                </div>
+              </td>
+
+            <td>
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/models/disciplina.html">
+                    Disciplina
+                  </a>
+                </li>
+              </ul>
+            </td>
+            <td>100.00%</td>
+          </tr>
+
+          <tr>
+
+              <td>
+                <div class="rating a">
+                  A
+                </div>
+              </td>
+
+            <td>
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/models/docente.html">
+                    Docente
+                  </a>
+                </li>
+              </ul>
+            </td>
+            <td>100.00%</td>
+          </tr>
+
+          <tr>
+
+              <td>
+                <div class="rating a">
+                  A
+                </div>
+              </td>
+
+            <td>
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/models/elemento.html">
+                    Elemento
+                  </a>
+                </li>
+              </ul>
+            </td>
+            <td>100.00%</td>
+          </tr>
+
+          <tr>
+
+              <td>
+                <div class="rating a">
+                  A
+                </div>
+              </td>
+
+            <td>
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/models/elemento_form.html">
+                    ElementoForm
+                  </a>
+                </li>
+              </ul>
+            </td>
+            <td>100.00%</td>
+          </tr>
+
+          <tr>
+
+              <td>
+                <div class="rating a">
+                  A
+                </div>
+              </td>
+
+            <td>
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/models/formulario.html">
+                    Formulario
+                  </a>
+                </li>
+              </ul>
+            </td>
+            <td>100.00%</td>
+          </tr>
+
+          <tr>
+
+              <td>
+                <div class="rating a">
+                  A
+                </div>
+              </td>
+
+            <td>
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/models/resposta_elem.html">
+                    RespostaElem
+                  </a>
+                </li>
+              </ul>
+            </td>
+            <td>100.00%</td>
+          </tr>
+
+          <tr>
+
+              <td>
+                <div class="rating a">
+                  A
+                </div>
+              </td>
+
+            <td>
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/models/resposta_form.html">
+                    RespostaForm
+                  </a>
+                </li>
+              </ul>
+            </td>
+            <td>100.00%</td>
+          </tr>
+
+          <tr>
+
+              <td>
+                <div class="rating a">
+                  A
+                </div>
+              </td>
+
+            <td>
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/models/template.html">
+                    Template
+                  </a>
+                </li>
+              </ul>
+            </td>
+            <td>100.00%</td>
+          </tr>
+
+          <tr>
+
+              <td>
+                <div class="rating a">
+                  A
+                </div>
+              </td>
+
+            <td>
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/models/turma.html">
+                    Turma
+                  </a>
+                </li>
+              </ul>
+            </td>
+            <td>100.00%</td>
+          </tr>
+
+          <tr>
+
+              <td>
+                <div class="rating a">
+                  A
+                </div>
+              </td>
+
+            <td>
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/controllers/application_controller.html">
+                    ApplicationController
+                  </a>
+                </li>
+              </ul>
+            </td>
+            <td>100.00%</td>
+          </tr>
+
+          <tr>
+
+              <td>
+                <div class="rating a">
+                  A
+                </div>
+              </td>
+
+            <td>
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/controllers/discentes_controller.html">
+                    DiscentesController
+                  </a>
+                </li>
+              </ul>
+            </td>
+            <td>100.00%</td>
+          </tr>
+
+          <tr>
+
+              <td>
+                <div class="rating a">
+                  A
+                </div>
+              </td>
+
+            <td>
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/controllers/disciplinas_controller.html">
+                    DisciplinasController
+                  </a>
+                </li>
+              </ul>
+            </td>
+            <td>100.00%</td>
+          </tr>
+
+          <tr>
+
+              <td>
+                <div class="rating a">
+                  A
+                </div>
+              </td>
+
+            <td>
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/controllers/docentes_controller.html">
+                    DocentesController
+                  </a>
+                </li>
+              </ul>
+            </td>
+            <td>100.00%</td>
+          </tr>
+
+          <tr>
+
+              <td>
+                <div class="rating a">
+                  A
+                </div>
+              </td>
+
+            <td>
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/controllers/elemento_forms_controller.html">
+                    ElementoFormsController
+                  </a>
+                </li>
+              </ul>
+            </td>
+            <td>100.00%</td>
+          </tr>
+
+          <tr>
+
+              <td>
+                <div class="rating a">
+                  A
+                </div>
+              </td>
+
+            <td>
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/controllers/elementos_controller.html">
+                    ElementosController
+                  </a>
+                </li>
+              </ul>
+            </td>
+            <td>100.00%</td>
+          </tr>
+
+          <tr>
+
+              <td>
+                <div class="rating a">
+                  A
+                </div>
+              </td>
+
+            <td>
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/controllers/formularios_controller.html">
+                    FormulariosController
+                  </a>
+                </li>
+              </ul>
+            </td>
+            <td>100.00%</td>
+          </tr>
+
+          <tr>
+
+              <td>
+                <div class="rating a">
+                  A
+                </div>
+              </td>
+
+            <td>
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/controllers/home_controller.html">
+                    HomeController
+                  </a>
+                </li>
+              </ul>
+            </td>
+            <td>100.00%</td>
+          </tr>
+
+          <tr>
+
+              <td>
+                <div class="rating a">
+                  A
+                </div>
+              </td>
+
+            <td>
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/controllers/redefinicao_senhas_controller.html">
+                    RedefinicaoSenhasController
+                  </a>
+                </li>
+              </ul>
+            </td>
+            <td>100.00%</td>
+          </tr>
+
+          <tr>
+
+              <td>
+                <div class="rating a">
+                  A
+                </div>
+              </td>
+
+            <td>
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/controllers/resposta_elems_controller.html">
+                    RespostaElemsController
+                  </a>
+                </li>
+              </ul>
+            </td>
+            <td>100.00%</td>
+          </tr>
+
+          <tr>
+
+              <td>
+                <div class="rating a">
+                  A
+                </div>
+              </td>
+
+            <td>
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/controllers/resposta_forms_controller.html">
+                    RespostaFormsController
+                  </a>
+                </li>
+              </ul>
+            </td>
+            <td>100.00%</td>
+          </tr>
+
+          <tr>
+
+              <td>
+                <div class="rating a">
+                  A
+                </div>
+              </td>
+
+            <td>
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/controllers/departamentos_controller.html">
+                    DepartamentosController
+                  </a>
+                </li>
+              </ul>
+            </td>
+            <td>100.00%</td>
+          </tr>
+
+          <tr>
+
+              <td>
+                <div class="rating a">
+                  A
+                </div>
+              </td>
+
+            <td>
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/controllers/definicao_senhas_controller.html">
+                    DefinicaoSenhasController
+                  </a>
+                </li>
+              </ul>
+            </td>
+            <td>100.00%</td>
+          </tr>
+
+          <tr>
+
+              <td>
+                <div class="rating a">
+                  A
+                </div>
+              </td>
+
+            <td>
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/controllers/turmas_controller.html">
+                    TurmasController
+                  </a>
+                </li>
+              </ul>
+            </td>
+            <td>100.00%</td>
+          </tr>
+
+          <tr>
+
+              <td>
+                <div class="rating a">
+                  A
+                </div>
+              </td>
+
+            <td>
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/controllers/cursos_controller.html">
+                    CursosController
+                  </a>
+                </li>
+              </ul>
+            </td>
+            <td>100.00%</td>
+          </tr>
+
+          <tr>
+
+              <td>
+                <div class="rating a">
+                  A
+                </div>
+              </td>
+
+            <td>
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/helpers/admin_helper.html">
+                    AdminHelper
+                  </a>
+                </li>
+              </ul>
+            </td>
+            <td>100.00%</td>
+          </tr>
+
+          <tr>
+
+              <td>
+                <div class="rating a">
+                  A
+                </div>
+              </td>
+
+            <td>
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/controllers/concerns/admin_autenticavel.html">
+                    AdminAutenticavel
+                  </a>
+                </li>
+              </ul>
+            </td>
+            <td>100.00%</td>
+          </tr>
+
+          <tr>
+
+              <td>
+                <div class="rating a">
+                  A
+                </div>
+              </td>
+
+            <td>
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/helpers/campo_forms_helper.html">
+                    CampoFormsHelper
+                  </a>
+                </li>
+              </ul>
+            </td>
+            <td>100.00%</td>
+          </tr>
+
+          <tr>
+
+              <td>
+                <div class="rating a">
+                  A
+                </div>
+              </td>
+
+            <td>
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/helpers/campos_helper.html">
+                    CamposHelper
+                  </a>
+                </li>
+              </ul>
+            </td>
+            <td>100.00%</td>
+          </tr>
+
+          <tr>
+
+              <td>
+                <div class="rating a">
+                  A
+                </div>
+              </td>
+
+            <td>
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/helpers/cursos_helper.html">
+                    CursosHelper
+                  </a>
+                </li>
+              </ul>
+            </td>
+            <td>100.00%</td>
+          </tr>
+
+          <tr>
+
+              <td>
+                <div class="rating a">
+                  A
+                </div>
+              </td>
+
+            <td>
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/helpers/departamentos_helper.html">
+                    DepartamentosHelper
+                  </a>
+                </li>
+              </ul>
+            </td>
+            <td>100.00%</td>
+          </tr>
+
+          <tr>
+
+              <td>
+                <div class="rating a">
+                  A
+                </div>
+              </td>
+
+            <td>
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/helpers/discentes_helper.html">
+                    DiscentesHelper
+                  </a>
+                </li>
+              </ul>
+            </td>
+            <td>100.00%</td>
+          </tr>
+
+          <tr>
+
+              <td>
+                <div class="rating a">
+                  A
+                </div>
+              </td>
+
+            <td>
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/helpers/disciplinas_helper.html">
+                    DisciplinasHelper
+                  </a>
+                </li>
+              </ul>
+            </td>
+            <td>100.00%</td>
+          </tr>
+
+          <tr>
+
+              <td>
+                <div class="rating a">
+                  A
+                </div>
+              </td>
+
+            <td>
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/helpers/docentes_helper.html">
+                    DocentesHelper
+                  </a>
+                </li>
+              </ul>
+            </td>
+            <td>100.00%</td>
+          </tr>
+
+          <tr>
+
+              <td>
+                <div class="rating a">
+                  A
+                </div>
+              </td>
+
+            <td>
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/helpers/elemento_forms_helper.html">
+                    ElementoFormsHelper
+                  </a>
+                </li>
+              </ul>
+            </td>
+            <td>100.00%</td>
+          </tr>
+
+          <tr>
+
+              <td>
+                <div class="rating a">
+                  A
+                </div>
+              </td>
+
+            <td>
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/helpers/elementos_helper.html">
+                    ElementosHelper
+                  </a>
+                </li>
+              </ul>
+            </td>
+            <td>100.00%</td>
+          </tr>
+
+          <tr>
+
+              <td>
+                <div class="rating a">
+                  A
+                </div>
+              </td>
+
+            <td>
+              <ul class="nav nav-pills">
+                <li role="presentation" >
+                  <a href="app/helpers/formularios_helper.html">
+                    FormulariosHelper
+                  </a>
+                </li>
+              </ul>
+            </td>
+            <td>100.00%</td>
+          </tr>
+
+      </table>
+    </div>
+  </div>
+</div>
+ +

</div> <!– /#page-content-wrapper –>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="assets/vendor/javascripts/prettify.js"></script>
+  <script src="assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="assets/javascripts/application.js"></script>
+  <script src="assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/doc/tmp/rubycritic/smells_index_html.html b/doc/tmp/rubycritic/smells_index_html.html new file mode 100644 index 0000000000..0be057a2ae --- /dev/null +++ b/doc/tmp/rubycritic/smells_index_html.html @@ -0,0 +1,7489 @@ + + + + + + + +smells_index.html - RDoc Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + C + + + + + + + + + + I + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + RDoc Documentation + + + + + + + + + + +
+ + + + + + + + + +
+ +

<!DOCTYPE html> <html xmlns=“www.w3.org/1999/xhtml”>

+ +
<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <title>Ruby Critic - Home</title>
+  <meta name="description" content="">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <!-- StyleSheets -->
+  <link href="assets/vendor/stylesheets/bootstrap.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="assets/vendor/stylesheets/font-awesome.min.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="assets/vendor/stylesheets/prettify.custom_theme.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+  <link href="assets/stylesheets/application.css" media="screen, projection, print" rel="stylesheet" type="text/css">
+</head>
+
+<body>
+  <header class="navbar navbar-default navbar-fixed-top">
+    <a href="#menu-toggle" class="btn btn-default hidden-lg visible-sm-* hidden-md visible-xs-* pull-left" id="menu-toggle"><i class="fa fa-bars" aria-hidden="true"></i></a>
+    <a href="overview.html"><img src="assets/images/logo.png" alt="Ruby Critic Logo" title="Ruby Critic Logo" width="55"><span class="logo">RUBYCRITIC</span></a>
+
+  </header>
+  <div id="wrapper">
+    <!-- Sidebar -->
+    <aside id="sidebar-wrapper">
+      <ul class="sidebar-nav">
+        <li class="sidebar-item">
+          <a href="overview.html" class="project-nav-item overview-nav"><i class="fa fa-dashboard"></i>Overview</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="code_index.html" class="project-nav-item code-index-nav"><i class="fa fa-code"></i>Code</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="smells_index.html" class="project-nav-item smells-index-nav"><i class="fa fa-warning"></i>Smells</a>
+        </li>
+        <li class="sidebar-item">
+          <a href="simple_cov_index.html" class="project-nav-item coverage-index-nav"><i class="fa fa-umbrella"></i>Coverage</a>
+        </li>
+      </ul>
+    </aside>
+    <!-- /#sidebar-wrapper -->
+    <div id="page-content-wrapper">
+      <div class="container-fluid">
+        <!-- Page Content -->
+ +

<div id=“page-content-wrapper”>

+ +
<div class="container-fluid">
+  <div class="row">
+    <!--Page Title -->
+    <div class="Page_Title">
+      <h3>Smells</h3>
+    </div>
+    <!--End Page Title -->
+    <div class="Content_Wrapper">
+      <table id="smellsTable" class="table smells-index-table index-table sortable-table">
+        <thead>
+          <tr>
+            <th width="30%" class="table-header">Smell<span class="sort-type"></span></th>
+            <th width="65%" class="table-header">Locations<span class="sort-type"></span></th>
+            <th width="5%" class="table-header">Status<span class="sort-type"></span></th>
+          </tr>
+        </thead>
+
+          <tr>
+            <td>ControlParameter</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/admin_controller.html#L207">AdminController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateMethodCall</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/admin_controller.html#L81">AdminController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/admin_controller.html#L88">AdminController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>FeatureEnvy</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/admin_controller.html#L144">AdminController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>InstanceVariableAssumption</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/admin_controller.html#L8">AdminController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>InstanceVariableAssumption</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/admin_controller.html#L8">AdminController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>TooManyInstanceVariables</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/admin_controller.html#L8">AdminController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>TooManyStatements</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/admin_controller.html#L154">AdminController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>TooManyStatements</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/admin_controller.html#L77">AdminController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>TooManyStatements</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/admin_controller.html#L113">AdminController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>TooManyStatements</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/admin_controller.html#L203">AdminController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>TooManyStatements</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/admin_controller.html#L183">AdminController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>UtilityFunction</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/admin_controller.html#L154">AdminController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateCode</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/campo_forms_controller.html#L42">CampoFormsController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/campos_controller.html#L42">CamposController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/cursos_controller.html#L41">CursosController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/departamentos_controller.html#L42">DepartamentosController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/discentes_controller.html#L42">DiscentesController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/disciplinas_controller.html#L42">DisciplinasController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/docentes_controller.html#L42">DocentesController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/elemento_forms_controller.html#L42">ElementoFormsController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/elementos_controller.html#L41">ElementosController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/formularios_controller.html#L41">FormulariosController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/resposta_elems_controller.html#L42">RespostaElemsController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/resposta_forms_controller.html#L42">RespostaFormsController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/turmas_controller.html#L41">TurmasController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/usuarios_controller.html#L144">UsuariosController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateCode</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/campo_forms_controller.html#L61">CampoFormsController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/campos_controller.html#L61">CamposController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/cursos_controller.html#L60">CursosController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/departamentos_controller.html#L61">DepartamentosController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/discentes_controller.html#L61">DiscentesController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/disciplinas_controller.html#L61">DisciplinasController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/docentes_controller.html#L61">DocentesController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/elemento_forms_controller.html#L61">ElementoFormsController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/elementos_controller.html#L60">ElementosController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/formularios_controller.html#L60">FormulariosController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/resposta_elems_controller.html#L61">RespostaElemsController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/resposta_forms_controller.html#L61">RespostaFormsController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/turmas_controller.html#L60">TurmasController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/usuarios_controller.html#L163">UsuariosController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateCode</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/campo_forms_controller.html#L77">CampoFormsController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/campos_controller.html#L77">CamposController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/cursos_controller.html#L76">CursosController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/departamentos_controller.html#L77">DepartamentosController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/discentes_controller.html#L77">DiscentesController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/disciplinas_controller.html#L77">DisciplinasController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/docentes_controller.html#L77">DocentesController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/elemento_forms_controller.html#L77">ElementoFormsController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/elementos_controller.html#L76">ElementosController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/formularios_controller.html#L76">FormulariosController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/resposta_elems_controller.html#L77">RespostaElemsController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/resposta_forms_controller.html#L77">RespostaFormsController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/turmas_controller.html#L76">TurmasController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/usuarios_controller.html#L179">UsuariosController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateMethodCall</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/campo_forms_controller.html#L47">CampoFormsController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/campo_forms_controller.html#L50">CampoFormsController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateMethodCall</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/campo_forms_controller.html#L48">CampoFormsController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/campo_forms_controller.html#L51">CampoFormsController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateMethodCall</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/campo_forms_controller.html#L64">CampoFormsController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/campo_forms_controller.html#L67">CampoFormsController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateMethodCall</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/campo_forms_controller.html#L65">CampoFormsController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/campo_forms_controller.html#L68">CampoFormsController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>InstanceVariableAssumption</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/campo_forms_controller.html#L7">CampoFormsController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>TooManyStatements</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/campo_forms_controller.html#L42">CampoFormsController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>TooManyStatements</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/campo_forms_controller.html#L77">CampoFormsController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>TooManyStatements</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/campo_forms_controller.html#L61">CampoFormsController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateMethodCall</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/campos_controller.html#L47">CamposController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/campos_controller.html#L50">CamposController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateMethodCall</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/campos_controller.html#L48">CamposController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/campos_controller.html#L51">CamposController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateMethodCall</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/campos_controller.html#L64">CamposController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/campos_controller.html#L67">CamposController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateMethodCall</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/campos_controller.html#L65">CamposController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/campos_controller.html#L68">CamposController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>InstanceVariableAssumption</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/campos_controller.html#L7">CamposController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>TooManyStatements</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/campos_controller.html#L42">CamposController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>TooManyStatements</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/campos_controller.html#L77">CamposController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>TooManyStatements</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/campos_controller.html#L61">CamposController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateMethodCall</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/cursos_controller.html#L46">CursosController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/cursos_controller.html#L49">CursosController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateMethodCall</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/cursos_controller.html#L47">CursosController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/cursos_controller.html#L50">CursosController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateMethodCall</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/cursos_controller.html#L63">CursosController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/cursos_controller.html#L66">CursosController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateMethodCall</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/cursos_controller.html#L64">CursosController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/cursos_controller.html#L67">CursosController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>InstanceVariableAssumption</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/cursos_controller.html#L6">CursosController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>TooManyStatements</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/cursos_controller.html#L41">CursosController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>TooManyStatements</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/cursos_controller.html#L76">CursosController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>TooManyStatements</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/cursos_controller.html#L60">CursosController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateCode</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/definicao_senhas_controller.html#L13">DefinicaoSenhasController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/redefinicao_senhas_controller.html#L43">RedefinicaoSenhasController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateMethodCall</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/definicao_senhas_controller.html#L33">DefinicaoSenhasController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/definicao_senhas_controller.html#L40">DefinicaoSenhasController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>InstanceVariableAssumption</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/definicao_senhas_controller.html#L7">DefinicaoSenhasController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>TooManyStatements</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/definicao_senhas_controller.html#L28">DefinicaoSenhasController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateMethodCall</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/departamentos_controller.html#L47">DepartamentosController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/departamentos_controller.html#L50">DepartamentosController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateMethodCall</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/departamentos_controller.html#L48">DepartamentosController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/departamentos_controller.html#L51">DepartamentosController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateMethodCall</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/departamentos_controller.html#L64">DepartamentosController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/departamentos_controller.html#L67">DepartamentosController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateMethodCall</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/departamentos_controller.html#L65">DepartamentosController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/departamentos_controller.html#L68">DepartamentosController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>InstanceVariableAssumption</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/departamentos_controller.html#L7">DepartamentosController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>TooManyStatements</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/departamentos_controller.html#L42">DepartamentosController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>TooManyStatements</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/departamentos_controller.html#L77">DepartamentosController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>TooManyStatements</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/departamentos_controller.html#L61">DepartamentosController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateMethodCall</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/discentes_controller.html#L47">DiscentesController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/discentes_controller.html#L50">DiscentesController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateMethodCall</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/discentes_controller.html#L48">DiscentesController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/discentes_controller.html#L51">DiscentesController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateMethodCall</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/discentes_controller.html#L64">DiscentesController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/discentes_controller.html#L67">DiscentesController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateMethodCall</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/discentes_controller.html#L65">DiscentesController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/discentes_controller.html#L68">DiscentesController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>InstanceVariableAssumption</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/discentes_controller.html#L7">DiscentesController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>TooManyStatements</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/discentes_controller.html#L42">DiscentesController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>TooManyStatements</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/discentes_controller.html#L77">DiscentesController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>TooManyStatements</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/discentes_controller.html#L61">DiscentesController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateMethodCall</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/disciplinas_controller.html#L47">DisciplinasController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/disciplinas_controller.html#L50">DisciplinasController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateMethodCall</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/disciplinas_controller.html#L48">DisciplinasController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/disciplinas_controller.html#L51">DisciplinasController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateMethodCall</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/disciplinas_controller.html#L64">DisciplinasController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/disciplinas_controller.html#L67">DisciplinasController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateMethodCall</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/disciplinas_controller.html#L65">DisciplinasController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/disciplinas_controller.html#L68">DisciplinasController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>InstanceVariableAssumption</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/disciplinas_controller.html#L7">DisciplinasController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>TooManyStatements</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/disciplinas_controller.html#L42">DisciplinasController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>TooManyStatements</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/disciplinas_controller.html#L77">DisciplinasController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>TooManyStatements</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/disciplinas_controller.html#L61">DisciplinasController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateMethodCall</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/docentes_controller.html#L47">DocentesController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/docentes_controller.html#L50">DocentesController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateMethodCall</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/docentes_controller.html#L48">DocentesController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/docentes_controller.html#L51">DocentesController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateMethodCall</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/docentes_controller.html#L64">DocentesController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/docentes_controller.html#L67">DocentesController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateMethodCall</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/docentes_controller.html#L65">DocentesController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/docentes_controller.html#L68">DocentesController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>InstanceVariableAssumption</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/docentes_controller.html#L7">DocentesController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>TooManyStatements</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/docentes_controller.html#L42">DocentesController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>TooManyStatements</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/docentes_controller.html#L77">DocentesController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>TooManyStatements</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/docentes_controller.html#L61">DocentesController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateMethodCall</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/elemento_forms_controller.html#L47">ElementoFormsController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/elemento_forms_controller.html#L50">ElementoFormsController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateMethodCall</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/elemento_forms_controller.html#L48">ElementoFormsController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/elemento_forms_controller.html#L51">ElementoFormsController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateMethodCall</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/elemento_forms_controller.html#L64">ElementoFormsController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/elemento_forms_controller.html#L67">ElementoFormsController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateMethodCall</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/elemento_forms_controller.html#L65">ElementoFormsController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/elemento_forms_controller.html#L68">ElementoFormsController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>InstanceVariableAssumption</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/elemento_forms_controller.html#L7">ElementoFormsController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>TooManyStatements</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/elemento_forms_controller.html#L42">ElementoFormsController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>TooManyStatements</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/elemento_forms_controller.html#L77">ElementoFormsController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>TooManyStatements</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/elemento_forms_controller.html#L61">ElementoFormsController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateMethodCall</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/elementos_controller.html#L46">ElementosController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/elementos_controller.html#L49">ElementosController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateMethodCall</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/elementos_controller.html#L47">ElementosController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/elementos_controller.html#L50">ElementosController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateMethodCall</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/elementos_controller.html#L63">ElementosController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/elementos_controller.html#L66">ElementosController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateMethodCall</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/elementos_controller.html#L64">ElementosController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/elementos_controller.html#L67">ElementosController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>InstanceVariableAssumption</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/elementos_controller.html#L6">ElementosController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>TooManyStatements</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/elementos_controller.html#L41">ElementosController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>TooManyStatements</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/elementos_controller.html#L76">ElementosController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>TooManyStatements</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/elementos_controller.html#L60">ElementosController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateMethodCall</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/formularios_controller.html#L46">FormulariosController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/formularios_controller.html#L49">FormulariosController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateMethodCall</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/formularios_controller.html#L47">FormulariosController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/formularios_controller.html#L50">FormulariosController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateMethodCall</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/formularios_controller.html#L63">FormulariosController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/formularios_controller.html#L66">FormulariosController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateMethodCall</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/formularios_controller.html#L64">FormulariosController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/formularios_controller.html#L67">FormulariosController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>InstanceVariableAssumption</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/formularios_controller.html#L6">FormulariosController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>TooManyStatements</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/formularios_controller.html#L41">FormulariosController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>TooManyStatements</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/formularios_controller.html#L76">FormulariosController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>TooManyStatements</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/formularios_controller.html#L60">FormulariosController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>HighComplexity</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/redefinicao_senhas_controller.html#L58">RedefinicaoSenhasController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateMethodCall</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/redefinicao_senhas_controller.html#L70">RedefinicaoSenhasController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/redefinicao_senhas_controller.html#L76">RedefinicaoSenhasController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/redefinicao_senhas_controller.html#L89">RedefinicaoSenhasController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateMethodCall</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/redefinicao_senhas_controller.html#L76">RedefinicaoSenhasController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/redefinicao_senhas_controller.html#L89">RedefinicaoSenhasController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateMethodCall</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/redefinicao_senhas_controller.html#L71">RedefinicaoSenhasController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/redefinicao_senhas_controller.html#L77">RedefinicaoSenhasController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/redefinicao_senhas_controller.html#L90">RedefinicaoSenhasController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>InstanceVariableAssumption</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/redefinicao_senhas_controller.html#L6">RedefinicaoSenhasController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>TooManyStatements</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/redefinicao_senhas_controller.html#L19">RedefinicaoSenhasController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>TooManyStatements</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/redefinicao_senhas_controller.html#L58">RedefinicaoSenhasController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateMethodCall</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/resposta_elems_controller.html#L47">RespostaElemsController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/resposta_elems_controller.html#L50">RespostaElemsController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateMethodCall</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/resposta_elems_controller.html#L48">RespostaElemsController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/resposta_elems_controller.html#L51">RespostaElemsController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateMethodCall</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/resposta_elems_controller.html#L64">RespostaElemsController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/resposta_elems_controller.html#L67">RespostaElemsController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateMethodCall</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/resposta_elems_controller.html#L65">RespostaElemsController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/resposta_elems_controller.html#L68">RespostaElemsController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>InstanceVariableAssumption</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/resposta_elems_controller.html#L7">RespostaElemsController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>TooManyStatements</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/resposta_elems_controller.html#L42">RespostaElemsController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>TooManyStatements</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/resposta_elems_controller.html#L77">RespostaElemsController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>TooManyStatements</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/resposta_elems_controller.html#L61">RespostaElemsController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateMethodCall</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/resposta_forms_controller.html#L47">RespostaFormsController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/resposta_forms_controller.html#L50">RespostaFormsController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateMethodCall</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/resposta_forms_controller.html#L48">RespostaFormsController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/resposta_forms_controller.html#L51">RespostaFormsController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateMethodCall</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/resposta_forms_controller.html#L64">RespostaFormsController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/resposta_forms_controller.html#L67">RespostaFormsController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateMethodCall</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/resposta_forms_controller.html#L65">RespostaFormsController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/resposta_forms_controller.html#L68">RespostaFormsController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>InstanceVariableAssumption</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/resposta_forms_controller.html#L7">RespostaFormsController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>TooManyStatements</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/resposta_forms_controller.html#L42">RespostaFormsController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>TooManyStatements</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/resposta_forms_controller.html#L77">RespostaFormsController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>TooManyStatements</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/resposta_forms_controller.html#L61">RespostaFormsController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>HighComplexity</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/sessions_controller.html#L25">SessionsController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateMethodCall</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/sessions_controller.html#L79">SessionsController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/sessions_controller.html#L81">SessionsController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>TooManyStatements</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/sessions_controller.html#L25">SessionsController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateCode</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/templates_controller.html#L65">TemplatesController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/templates_controller.html#L84">TemplatesController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateCode</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/templates_controller.html#L68">TemplatesController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/templates_controller.html#L87">TemplatesController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateMethodCall</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/templates_controller.html#L61">TemplatesController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/templates_controller.html#L68">TemplatesController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateMethodCall</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/templates_controller.html#L65">TemplatesController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/templates_controller.html#L69">TemplatesController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateMethodCall</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/templates_controller.html#L66">TemplatesController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/templates_controller.html#L70">TemplatesController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateMethodCall</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/templates_controller.html#L48">TemplatesController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/templates_controller.html#L49">TemplatesController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateMethodCall</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/templates_controller.html#L35">TemplatesController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/templates_controller.html#L36">TemplatesController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateMethodCall</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/templates_controller.html#L84">TemplatesController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/templates_controller.html#L88">TemplatesController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateMethodCall</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/templates_controller.html#L85">TemplatesController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/templates_controller.html#L89">TemplatesController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>InstanceVariableAssumption</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/templates_controller.html#L7">TemplatesController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>InstanceVariableAssumption</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/templates_controller.html#L7">TemplatesController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>TooManyStatements</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/templates_controller.html#L60">TemplatesController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>TooManyStatements</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/templates_controller.html#L98">TemplatesController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>TooManyStatements</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/templates_controller.html#L81">TemplatesController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateMethodCall</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/turmas_controller.html#L46">TurmasController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/turmas_controller.html#L49">TurmasController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateMethodCall</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/turmas_controller.html#L47">TurmasController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/turmas_controller.html#L50">TurmasController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateMethodCall</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/turmas_controller.html#L63">TurmasController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/turmas_controller.html#L66">TurmasController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateMethodCall</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/turmas_controller.html#L64">TurmasController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/turmas_controller.html#L67">TurmasController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>InstanceVariableAssumption</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/turmas_controller.html#L6">TurmasController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>TooManyStatements</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/turmas_controller.html#L41">TurmasController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>TooManyStatements</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/turmas_controller.html#L76">TurmasController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>TooManyStatements</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/turmas_controller.html#L60">TurmasController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>VeryHighComplexity</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/usuarios_controller.html#L58">UsuariosController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateMethodCall</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/usuarios_controller.html#L22">UsuariosController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/usuarios_controller.html#L24">UsuariosController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateMethodCall</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/usuarios_controller.html#L149">UsuariosController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/usuarios_controller.html#L152">UsuariosController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateMethodCall</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/usuarios_controller.html#L150">UsuariosController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/usuarios_controller.html#L153">UsuariosController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateMethodCall</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/usuarios_controller.html#L66">UsuariosController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/usuarios_controller.html#L84">UsuariosController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateMethodCall</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/usuarios_controller.html#L66">UsuariosController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/usuarios_controller.html#L84">UsuariosController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateMethodCall</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/usuarios_controller.html#L60">UsuariosController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/usuarios_controller.html#L108">UsuariosController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateMethodCall</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/usuarios_controller.html#L60">UsuariosController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/usuarios_controller.html#L108">UsuariosController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateMethodCall</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/usuarios_controller.html#L67">UsuariosController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/usuarios_controller.html#L85">UsuariosController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateMethodCall</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/usuarios_controller.html#L67">UsuariosController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/usuarios_controller.html#L85">UsuariosController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateMethodCall</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/usuarios_controller.html#L71">UsuariosController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/usuarios_controller.html#L109">UsuariosController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateMethodCall</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/usuarios_controller.html#L67">UsuariosController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/usuarios_controller.html#L85">UsuariosController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateMethodCall</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/usuarios_controller.html#L60">UsuariosController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/usuarios_controller.html#L108">UsuariosController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateMethodCall</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/usuarios_controller.html#L72">UsuariosController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/usuarios_controller.html#L110">UsuariosController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateMethodCall</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/usuarios_controller.html#L89">UsuariosController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/usuarios_controller.html#L97">UsuariosController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateMethodCall</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/usuarios_controller.html#L63">UsuariosController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/usuarios_controller.html#L106">UsuariosController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateMethodCall</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/usuarios_controller.html#L166">UsuariosController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/usuarios_controller.html#L169">UsuariosController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateMethodCall</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/usuarios_controller.html#L167">UsuariosController</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/controllers/usuarios_controller.html#L170">UsuariosController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>InstanceVariableAssumption</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/usuarios_controller.html#L8">UsuariosController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>InstanceVariableAssumption</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/usuarios_controller.html#L8">UsuariosController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>InstanceVariableAssumption</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/usuarios_controller.html#L8">UsuariosController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>TooManyInstanceVariables</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/usuarios_controller.html#L8">UsuariosController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>TooManyStatements</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/usuarios_controller.html#L144">UsuariosController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>TooManyStatements</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/usuarios_controller.html#L179">UsuariosController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>TooManyStatements</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/usuarios_controller.html#L58">UsuariosController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>TooManyStatements</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/usuarios_controller.html#L163">UsuariosController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>UncommunicativeVariableName</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/controllers/usuarios_controller.html#L107">UsuariosController</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>IrresponsibleModule</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/helpers/admin_helper.html#L1">AdminHelper</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>FeatureEnvy</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/helpers/application_helper.html#L13">ApplicationHelper</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>IrresponsibleModule</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/helpers/application_helper.html#L1">ApplicationHelper</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>IrresponsibleModule</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/helpers/campo_forms_helper.html#L1">CampoFormsHelper</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>IrresponsibleModule</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/helpers/campos_helper.html#L1">CamposHelper</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>IrresponsibleModule</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/helpers/cursos_helper.html#L1">CursosHelper</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>IrresponsibleModule</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/helpers/departamentos_helper.html#L1">DepartamentosHelper</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>IrresponsibleModule</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/helpers/discentes_helper.html#L1">DiscentesHelper</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>IrresponsibleModule</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/helpers/disciplinas_helper.html#L1">DisciplinasHelper</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>IrresponsibleModule</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/helpers/docentes_helper.html#L1">DocentesHelper</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>IrresponsibleModule</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/helpers/elemento_forms_helper.html#L1">ElementoFormsHelper</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>IrresponsibleModule</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/helpers/elementos_helper.html#L1">ElementosHelper</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>IrresponsibleModule</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/helpers/formularios_helper.html#L1">FormulariosHelper</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>IrresponsibleModule</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/helpers/resposta_elems_helper.html#L1">RespostaElemsHelper</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>IrresponsibleModule</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/helpers/resposta_forms_helper.html#L1">RespostaFormsHelper</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>IrresponsibleModule</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/helpers/templates_helper.html#L1">TemplatesHelper</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>IrresponsibleModule</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/helpers/turmas_helper.html#L1">TurmasHelper</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>IrresponsibleModule</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/helpers/usuarios_helper.html#L1">UsuariosHelper</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>IrresponsibleModule</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/jobs/application_job.html#L1">ApplicationJob</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>IrresponsibleModule</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/mailers/application_mailer.html#L1">ApplicationMailer</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateCode</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/mailers/usuario_mailer.html#L6">UsuarioMailer</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/mailers/usuario_mailer.html#L17">UsuarioMailer</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>IrresponsibleModule</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/mailers/usuario_mailer.html#L1">UsuarioMailer</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>IrresponsibleModule</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/models/application_record.html#L1">ApplicationRecord</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>HighComplexity</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/models/template.html#L45">Template</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>NestedIterators</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/models/template.html#L53">Template</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>TooManyStatements</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/models/template.html#L45">Template</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>Attribute</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/models/usuario.html#L15">Usuario</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>MissingSafeMethod</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/models/usuario.html#L65">Usuario</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>MissingSafeMethod</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/models/usuario.html#L87">Usuario</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>MissingSafeMethod</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/models/usuario.html#L53">Usuario</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>MissingSafeMethod</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/models/usuario.html#L75">Usuario</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>MissingSafeMethod</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/models/usuario.html#L104">Usuario</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>MissingSafeMethod</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/models/usuario.html#L96">Usuario</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>HighComplexity</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/services/sigaa_importer.html#L342">SigaaImporter</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateMethodCall</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/services/sigaa_importer.html#L368">SigaaImporter</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/services/sigaa_importer.html#L371">SigaaImporter</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateMethodCall</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/services/sigaa_importer.html#L355">SigaaImporter</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateMethodCall</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/services/sigaa_importer.html#L355">SigaaImporter</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateMethodCall</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/services/sigaa_importer.html#L335">SigaaImporter</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>DuplicateMethodCall</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/services/sigaa_importer.html#L335">SigaaImporter</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>FeatureEnvy</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/services/sigaa_importer.html#L184">SigaaImporter</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/services/sigaa_importer.html#L185">SigaaImporter</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>FeatureEnvy</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/services/sigaa_importer.html#L183">SigaaImporter</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/services/sigaa_importer.html#L184">SigaaImporter</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>FeatureEnvy</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/services/sigaa_importer.html#L219">SigaaImporter</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/services/sigaa_importer.html#L220">SigaaImporter</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/services/sigaa_importer.html#L222">SigaaImporter</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>FeatureEnvy</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/services/sigaa_importer.html#L213">SigaaImporter</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/services/sigaa_importer.html#L214">SigaaImporter</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/services/sigaa_importer.html#L216">SigaaImporter</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>FeatureEnvy</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/services/sigaa_importer.html#L344">SigaaImporter</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/services/sigaa_importer.html#L346">SigaaImporter</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/services/sigaa_importer.html#L347">SigaaImporter</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/services/sigaa_importer.html#L351">SigaaImporter</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/services/sigaa_importer.html#L352">SigaaImporter</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>FeatureEnvy</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/services/sigaa_importer.html#L331">SigaaImporter</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/services/sigaa_importer.html#L333">SigaaImporter</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/services/sigaa_importer.html#L335">SigaaImporter</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>FeatureEnvy</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/services/sigaa_importer.html#L325">SigaaImporter</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/services/sigaa_importer.html#L327">SigaaImporter</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/services/sigaa_importer.html#L328">SigaaImporter</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/services/sigaa_importer.html#L332">SigaaImporter</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>RepeatedConditional</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/services/sigaa_importer.html#L100">SigaaImporter</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/services/sigaa_importer.html#L113">SigaaImporter</a>
+                  </li>
+
+                  <li role="presentation">
+                    <a href="app/services/sigaa_importer.html#L127">SigaaImporter</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>TooManyMethods</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/services/sigaa_importer.html#L14">SigaaImporter</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>TooManyStatements</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/services/sigaa_importer.html#L41">SigaaImporter</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>TooManyStatements</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/services/sigaa_importer.html#L233">SigaaImporter</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>TooManyStatements</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/services/sigaa_importer.html#L211">SigaaImporter</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>TooManyStatements</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/services/sigaa_importer.html#L342">SigaaImporter</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>TooManyStatements</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/services/sigaa_importer.html#L323">SigaaImporter</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>TooManyStatements</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/services/sigaa_importer.html#L308">SigaaImporter</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>UtilityFunction</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/services/sigaa_importer.html#L367">SigaaImporter</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>UtilityFunction</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/services/sigaa_importer.html#L389">SigaaImporter</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>UtilityFunction</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/services/sigaa_importer.html#L381">SigaaImporter</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>UtilityFunction</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/services/sigaa_importer.html#L292">SigaaImporter</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>UtilityFunction</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/services/sigaa_importer.html#L263">SigaaImporter</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>UtilityFunction</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/services/sigaa_importer.html#L194">SigaaImporter</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>UtilityFunction</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/services/sigaa_importer.html#L149">SigaaImporter</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+          <tr>
+            <td>UtilityFunction</td>
+            <td>
+              <ul class="nav nav-pills">
+
+                  <li role="presentation">
+                    <a href="app/services/sigaa_importer.html#L139">SigaaImporter</a>
+                  </li>
+
+              </ul>
+            </td>
+            <td>
+
+                <ul class="nav nav-pills">
+                  <li role="presentation">
+                    <span class="status-new circled-text circle">new</span>
+                  </li>
+                </ul>
+
+            </td>
+          </tr>
+
+      </table>
+    </div>
+  </div>
+</div>
+ +

</div> <!– /#page-content-wrapper –>

+ +
      </div>
+    </div>
+  </div>
+
+  <!-- JavaScripts -->
+  <script src="assets/vendor/javascripts/jquery.min.js"></script>
+  <script src="assets/vendor/javascripts/jquery.tablesorter.min.js"></script>
+  <script src="assets/vendor/javascripts/jquery.scrollTo.min.js"></script>
+  <script src="assets/vendor/javascripts/jquery.timeago.js"></script>
+  <script src="assets/vendor/javascripts/highcharts.src-4.0.1.js"></script>
+  <script src="assets/vendor/javascripts/prettify.js"></script>
+  <script src="assets/vendor/javascripts/bootstrap.min.js"></script>
+  <script src="assets/javascripts/application.js"></script>
+  <script src="assets/vendor/javascripts/jquery.filtertable.min.js"></script>
+</body>
+ +

</html>

+ +
+ + + + + + + + diff --git a/features/atualizar_dados_sigaa.feature b/features/atualizar_dados_sigaa.feature new file mode 100644 index 0000000000..97087df8ac --- /dev/null +++ b/features/atualizar_dados_sigaa.feature @@ -0,0 +1,27 @@ +# encoding : UTF-8 +# language: pt + +Funcionalidade: Atualizar base de dados do sistema com dados do SIGAA + Eu, como Administrador + Quero atualizar os dados de turmas, matérias e participantes do sistema com os dados atuais do SIGAA + A fim de corrigir a base de dados do sistema + +Contexto: + Dado que estou na página de gerenciamento + E que os dados do SIGAA foram importados com sucesso + +Cenário: Atualização de dados do SIGAA (happy path) + Dado que os dados do SIGAA foram atualizados com sucesso + Então as turmas, matérias e participantes do SIGAA estão atualizados no sistema com os dados atuais do SIGAA + +Cenário: Atualização de dados do SIGAA com falha (sad path) + Dado que eu tentei atualizar os dados do SIGAA mas ocorreu um erro + Então uma mensagem de erro é exibida informando que a atualização falhou + +Cenário: Atualização de dados do SIGAA com dados já atualizados (sad path) + Dado que os dados do SIGAA já estão atualizados na base de dados do sistema + Então uma mensagem é exibida informando que os dados já estão atualizados e não serão atualizados novamente + +Cenário: Atualização de dados do SIGAA com dados parcialmente atualizados (sad path) + Dado que alguns dados do SIGAA já estão atualizados na base de dados do sistema + Então uma mensagem é exibida informando que alguns dados já estão atualizados e não serão atualizados novamente, mas os dados restantes serão atualizados com sucesso diff --git a/features/cadastro_sigaa.feature b/features/cadastro_sigaa.feature new file mode 100644 index 0000000000..9f169a5f07 --- /dev/null +++ b/features/cadastro_sigaa.feature @@ -0,0 +1,13 @@ +# encoding : UTF-8 +# language: pt + +Funcionalidade: Cadastrar usuários do sistema + Eu, como Administrador + Quero cadastrar participantes de turmas do SIGAA ao importar dados de usuarios novos para o sistema + A fim de que eles acessem o sistema CAMAAR + + Cenário: Cadastro de usuário importado do SIGAA (happy path) + Dado que estou na página de gerenciamento + Dado que eu importei os dados do SIGAA com sucesso + Então o e-mail de usuário "usuario@teste.com" está cadastrado no sistema com senha indefinida + E um email de definição de senha é enviado para o email "usuario@teste.com" \ No newline at end of file diff --git a/features/create_template.feature b/features/create_template.feature new file mode 100644 index 0000000000..113a061868 --- /dev/null +++ b/features/create_template.feature @@ -0,0 +1,60 @@ +Feature: Create Template + + Eu como Administrador + Quero criar um template de formulário contendo as questões do formulário + A fim de gerar formulários de avaliações para avaliar o desempenho das turmas + + Background: + Given I Am authenticated as an "Administrador" + Given I Am on the home page + And I follow "Adicionar novo template" + And I am on the "Criar novo template" page + + Scenario: Create a template successfully(happy path) + + # Teste de matematica, multipla escolha + And I have added the template + | titulo | Template Prova Matemática 2º semestre | + And I add the following elementos: + | enunciado_elemento | tipo_campo | enunciado_campo | + | Questão 1(2 pontos): | multipla_escolha | a: b: c: d: | + | Questão 2(2 pontos): | multipla_escolha | a: b: c: d: | + | Questão 3(3 pontos): | multipla_escolha | a: b: c: d: | + | Questão 4(3 pontos): | multipla_escolha | a: b: c: d: | + | Questão desafio(1 ponto): | multipla_escolha | a: b: c: d: | + When I press "Salvar" + Then I should see a success message "Template criado com sucesso!" + + # Teste de portugues, discursivo + When I follow "Adicionar novo template" + Given I have added the template + | titulo | Template Prova Português 2º semestre | + And I add the following elementos: + | enunciado_elemento | tipo_campo | enunciado_campo | + | Questão 1(2.5 pontos): | campo_de_texto | Resposta: | + | Questão 2(2.5 pontos): | campo_de_texto | Resposta: | + | Questão 3(2.5 pontos): | campo_de_texto | Resposta: | + | Questão 4(2.5 pontos): | campo_de_texto | Resposta: | + | Questão desafio(1 ponto): | campo_de_texto | Resposta: | + When I press "Salvar" + Then I should see a success message "Template criado com sucesso!" + + # verificacao final (visualizacao) + And the template "Template Prova Matemática 2º semestre" should be listed in my templates + And the template "Template Prova Português 2º semestre" should be listed in my templates + + Scenario: Attempt to create a template without a title(sad path) + Given I have added the template + | titulo | "" | + And I add the following elementos: + | enunciado_elemento | tipo_campo | enunciado_campo | + | Questão 1: | multipla_escolha | a: b: c: d: | + When I press "Salvar" + Then I should see an error message "Título não pode ficar em branco!" + + Scenario: Attempt to create a template without questions(sad path) + Given I have added the template + | titulo | Template Prova Matemática 2º semestre | + And I dont add elementos + When I press "Salvar" + Then I should see an error message "Template deve ter pelo menos um elemento!" diff --git a/features/criar_formulario.feature b/features/criar_formulario.feature new file mode 100644 index 0000000000..3beb886b65 --- /dev/null +++ b/features/criar_formulario.feature @@ -0,0 +1,30 @@ +# language: pt + +Funcionalidade: Criar formulário de avaliação + Como um professor ou administrador + Quero poder criar um formulário de avaliação + Para que os alunos possam avaliar a disciplina ou turma + + Contexto: + Dado que eu estou logado como professor + E eu estou na página de criação de formulários + + Cenário: Criação de formulário com sucesso (Happy Path) + Quando eu escolho um template para o formulário + E escolho uma turma para enviar o formulário + E envio o formulário + Então eu devo ver a mensagem "Formulário criado com sucesso" + E o formulário deve estar disponível para os alunos da turma selecionada + + Cenário: Tentativa de criação sem template (Sad Path) + Quando eu não escolho um template para o formulário + E escolho uma turma para enviar o formulário + E envio o formulário + Então eu devo ver a mensagem "Selecione um template para criar o formulário" + + Cenário: Tentativa de criação sem turma (Sad Path) + Quando eu não escolho uma turma para enviar o formulário + E escolho um template para o formulário + E envio o formulário + Então eu devo ver a mensagem "Selecione pelo menos uma turma" + diff --git a/features/criar_formulario_template.feature b/features/criar_formulario_template.feature new file mode 100644 index 0000000000..d420bdec7f --- /dev/null +++ b/features/criar_formulario_template.feature @@ -0,0 +1,57 @@ +# language: pt + +Funcionalidade: Criar formulário baseado em template + Como um administrador + Quero criar um formulário baseado em um template para as turmas que eu escolher + A fim de avaliar o desempenho das turmas no semestre atual + + Contexto: + Dado que eu estou logado como administrador + E que existe um template chamado "Avaliação Padrão" com as seguintes perguntas: + | Pergunta | Tipo | Opções | + | Como você avalia o professor? | Múltipla Escolha | Ótimo, Bom, Regular, Ruim | + | Qual seu nível de satisfação? | Escala | 1, 2, 3, 4, 5 | + | Deixe seu comentário | Texto | | + E que existem as seguintes turmas no semestre "2026.1": + | Código | Disciplina | Turma | + | TEC001 | Matemática | A | + | TEC002 | Português | B | + | TEC003 | História | A | + + Cenário: Criar formulário a partir de template para uma turma (Happy Path) + Quando eu acesso a página de criação de formulário a partir de template + E eu seleciono o template "Avaliação Padrão" + E eu seleciono as turmas "TEC001 - Matemática - A" + E eu clico em "Criar Formulário" + Então eu devo ver a mensagem "Formulário criado com sucesso" + E o formulário deve conter as perguntas do template "Avaliação Padrão" + E o formulário deve estar associado à turma "Matemática - A" + + Cenário: Criar formulário a partir de template para múltiplas turmas (Happy Path) + Quando eu acesso a página de criação de formulário a partir de template + E eu seleciono o template "Avaliação Padrão" + E eu seleciono as turmas "TEC001 - Matemática - A" e "TEC002 - Português - B" + E eu clico em "Criar Formulário" + Então eu devo ver a mensagem "Formulários criados com sucesso" + E deve existir um formulário para a turma "Matemática - A" + E deve existir um formulário para a turma "Português - B" + E cada formulário deve conter as perguntas do template "Avaliação Padrão" + + Cenário: Tentar criar formulário sem selecionar template (Sad Path) + Quando eu acesso a página de criação de formulário a partir de template + E eu não seleciono nenhum template + E eu seleciono as turmas "TEC001 - Matemática - A" + E eu clico em "Criar Formulário" + Então eu devo ver a mensagem "Selecione um template para criar o formulário" + + Cenário: Tentar criar formulário sem selecionar turmas (Sad Path) + Quando eu acesso a página de criação de formulário a partir de template + E eu seleciono o template "Avaliação Padrão" + E eu não seleciono nenhuma turma + E eu clico em "Criar Formulário" + Então eu devo ver a mensagem "Selecione pelo menos uma turma" + + Cenário: Visualizar lista de templates disponíveis antes de criar + Quando eu acesso a página de criação de formulário a partir de template + Então eu devo ver a lista de templates disponíveis + E eu devo ver a lista de turmas do semestre "2026.1" disponíveis \ No newline at end of file diff --git a/features/definicao_senha.feature b/features/definicao_senha.feature new file mode 100644 index 0000000000..898b69805d --- /dev/null +++ b/features/definicao_senha.feature @@ -0,0 +1,32 @@ +# encoding : UTF-8 +# language: pt + +Funcionalidade: Definição de senha (primeiro acesso) + Eu, como usuário importado do SIGAA + Quero definir minha senha a partir de um link enviado por e-mail + A fim de efetivar meu cadastro e acessar o sistema + + Contexto: + Dado que o e-mail de usuário "usuario@teste.com" está cadastrado no sistema com senha indefinida + E um email de definição de senha é enviado para o email "usuario@teste.com" + + Cenário: Definir senha com sucesso (happy path) + Quando eu acesso o link de definição de senha recebido por e-mail + E eu informo a nova senha "Senha123" e confirmo a senha "Senha123" + E eu confirmo a definição de senha + Então vejo a mensagem "Senha definida com sucesso." + Quando eu tento realizar o login com o email "usuario@teste.com" e a senha "Senha123" + Então vejo a mensagem "Login realizado com sucesso." + E sou direcionado para a página inicial + + Cenário: Definição de senha com confirmação diferente (sad path) + Quando eu acesso o link de definição de senha recebido por e-mail + E eu informo a nova senha "Senha123" e confirmo a senha "Senha321" + E eu confirmo a definição de senha + Então vejo a mensagem "Falha na definição de senha: confirmação não confere" + + Cenário: Definição de senha com senha inválida (sad path) + Quando eu acesso o link de definição de senha recebido por e-mail + E eu informo a nova senha "123" e confirmo a senha "123" + E eu confirmo a definição de senha + Então vejo a mensagem "Falha na definição de senha: senha inválida" diff --git a/features/edit_delete_template.feature b/features/edit_delete_template.feature new file mode 100644 index 0000000000..761af40070 --- /dev/null +++ b/features/edit_delete_template.feature @@ -0,0 +1,60 @@ +Feature: Edit and/or delete template + + Eu como Administrador + Quero editar e/ou deletar um template que eu criei sem afetar os formulários já criados + A fim de organizar os templates existentes + + Background: + Given I am authenticated as an "Administrador" + + # criar + Scenario: Edit a template title successfully(happy path) + + # setup inicial + Given I have the following templates saved: + | titulo | + | Template Prova Matemática 2º semestre | + And the template "Template Prova Matemática 2º semestre" has the following elementos: + | enunciado_elemento | tipo_campo | enunciado_campo | + | Questão 1(2 pontos): | multipla_escolha | a: b: c: d: | + | Questão 2(2 pontos): | multipla_escolha | a: b: c: d: | + | Questão 3(3 pontos): | multipla_escolha | a: b: c: d: | + | Questão 4(3 pontos): | multipla_escolha | a: b: c: d: | + | Questão desafio(1 ponto): | multipla_escolha | a: b: c: d: | + When I go to the "Meus Templates" page + And I follow "Editar" for "Template Prova Matemática 2º semestre" + + And I change the "titulo" to "Template Matemática Atualizado" + And I change the elemento "Questão desafio(1 ponto): " to "" + And I press "Salvar" + Then I should see a success message "Template atualizado com sucesso!" + And I should see "Template Matemática Atualizado" + But I should not see "Template Prova Matemática 2º semestre" + And the template "Template Matemática Atualizado" should have the following elementos: + | enunciado_elemento | tipo_campo | enunciado_campo | + | Questão 1(2 pontos): | multipla_escolha | a: b: c: d: | + | Questão 2(2 pontos): | multipla_escolha | a: b: c: d: | + | Questão 3(3 pontos): | multipla_escolha | a: b: c: d: | + | Questão 4(3 pontos): | multipla_escolha | a: b: c: d: | + + Scenario: Attempt to edit a template with a blank title(sad path) + Given I have the following templates saved: + | titulo | + | Template Prova Matemática 2º semestre | + When I go to the "Meus Templates" page + And I follow "Editar" for "Template Prova Matemática 2º semestre" + And I change the "titulo" to "" + And I press "Salvar" + Then I should see an error message "Título não pode ficar em branco!" + + # deletar + Scenario: Delete a template successfully(happy path) + Given I have the following templates saved: + | titulo | + | Template Prova Matemática 2º semestre | + When I go to the "Meus Templates" page + And I follow "Deletar" for "Template Prova Matemática 2º semestre" + And I confirm the deletion + Then I should see a success message "Template deletado com sucesso!" + And I should not see "Template Prova Matemática 2º semestre" + diff --git a/features/gerar_relatorio_csv.feature b/features/gerar_relatorio_csv.feature new file mode 100644 index 0000000000..1178162060 --- /dev/null +++ b/features/gerar_relatorio_csv.feature @@ -0,0 +1,26 @@ +# encoding : UTF-8 +# language: pt + +Funcionalidade: Download de resultados de formulário em CSV + Eu, como Administrador + Quero baixar um arquivo csv contendo os resultados de um formulário + A fim de avaliar o desempenho das turmas + + Contexto: + Dado que estou na página de Resultados + E vejo os formulários enviados para todas as turmas do meu departamento + E existe a "Turma A" de "Estruturas de Dados" que possui um formulário associado a ela + E este formulário já possui respostas enviadas pelos alunos + + Cenário: Baixar resultados do formulário com sucesso (happy path) + Quando eu sigo "Baixar Resultado" + Então o download do arquivo "formulario da Turma A de Estruturas de Dados" é iniciado + E o arquivo deve conter as colunas Usuário da Resposta, Data de Submissão e elementos do formulário + E o arquivo deve conter como linhas as respostas de cada usuário + + Cenário: Tentar baixar CSV de um formulário que não possui respostas (sad path) + Dado que a "Turma A" possui outro formulário + E este formulário não recebeu nenhuma resposta até o momento + Quando eu sigo "Baixar Resultado" + Então vejo a mensagem de erro "Falha na exportação: Este formulário ainda não possui respostas registradas." + E nenhum download de arquivo é iniciado \ No newline at end of file diff --git a/features/importar_dados_sigaa.feature b/features/importar_dados_sigaa.feature new file mode 100644 index 0000000000..829cb1212a --- /dev/null +++ b/features/importar_dados_sigaa.feature @@ -0,0 +1,29 @@ +# encoding : UTF-8 +# language: pt + +Funcionalidade: Importar dados do SIGAA + Eu, como Administrador + Quero importar dados de turmas, matérias e participantes do SIGAA (caso não existam na base de dados atual + A fim de alimentar a base de dados do sistema + P.S. utilizar os JSONs presentes no repositório + +Contexto: + Dado que estou na página de gerenciamento + E que os dados do SIGAA estão disponíveis para importação + +Cenário: Importação de dados do SIGAA (happy path) + Dado que os dados do SIGAA foram importados com sucesso + Então as turmas, matérias e participantes do SIGAA estão presentes no sistema + +Cenário: Importação de dados do SIGAA com falha (sad path) + Dado que eu tentei importar os dados do SIGAA mas ocorreu um erro + Então uma mensagem de erro é exibida informando que a importação falhou + +Cenário: Importação de dados do SIGAA com dados já existentes (sad path) + Dado que os dados do SIGAA já existem na base de dados do sistema + Então uma mensagem é exibida informando que os dados já foram importados e não serão importados novamente + +Cenário: Importação de dados do SIGAA com dados parcialmente existentes (sad path) + Dado que alguns dados do SIGAA já existem na base de dados do sistema + Então uma mensagem é exibida informando que alguns dados já foram importados e não serão importados novamente, mas os dados restantes serão importados com sucesso + diff --git a/features/login.feature b/features/login.feature new file mode 100644 index 0000000000..51c1f73be2 --- /dev/null +++ b/features/login.feature @@ -0,0 +1,48 @@ +# encoding : UTF-8 +# language: pt + +Funcionalidade: Login no sistema + Eu, como usuário do sistema + Quero acessar o sistema utilizando um e-mail ou matrícula cadastrada + A fim de responder formulários ou gerenciar o sistema + + Cenário: Login realizado com sucesso usando e-mail válido (happy path) + Dado que meu usuário está cadastrado com o email "usuario@teste.com" e senha "Senha123" + Quando eu tento realizar o login com o email "usuario@teste.com" e a senha "Senha123" + Então vejo a mensagem "Login realizado com sucesso." + E sou direcionado para a página inicial + + Cenário: Login realizado com sucesso usando matrícula válida (happy path) + Dado que minha matrícula "261067676" está cadastrada no sistema e senha "Senha123" + Quando eu tento realizar o login com matrícula "261067676" e a senha "Senha123" + Então vejo a mensagem "Login realizado com sucesso." + E sou direcionado para a página inicial + + Cenário: Tentativa de login com a senha errada (sad path) + Dado que meu usuário está cadastrado com o email "usuario@teste.com" e senha "Senha123" + Quando eu tento realizar o login com o email "usuario@teste.com" e a senha "Senha123." + Então vejo a mensagem "Falha no login: senha incorreta" + E permaneço na página de login + + Cenário: Tentativa de login com usuário em branco (sad path) + Quando eu tento realizar o login sem informar meu email ou matrícula e com senha "Senha123" + Então vejo a mensagem "Falha no login: informe seu email ou matrícula" + E permaneço na página de login + + Cenário: Tentativa de login com senha em branco (sad path) + Quando eu tento realizar o login com email "usuario@teste.com" sem informar minha senha + Então vejo a mensagem "Falha no login: informe a sua senha" + E permaneço na página de login + + Cenário: Tentativa de login com usuário com cadastro não efetivado (sad path) + Dado que meu usuário está cadastrado com o email "usuario@teste.com" + Dado que minha senha para "usuario@teste.com" não está definida + Quando eu tento realizar o login com o email "usuario@teste.com" e a senha "Senha123" + Então vejo a mensagem "Falha no login: usuário existente deve efetivar o seu cadastro por email" + E permaneço na página de login + + Cenário: Tentativa de login com usuário não cadastrado (sad path) + Dado que meu email "usuario@teste.com" não está cadastrado no sistema + Quando eu tento realizar o login com o email "usuario@teste.com" e a senha "Senha123" + Então vejo a mensagem "Falha no login: usuário não encontrado" + E permaneço na página de login \ No newline at end of file diff --git a/features/redefinicao_senha.feature b/features/redefinicao_senha.feature new file mode 100644 index 0000000000..443145f980 --- /dev/null +++ b/features/redefinicao_senha.feature @@ -0,0 +1,64 @@ +# encoding : UTF-8 +# language: pt + +Funcionalidade: Redefinição de senha + Eu, como usuário cadastrado + Quero redefinir minha senha quando eu a esquecer + A fim de recuperar meu acesso ao sistema + + Contexto: + Dado que meu usuário está cadastrado com o email "usuario@teste.com" e senha "Senha123" + E eu estou na página de login + + Cenário: Solicitar redefinição de senha com sucesso (happy path) + Quando eu clico em "Esqueci minha senha" + E eu informo o email "usuario@teste.com" + E eu solicito a redefinição de senha + Então vejo a mensagem "Solicitação de redefinição de senha enviada." + E um email de redefinição de senha é enviado para o email "usuario@teste.com" + + Cenário: Redefinir senha com sucesso através do link (happy path) + Dado que eu solicitei a redefinição de senha para o email "usuario@teste.com" + Quando eu acesso o link de redefinição de senha recebido por e-mail + E eu informo a nova senha "NovaSenha123" e confirmo a senha "NovaSenha123" + E eu confirmo a redefinição de senha + Então vejo a mensagem "Senha redefinida com sucesso." + Quando eu tento realizar o login com o email "usuario@teste.com" e a senha "NovaSenha123" + Então vejo a mensagem "Login realizado com sucesso." + E sou direcionado para a página inicial + + Cenário: Após redefinir a senha, a senha antiga deixa de funcionar (sad path) + Dado que eu solicitei a redefinição de senha para o email "usuario@teste.com" + Quando eu acesso o link de redefinição de senha recebido por e-mail + E eu informo a nova senha "NovaSenha123" e confirmo a senha "NovaSenha123" + E eu confirmo a redefinição de senha + Então vejo a mensagem "Senha redefinida com sucesso." + Quando eu tento realizar o login com o email "usuario@teste.com" e a senha "Senha123" + Então vejo a mensagem "Falha no login: senha incorreta" + E permaneço na página de login + + Cenário: Solicitar redefinição para email não cadastrado (sad path) + Dado que meu email "naoexiste@teste.com" não está cadastrado no sistema + Quando eu clico em "Esqueci minha senha" + E eu informo o email "naoexiste@teste.com" + E eu solicito a redefinição de senha + Então vejo a mensagem "Falha na redefinição de senha: usuário não encontrado" + + Cenário: Solicitar redefinição sem informar email (sad path) + Quando eu clico em "Esqueci minha senha" + E eu solicito a redefinição de senha sem informar meu email + Então vejo a mensagem "Falha na redefinição de senha: informe seu email" + + Cenário: Redefinição com confirmação diferente (sad path) + Dado que eu solicitei a redefinição de senha para o email "usuario@teste.com" + Quando eu acesso o link de redefinição de senha recebido por e-mail + E eu informo a nova senha "NovaSenha123" e confirmo a senha "NovaSenha321" + E eu confirmo a redefinição de senha + Então vejo a mensagem "Falha na redefinição de senha: confirmação não confere" + + Cenário: Redefinição com senha inválida (sad path) + Dado que eu solicitei a redefinição de senha para o email "usuario@teste.com" + Quando eu acesso o link de redefinição de senha recebido por e-mail + E eu informo a nova senha "123" e confirmo a senha "123" + E eu confirmo a redefinição de senha + Então vejo a mensagem "Falha na redefinição de senha: senha inválida" diff --git a/features/responder_formulario.feature b/features/responder_formulario.feature new file mode 100644 index 0000000000..5a4e6ef00b --- /dev/null +++ b/features/responder_formulario.feature @@ -0,0 +1,26 @@ +# language: pt + +Funcionalidade: Visualizar e responder formulário de avaliação + Como um discente + Quero poder visualizar e responder a um formulário de avaliação + Para dar feedback sobre a turma ou disciplina + + Contexto: + Dado que eu estou logado como discente + E existe um formulário ativo para minha turma + E eu estou na página de formulários disponíveis + + Cenário: Resposta completa ao formulário com sucesso (Happy Path) + Quando eu clico para responder o formulário + Então eu devo visualizar os detalhes e perguntas pertinentes a ele + Quando eu respondo todos os campos do formulário + E eu envio o fomulário + Então eu devo ver a mensagem "Respostas enviadas com sucesso!" + E a resposta deve ser registrada no sistema + E eu não devo mais ser capaz de responder ao mesmo formulário + + Cenário: Tentativa de envio com perguntas obrigatórias em branco (Sad Path) + Quando eu clico para responder o formulário + E eu deixo uma pergunta obrigatória em branco + E eu envio o formulário + Então eu devo ver a mensagem "Por favor, responda todas as perguntas obrigatórias" diff --git a/features/step_definitions/.keep b/features/step_definitions/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/features/step_definitions/atualizar_dados_sigaa_steps.rb b/features/step_definitions/atualizar_dados_sigaa_steps.rb new file mode 100644 index 0000000000..19ede668f2 --- /dev/null +++ b/features/step_definitions/atualizar_dados_sigaa_steps.rb @@ -0,0 +1,45 @@ +# Reutilizar o gerenciamento de paginas dos outros steps + +Dado('que os dados do SIGAA foram atualizados com sucesso') do + allow(SigaaImporter).to receive(:update_from_files).and_return("atualização realizada com sucesso") + arquivo = Rack::Test::UploadedFile.new(Rails.root.join("classes.json"), "application/json") + page.driver.post(admin_sincronizar_sigaa_path(@admin), { acao: 'atualizar', arquivo_classes: arquivo, arquivo_membros: arquivo }) + visit admin_gerenciamento_path(@admin) +end + +Dado('que eu tentei atualizar os dados do SIGAA mas ocorreu um erro') do + allow(SigaaImporter).to receive(:update_from_files).and_return("falha") + arquivo = Rack::Test::UploadedFile.new(Rails.root.join("classes.json"), "application/json") + page.driver.post(admin_sincronizar_sigaa_path(@admin), { acao: 'atualizar', arquivo_classes: arquivo, arquivo_membros: arquivo }) + visit admin_gerenciamento_path(@admin) +end + +Dado('que os dados do SIGAA já estão atualizados na base de dados do sistema') do + allow(SigaaImporter).to receive(:update_from_files).and_return("os dados do SIGAA já estão atualizados e não serão atualizados novamente") + arquivo = Rack::Test::UploadedFile.new(Rails.root.join("classes.json"), "application/json") + page.driver.post(admin_sincronizar_sigaa_path(@admin), { acao: 'atualizar', arquivo_classes: arquivo, arquivo_membros: arquivo }) + visit admin_gerenciamento_path(@admin) +end + +Dado('que alguns dados do SIGAA já estão atualizados na base de dados do sistema') do + allow(SigaaImporter).to receive(:update_from_files).and_return("alguns dados já estão atualizados e não serão atualizados novamente, mas os dados restantes serão atualizados com sucesso") + arquivo = Rack::Test::UploadedFile.new(Rails.root.join("classes.json"), "application/json") + page.driver.post(admin_sincronizar_sigaa_path(@admin), { acao: 'atualizar', arquivo_classes: arquivo, arquivo_membros: arquivo }) + visit admin_gerenciamento_path(@admin) +end + +Então('as turmas, matérias e participantes do SIGAA estão atualizados no sistema com os dados atuais do SIGAA') do + expect(page).to have_content('As turmas, matérias e participantes do SIGAA estão atualizados no sistema com os dados atuais do SIGAA.') +end + +Então('uma mensagem de erro é exibida informando que a atualização falhou') do + expect(page).to have_content('erro informando que a atualização falhou') +end + +Então('uma mensagem é exibida informando que os dados já estão atualizados e não serão atualizados novamente') do + expect(page).to have_content('os dados do SIGAA já estão atualizados e não serão atualizados novamente') +end + +Então('uma mensagem é exibida informando que alguns dados já estão atualizados e não serão atualizados novamente, mas os dados restantes serão atualizados com sucesso') do + expect(page).to have_content('alguns dados já estão atualizados e não serão atualizados novamente, mas os dados restantes serão atualizados com sucesso') +end diff --git a/features/step_definitions/cadastro_steps.rb b/features/step_definitions/cadastro_steps.rb new file mode 100644 index 0000000000..f227280a07 --- /dev/null +++ b/features/step_definitions/cadastro_steps.rb @@ -0,0 +1,54 @@ +Dado('que estou na página de gerenciamento') do + departamento = Departamento.first || Departamento.create!(nome: "Ciência da Computação", codigo: "CIC") + @admin = Administrador.first || Administrador.create!( + nome: "Admin Teste", + matricula: "admin", + email: "admin@teste.com", + senha: "Senha123", + departamento: departamento + ) + + allow_any_instance_of(ApplicationController).to receive(:current_user).and_return(@admin) + + allow_any_instance_of(AdminController).to receive(:set_admin) do |controller| + controller.instance_variable_set(:@admin, Administrador.find(controller.params[:admin_id])) + end + + allow_any_instance_of(TemplatesController).to receive(:set_admin) do |controller| + controller.instance_variable_set(:@admin, Administrador.find(controller.params[:admin_id])) + end + + visit admin_gerenciamento_path(@admin) +end + +Dado('que eu importei os dados do SIGAA com sucesso') do + dep = Departamento.find_or_create_by!(codigo: "NAO_ESP") { |d| d.nome = "Não especificado" } + curso = Curso.find_or_create_by!(codigo: "TST") do |c| + c.nome = "Curso Teste" + c.departamento = dep + end + Discente.find_or_create_by!(matricula: "USR001") do |u| + u.nome = "Usuário Teste" + u.email = "usuario@teste.com" + u.curso = curso + end +end + +Então('o e-mail de usuário {string} está cadastrado no sistema com senha indefinida') do |email| + usuario = Usuario.find_by(email: email) + expect(usuario).to be_present, + "Esperava encontrar um usuário com email '#{email}', mas não encontrei." + expect(usuario.senha_hash).to be_blank, + "Esperava que o usuário '#{email}' não tivesse senha definida, mas tinha." +end + +Então('um email de definição de senha é enviado para o email {string}') do |email| + usuario = Usuario.find_by!(email: email) + ActionMailer::Base.deliveries.clear + usuario.enviar_email_definicao_senha! + + @email_destino = email + + enviados = ActionMailer::Base.deliveries.select { |m| m.to == [ email ] } + expect(enviados).not_to be_empty +end diff --git a/features/step_definitions/criar_formulario_steps.rb b/features/step_definitions/criar_formulario_steps.rb new file mode 100644 index 0000000000..e78d60cf02 --- /dev/null +++ b/features/step_definitions/criar_formulario_steps.rb @@ -0,0 +1,99 @@ +# frozen_string_literal: true + +Dado('que eu estou logado como professor') do + departamento = Departamento.find_or_create_by!(nome: 'Departamento de Teste', codigo: 'TST') + + @admin = Administrador.find_or_create_by!(email: 'professor@teste.com') do |a| + a.nome = 'Professor Teste' + a.matricula = 'prof001' + a.senha = 'Senha123' + a.senha_confirmation = 'Senha123' + a.departamento = departamento + end + + allow_any_instance_of(ApplicationController).to receive(:current_user).and_return(@admin) + allow_any_instance_of(AdminController).to receive(:set_admin) do |controller| + controller.instance_variable_set(:@admin, @admin) + end +end + +Dado('eu estou na página de criação de formulários') do + departamento = Departamento.find_or_create_by!(nome: 'Departamento de Teste', codigo: 'TST') + + disciplina = Disciplina.find_or_create_by!(codigo: 'CIC0001') do |d| + d.nome = 'Engenharia de Software' + d.departamento = departamento + end + + @turma = Turma.find_or_create_by!( + disciplina: disciplina, + numero_da_turma: '01', + semestre: '2026.1' + ) do |t| + t.horario = '235M12' + end + + @template = Template.find_or_create_by!(nome: 'Avaliação Padrão', usuario_id: @admin.id) do |t| + elemento = t.elementos.build(enunciado: 'Como você avalia o professor?', ordem: 1) + elemento.campos.build( + tipo_elemento: 'Múltipla Escolha', + enunciado: 'Ótimo', + ordem: 1 + ) + elemento.campos.build( + tipo_elemento: 'Múltipla Escolha', + enunciado: 'Bom', + ordem: 2 + ) + elemento.campos.build( + tipo_elemento: 'Múltipla Escolha', + enunciado: 'Regular', + ordem: 3 + ) + elemento.campos.build( + tipo_elemento: 'Múltipla Escolha', + enunciado: 'Ruim', + ordem: 4 + ) + end + + visit admin_enviar_formularios_path(@admin) +end + +Quando('eu escolho um template para o formulário') do + select @template.nome, from: 'template_id' +end + +Quando('escolho um template para o formulário') do + select @template.nome, from: 'template_id' +end + +Quando('escolho uma turma para enviar o formulário') do + check "turma_ids_#{@turma.id}" +end + +Quando('envio o formulário') do + click_button 'Criar Formulário' +end + +Quando('eu não escolho um template para o formulário') do + # deliberately do nothing - leave template select at default blank option +end + +Quando('eu não escolho uma turma para enviar o formulário') do + # deliberately do nothing - leave no turma checkboxes checked +end + +Então('eu devo ver a mensagem {string}') do |mensagem| + expect(page).to have_content(mensagem) +end + +Então('o formulário deve estar disponível para os alunos da turma selecionada') do + formulario = Formulario.find_by(turma: @turma) + expect(formulario).to be_present + expect(formulario.titulo).to eq("#{@turma.disciplina.nome} - #{@turma.semestre}") + + elemento_forms_count = formulario.elemento_forms.count + template_elementos_count = @template.elementos.count + expect(elemento_forms_count).to eq(template_elementos_count) +end diff --git a/features/step_definitions/criar_formulario_template_steps.rb b/features/step_definitions/criar_formulario_template_steps.rb new file mode 100644 index 0000000000..1d272a0e30 --- /dev/null +++ b/features/step_definitions/criar_formulario_template_steps.rb @@ -0,0 +1,158 @@ +# frozen_string_literal: true + +# Step definitions for: Criar formulário baseado em template + +Dado('que eu estou logado como administrador') do + depto = Departamento.find_or_create_by!(nome: 'Departamento', codigo: 'TST') + + @admin = Administrador.find_or_create_by!(email: 'admin@unb.br') do |u| + u.senha_hash = '123456' + u.nome = 'Admin' + u.matricula = '123456789' + u.departamento = depto + end + + allow_any_instance_of(ApplicationController).to receive(:current_user).and_return(@admin) + + allow_any_instance_of(AdminController).to receive(:set_admin) do |controller| + controller.instance_variable_set(:@admin, @admin) + end +end + +Dado('que existe um template chamado {string} com as seguintes perguntas:') do |nome_template, table| + @admin ||= Administrador.first + + @template = Template.new(nome: nome_template, administrador: @admin) + + table.hashes.each_with_index do |row, index| + elemento = @template.elementos.build(enunciado: row['Pergunta'], ordem: index + 1) + + tipo = row['Tipo'] + opcoes_str = row['Opções'] || '' + + if tipo == 'Texto' || opcoes_str.blank? + elemento.campos.build(tipo_elemento: 'Texto', ordem: 1) + else + opcoes = opcoes_str.split(',').map(&:strip) + opcoes.each_with_index do |opcao, opt_idx| + elemento.campos.build(tipo_elemento: tipo, enunciado: opcao, ordem: opt_idx + 1) + end + end + end + + @template.save! +end + +Dado('que existem as seguintes turmas no semestre {string}:') do |semestre, table| + depto = Departamento.find_or_create_by!(nome: 'Departamento', codigo: 'TST') + + table.hashes.each do |row| + disciplina = Disciplina.find_or_create_by!(codigo: row['Código']) do |d| + d.nome = row['Disciplina'] + d.departamento = depto + end + + Turma.find_or_create_by!( + disciplina: disciplina, + numero_da_turma: row['Turma'], + semestre: semestre + ) do |t| + t.horario = 'Seg 08:00-10:00' + end + end + + @turmas_disponiveis = Turma.where(semestre: semestre) +end + +Quando('eu acesso a página de criação de formulário a partir de template') do + visit admin_enviar_formularios_path(@admin) +end + +Quando('eu seleciono o template {string}') do |nome_template| + select nome_template, from: 'template_id' +end + +Quando('eu não seleciono nenhum template') do + # Garante que o campo de template permanece em branco + select 'Template', from: 'template_id' +end + +Quando('eu seleciono as turmas {string}') do |turma_info| + partes = turma_info.split(' - ') + codigo = partes[0] + nome_disciplina = partes[1] + numero_turma = partes[2] + + disciplina = Disciplina.find_by!(codigo: codigo, nome: nome_disciplina) + turma = Turma.find_by!(disciplina: disciplina, numero_da_turma: numero_turma) + check "turma_ids_#{turma.id}" +end + +Quando('eu seleciono as turmas {string} e {string}') do |turma1_info, turma2_info| + [ turma1_info, turma2_info ].each do |turma_info| + partes = turma_info.split(' - ') + codigo = partes[0] + nome_disciplina = partes[1] + numero_turma = partes[2] + + disciplina = Disciplina.find_by!(codigo: codigo, nome: nome_disciplina) + turma = Turma.find_by!(disciplina: disciplina, numero_da_turma: numero_turma) + check "turma_ids_#{turma.id}" + end +end + +Quando('eu clico em {string}') do |botao| + click_button botao +end + +Quando('eu não seleciono nenhuma turma') do + # Nenhum checkbox marcado — ação implícita +end + +Então('o formulário deve conter as perguntas do template {string}') do |nome_template| + template = Template.find_by!(nome: nome_template) + formulario = Formulario.last + expect(formulario.elemento_forms.count).to eq(template.elementos.count) + formulario.elemento_forms.order(:ordem).each_with_index do |ef, i| + expect(ef.enunciado).to eq(template.elementos.order(:ordem)[i].enunciado) + end +end + +Então('o formulário deve estar associado à turma {string}') do |nome_turma_info| + partes = nome_turma_info.split(' - ') + nome_disciplina = partes[0] + numero_turma = partes[1] + + disciplina = Disciplina.find_by!(nome: nome_disciplina) + turma = Turma.find_by!(disciplina: disciplina, numero_da_turma: numero_turma) + expect(Formulario.last.turma).to eq(turma) +end + +Então('deve existir um formulário para a turma {string}') do |nome_turma_info| + partes = nome_turma_info.split(' - ') + nome_disciplina = partes[0] + numero_turma = partes[1] + + disciplina = Disciplina.find_by!(nome: nome_disciplina) + turma = Turma.find_by!(disciplina: disciplina, numero_da_turma: numero_turma) + expect(Formulario.exists?(turma: turma)).to be true +end + +Então('cada formulário deve conter as perguntas do template {string}') do |nome_template| + template = Template.find_by!(nome: nome_template) + Formulario.all.each do |formulario| + expect(formulario.elemento_forms.count).to eq(template.elementos.count) + end +end + +Então('eu devo ver a lista de templates disponíveis') do + Template.all.each do |template| + expect(page).to have_content(template.nome) + end +end + +Então('eu devo ver a lista de turmas do semestre {string} disponíveis') do |semestre| + Turma.where(semestre: semestre).each do |turma| + expect(page).to have_content(turma.disciplina.nome) + end +end diff --git a/features/step_definitions/exportar_csv_steps.rb b/features/step_definitions/exportar_csv_steps.rb new file mode 100644 index 0000000000..6574601495 --- /dev/null +++ b/features/step_definitions/exportar_csv_steps.rb @@ -0,0 +1,204 @@ +# encoding: UTF-8 + +require 'csv' + +Dado("que estou na página de Resultados") do + @departamento = Departamento.create!( + codigo: "DEP01", + nome: "Departamento de Computação" + ) + + @admin = Administrador.create!( + matricula: "ADM001", + nome: "Admin Teste", + email: "admin@teste.com", + departamento: @departamento + ) + + # Reutiliza o step de login já existente nos steps de autenticação + step 'que meu usuário está cadastrado com o email "admin@teste.com" e senha "senha123"' + step 'eu tento realizar o login com o email "admin@teste.com" e a senha "senha123"' + + visit admin_resultados_path(@admin) +end + +Dado("vejo os formulários enviados para todas as turmas do meu departamento") do + expect(page).to have_current_path(admin_resultados_path(@admin)) +end + +Dado("existe a {string} de {string} que possui um formulário associado a ela") do |nome_turma, nome_disciplina| + @disciplina = Disciplina.create!( + codigo: "ED001", + nome: nome_disciplina, + departamento: @departamento + ) + + @turma = Turma.create!( + numero_da_turma: nome_turma, + semestre: "2024.1", + horario: "SEG 08:00-10:00", + disciplina: @disciplina + ) + + @formulario = Formulario.create!(turma: @turma) + + @elemento1 = ElementoForm.create!( + ordem: 1, + enunciado: "Como você avalia o professor?", + formulario: @formulario + ) + + @elemento2 = ElementoForm.create!( + ordem: 2, + enunciado: "Como você avalia a disciplina?", + formulario: @formulario + ) +end + +Dado("este formulário já possui respostas enviadas pelos alunos") do + @curso_aluno = Curso.create!( + codigo: "CC01", + nome: "Ciência da Computação", + departamento: @departamento + ) + + @aluno = Discente.create!( + matricula: "ALU001", + nome: "Aluno Teste", + email: "aluno@teste.com", + curso: @curso_aluno, + departamento: @departamento + ) + + @resposta = RespostaForm.create!( + formulario: @formulario, + usuario: @aluno, + data_submissao: Date.today + ) + + @template = Template.new(nome: "Template Padrão", administrador: @admin) + elemento_base = @template.elementos.build(ordem: 1, enunciado: "Avaliação") + elemento_base.campos.build(ordem: 1, enunciado: "Muito bom", tipo_elemento: "Múltipla Escolha") + elemento_base.campos.build(ordem: 2, enunciado: "Excelente", tipo_elemento: "Múltipla Escolha") + @template.save! + + [ @elemento1, @elemento2 ].each do |ef| + elemento_base.campos.each do |campo_base| + CampoForm.find_or_create_by!(enunciado: campo_base.enunciado, elemento_form: ef) do |cf| + cf.ordem = campo_base.ordem + end + end + end + + { + @elemento1 => "Muito bom", + @elemento2 => "Excelente" + }.each do |ef, texto| + cf = ef.campo_forms.find_by!(enunciado: texto) + + RespostaElem.create!( + texto_resposta: texto, + resposta_form: @resposta, + elemento_form: ef, + campo_form: cf + ) + end + + visit admin_resultados_path(@admin) +end + + +# Happy Path + +Quando("eu sigo {string}") do |link| + formulario_alvo = defined?(@formulario_vazio) ? @formulario_vazio : @formulario + find(:link, link, href: /#{formulario_alvo.id}/).click +end + +Então("o download do arquivo {string} é iniciado") do |_nome_ignorado| + num_turma = @formulario.turma.numero_da_turma.parameterize(separator: '_') + nome_materia = @formulario.turma.disciplina.nome.parameterize(separator: '_') + nome_esperado = "formulario_#{@formulario.id}_turma_#{num_turma}_#{nome_materia}" + + content_disposition = page.response_headers["Content-Disposition"] + + expect(content_disposition).to be_present, + "Esperava um header Content-Disposition indicando download, mas não havia nenhum." + + expect(content_disposition).to include("attachment"), + "Esperava 'attachment' no Content-Disposition, mas foi: #{content_disposition}" + + expect(content_disposition).to include(nome_esperado), + "Esperava '#{nome_esperado}' no nome do arquivo, " \ + "mas o header foi: #{content_disposition}" +end + +Então("o arquivo deve conter as colunas Usuário da Resposta, Data de Submissão e elementos do formulário") do + csv_content = CSV.parse(page.body) + cabecalho = csv_content.first + + expect(cabecalho).to include("Usuário da Resposta"), + "Esperava a coluna 'Usuário da Resposta' no cabeçalho, mas foi: #{cabecalho.inspect}" + + expect(cabecalho).to include("Data de Submissão"), + "Esperava a coluna 'Data de Submissão' no cabeçalho, mas foi: #{cabecalho.inspect}" + + ElementoForm.where(formulario_id: @formulario.id).order(:ordem).each do |elem| + expect(cabecalho).to include(elem.enunciado), + "Esperava a coluna '#{elem.enunciado}' no cabeçalho, mas foi: #{cabecalho.inspect}" + end +end + +Então("o arquivo deve conter como linhas as respostas de cada usuário") do + csv_content = CSV.parse(page.body) + + linhas_de_dados = csv_content[1..] + + expect(linhas_de_dados).not_to be_empty, + "Esperava pelo menos uma linha de dados no CSV, mas o arquivo só possui o cabeçalho." + + nomes_nas_linhas = linhas_de_dados.map(&:first) + expect(nomes_nas_linhas).to include(@aluno.nome), + "Esperava encontrar '#{@aluno.nome}' nas linhas de dados, mas encontrei: #{nomes_nas_linhas.inspect}" + + RespostaElem.where(resposta_form_id: @resposta.id).each do |re| + conteudo_csv = linhas_de_dados.flatten + expect(conteudo_csv).to include(re.texto_resposta), + "Esperava encontrar a resposta '#{re.texto_resposta}' no CSV." + end +end + +# Sad Path + +Dado("que a {string} possui outro formulário") do |nome_turma| + @turma_sad = Turma.find_by(numero_da_turma: nome_turma) || @turma + + @formulario_vazio = Formulario.create!(turma: @turma_sad) + + ElementoForm.create!( + ordem: 1, + enunciado: "Pergunta sem respostas", + formulario: @formulario_vazio + ) +end + +Dado("este formulário não recebeu nenhuma resposta até o momento") do + expect( + RespostaForm.where(formulario_id: @formulario_vazio.id).count + ).to eq(0), "Esperava 0 respostas para o formulário vazio, mas havia algumas." + + visit admin_resultados_path(@admin) +end + +Então("vejo a mensagem de erro {string}") do |mensagem_esperada| + expect(page).to have_content(mensagem_esperada), + "Esperava ver '#{mensagem_esperada}' na página, mas não encontrei." +end + +Então("nenhum download de arquivo é iniciado") do + content_disposition = page.response_headers["Content-Disposition"] + + expect(content_disposition).to be_nil.or( + satisfy { |cd| !cd.to_s.include?("attachment") } + ), "Não esperava um header de download 'attachment', mas encontrei: #{content_disposition}" +end diff --git a/features/step_definitions/importar_dados_sigaa_steps.rb b/features/step_definitions/importar_dados_sigaa_steps.rb new file mode 100644 index 0000000000..5c5d86b942 --- /dev/null +++ b/features/step_definitions/importar_dados_sigaa_steps.rb @@ -0,0 +1,48 @@ + +Dado('que os dados do SIGAA estão disponíveis para importação') do + # Por padrão, o SigaaImporter importará os dados do arquivo JSON enviado, então não é necessário configurar nada aqui. +end + +Dado('que os dados do SIGAA foram importados com sucesso') do + allow(SigaaImporter).to receive(:import_from_files).and_return("importação realizada com sucesso") + arquivo = Rack::Test::UploadedFile.new(Rails.root.join("classes.json"), "application/json") + page.driver.post(admin_sincronizar_sigaa_path(@admin), { acao: 'importar', arquivo_classes: arquivo, arquivo_membros: arquivo }) + visit admin_gerenciamento_path(@admin) +end + +Dado('que eu tentei importar os dados do SIGAA mas ocorreu um erro') do + allow(SigaaImporter).to receive(:import_from_files).and_return("a importação falhou") + arquivo = Rack::Test::UploadedFile.new(Rails.root.join("classes.json"), "application/json") + page.driver.post(admin_sincronizar_sigaa_path(@admin), { acao: 'importar', arquivo_classes: arquivo, arquivo_membros: arquivo }) + visit admin_gerenciamento_path(@admin) +end + +Dado('que os dados do SIGAA já existem na base de dados do sistema') do + allow(SigaaImporter).to receive(:import_from_files).and_return("os dados já existem e não foram duplicados") + arquivo = Rack::Test::UploadedFile.new(Rails.root.join("classes.json"), "application/json") + page.driver.post(admin_sincronizar_sigaa_path(@admin), { acao: 'importar', arquivo_classes: arquivo, arquivo_membros: arquivo }) + visit admin_gerenciamento_path(@admin) +end + +Dado('que alguns dados do SIGAA já existem na base de dados do sistema') do + allow(SigaaImporter).to receive(:import_from_files).and_return("alguns dados já foram importados e não serão importados novamente") + arquivo = Rack::Test::UploadedFile.new(Rails.root.join("classes.json"), "application/json") + page.driver.post(admin_sincronizar_sigaa_path(@admin), { acao: 'importar', arquivo_classes: arquivo, arquivo_membros: arquivo }) + visit admin_gerenciamento_path(@admin) +end + +Então('as turmas, matérias e participantes do SIGAA estão presentes no sistema') do + expect(page).to have_content('As turmas, matérias e participantes do SIGAA estão presentes no sistema') +end + +Então('uma mensagem de erro é exibida informando que a importação falhou') do + expect(page).to have_content('erro informando que a importação falhou') +end + +Então('uma mensagem é exibida informando que os dados já foram importados e não serão importados novamente') do + expect(page).to have_content('os dados do SIGAA já existem na base de dados do sistema e não serão importados novamente') +end + +Então('uma mensagem é exibida informando que alguns dados já foram importados e não serão importados novamente, mas os dados restantes serão importados com sucesso') do + expect(page).to have_content('alguns dados já foram importados e não serão importados novamente, mas os dados restantes serão importados com sucesso') +end diff --git a/features/step_definitions/login_steps.rb b/features/step_definitions/login_steps.rb new file mode 100644 index 0000000000..8830713eef --- /dev/null +++ b/features/step_definitions/login_steps.rb @@ -0,0 +1,75 @@ +Dado('eu estou na página de login') do + visit root_path +end + +Dado('que meu usuário está cadastrado com o email {string}') do |email| + Usuario.find_or_create_by!(email: email) do |u| + u.matricula = "#{rand(100000..999999)}" + u.nome = "Usuário Teste" + end +end + +Dado('que meu email {string} não está cadastrado no sistema') do |email| + Usuario.where(email: email).delete_all +end + +Dado('que meu usuário está cadastrado com o email {string} e senha {string}') do |email, senha| + usuario = Usuario.find_or_initialize_by(email: email) + usuario.matricula ||= "#{rand(100000..999999)}" + usuario.nome ||= "Usuário Teste" + usuario.senha = senha + usuario.senha_confirmation = senha + usuario.save! +end + +Dado('que minha matrícula {string} está cadastrada no sistema e senha {string}') do |matricula, senha| + usuario = Usuario.find_or_initialize_by(matricula: matricula) + usuario.email ||= "#{matricula}@teste.com" + usuario.nome ||= "Usuário Teste" + usuario.senha = senha + usuario.senha_confirmation = senha + usuario.save! +end + +Dado('que minha senha para {string} não está definida') do |email| + usuario = Usuario.find_by!(email: email) + usuario.update!(senha_hash: nil) +end + +Quando('eu tento realizar o login com o email {string} e a senha {string}') do |email_usuario, senha_usuario| + visit root_path + fill_in "login", with: email_usuario + fill_in "senha", with: senha_usuario + click_button "Entrar" +end + +Quando('eu tento realizar o login com matrícula {string} e a senha {string}') do |matricula_usuario, senha_usuario| + visit root_path + fill_in "login", with: matricula_usuario + fill_in "senha", with: senha_usuario + click_button "Entrar" +end + +Quando('eu tento realizar o login sem informar meu email ou matrícula e com senha {string}') do |senha_usuario| + visit root_path + fill_in "senha", with: senha_usuario + click_button "Entrar" +end + +Quando('eu tento realizar o login com email {string} sem informar minha senha') do |email_usuario| + visit root_path + fill_in "login", with: email_usuario + click_button "Entrar" +end + +Então('vejo a mensagem {string}') do |string| + expect(page).to have_content(string) +end + +Então('permaneço na página de login') do + expect(page).to have_current_path(root_path) +end + +Então('sou direcionado para a página inicial') do + expect(page).to have_current_path(/\/(admin\/\d+|usuarios\/\d+)\/avaliacoes/) +end diff --git a/features/step_definitions/responder_formulario_steps.rb b/features/step_definitions/responder_formulario_steps.rb new file mode 100644 index 0000000000..32bac21f8a --- /dev/null +++ b/features/step_definitions/responder_formulario_steps.rb @@ -0,0 +1,107 @@ +Dado('que eu estou logado como discente') do + depto = Departamento.find_or_create_by!(nome: 'Departamento', codigo: 'TST') + curso = Curso.find_or_create_by!(codigo: 'TST') do |c| + c.nome = 'Curso Teste' + c.departamento = depto + end + + @discente = Discente.find_or_create_by!(matricula: '2024001') do |u| + u.nome = 'Discente Teste' + u.email = 'discente@teste.com' + u.senha = 'Senha123' + u.senha_confirmation = 'Senha123' + u.curso = curso + end + + allow_any_instance_of(ApplicationController).to receive(:current_user).and_return(@discente) +end + +Dado('existe um formulário ativo para minha turma') do + depto = Departamento.find_or_create_by!(nome: 'Departamento', codigo: 'TST') + disciplina = Disciplina.find_or_create_by!(codigo: 'CIC0001') do |d| + d.nome = 'Engenharia de Software' + d.departamento = depto + end + + turma = Turma.find_or_create_by!( + disciplina: disciplina, + numero_da_turma: '01', + semestre: '2026.1' + ) do |t| + t.horario = '235M12' + end + + @discente.turmas << turma unless @discente.turmas.include?(turma) + + @formulario = Formulario.find_or_create_by!(turma: turma) do |f| + f.titulo = 'Avaliação de Turma 2026.1' + end + + elemento = @formulario.elemento_forms.find_or_create_by!(ordem: 1) do |ef| + ef.enunciado = 'Como você avalia o professor?' + ef.tipo = 'Múltipla Escolha' + end + + elemento.campo_forms.find_or_create_by!(ordem: 1) { |c| c.enunciado = 'Ótimo' } + elemento.campo_forms.find_or_create_by!(ordem: 2) { |c| c.enunciado = 'Bom' } + elemento.campo_forms.find_or_create_by!(ordem: 3) { |c| c.enunciado = 'Regular' } + elemento.campo_forms.find_or_create_by!(ordem: 4) { |c| c.enunciado = 'Ruim' } + + elemento2 = @formulario.elemento_forms.find_or_create_by!(ordem: 2) do |ef| + ef.enunciado = 'Comente sobre a didática' + ef.tipo = 'Texto' + end + + elemento2.campo_forms.find_or_create_by!(ordem: 1) +end + +Dado('eu estou na página de formulários disponíveis') do + visit usuarios_avaliacoes_path(@discente) +end + +Quando('eu clico para responder o formulário') do + click_link @formulario.turma.disciplina.nome +end + +Então('eu devo visualizar os detalhes e perguntas pertinentes a ele') do + @formulario.elemento_forms.each do |ef| + expect(page).to have_content(ef.enunciado) + end +end + +Quando('eu respondo todos os campos do formulário') do + @formulario.elemento_forms.order(:ordem).each do |ef| + if ef.tipo == 'Texto' + fill_in "respostas[#{ef.id}]", with: 'Uma resposta qualquer' + else + primeiro_campo = ef.campo_forms.order(:ordem).first + find("input[type='radio'][name='respostas[#{ef.id}]'][value='#{primeiro_campo.id}']").click + end + end +end + +Quando('eu envio o fomulário') do + click_button type: 'submit' +end + +Quando('eu envio o formulário') do + click_button type: 'submit' +end + +# Então('eu devo ver a mensagem {string}') do |mensagem| +# expect(page).to have_content(mensagem) +# end + +Então('a resposta deve ser registrada no sistema') do + expect(RespostaForm.exists?(formulario: @formulario, usuario: @discente)).to be true +end + +Então('eu não devo mais ser capaz de responder ao mesmo formulário') do + click_link @formulario.turma.disciplina.nome + expect(page).to have_content("Você já respondeu este formulário.") +end + +Quando('eu deixo uma pergunta obrigatória em branco') do + campo_texto = @formulario.elemento_forms.find_by(tipo: 'Texto') + fill_in "respostas[#{campo_texto.id}]", with: '' +end diff --git a/features/step_definitions/senha_steps.rb b/features/step_definitions/senha_steps.rb new file mode 100644 index 0000000000..e360e4907b --- /dev/null +++ b/features/step_definitions/senha_steps.rb @@ -0,0 +1,76 @@ +Dado('que o e-mail de usuário {string} está cadastrado no sistema com senha indefinida') do |email| + usuario = Usuario.find_or_initialize_by(email: email) + usuario.matricula ||= "#{rand(100000..999999)}" + usuario.nome ||= "Usuário Teste" + usuario.senha_hash = nil + usuario.save! +end + +Quando('eu acesso o link de definição de senha recebido por e-mail') do + email_destino = @email_destino || raise("Email de destino não definido nos steps") + + mensagem = ActionMailer::Base.deliveries.reverse.find { |m| m.to == [ email_destino ] } + raise("Nenhum email enviado para #{email_destino}") if mensagem.nil? + + corpo = mensagem.text_part&.body&.decoded || mensagem.html_part&.body&.decoded || mensagem.body.decoded + url = corpo[%r{https?://\S+}] + raise("Não encontrei URL no email") if url.nil? + + visit url +end + +Quando('eu informo a nova senha {string} e confirmo a senha {string}') do |senha, confirmacao| + fill_in "senha", with: senha + fill_in "senha_confirmation", with: confirmacao +end + +Quando('eu confirmo a definição de senha') do + click_button "Definir senha" +end + +Quando('eu informo o email {string}') do |email| + fill_in "email", with: email +end + +Quando('eu solicito a redefinição de senha') do + click_button "Solicitar redefinição" +end + +Quando('eu solicito a redefinição de senha sem informar meu email') do + click_button "Solicitar redefinição" +end + +Então('um email de redefinição de senha é enviado para o email {string}') do |email| + usuario = Usuario.find_by!(email: email) + ActionMailer::Base.deliveries.clear + usuario.enviar_email_redefinicao_senha! + + @email_destino = email + + enviados = ActionMailer::Base.deliveries.select { |m| m.to == [ email ] } + expect(enviados).not_to be_empty +end + +Dado('que eu solicitei a redefinição de senha para o email {string}') do |email| + usuario = Usuario.find_by!(email: email) + ActionMailer::Base.deliveries.clear + usuario.enviar_email_redefinicao_senha! + @email_destino = email +end + +Quando('eu acesso o link de redefinição de senha recebido por e-mail') do + email_destino = @email_destino || raise("Email de destino não definido nos steps") + + mensagem = ActionMailer::Base.deliveries.reverse.find { |m| m.to == [ email_destino ] } + raise("Nenhum email enviado para #{email_destino}") if mensagem.nil? + + corpo = mensagem.text_part&.body&.decoded || mensagem.html_part&.body&.decoded || mensagem.body.decoded + url = corpo[%r{https?://\S+}] + raise("Não encontrei URL no email") if url.nil? + + visit url +end + +Quando('eu confirmo a redefinição de senha') do + click_button "Redefinir senha" +end diff --git a/features/step_definitions/template_steps.rb b/features/step_definitions/template_steps.rb new file mode 100644 index 0000000000..4a0a1928ae --- /dev/null +++ b/features/step_definitions/template_steps.rb @@ -0,0 +1,173 @@ +Given(/^I [aA]m authenticated as an "([^"]*)"$/) do |role| + depto = Departamento.find_or_create_by!(nome: 'Departamento', codigo: 'TST') + + @admin = Administrador.find_or_create_by!(email: 'admin@unb.br') do |u| + u.senha_hash = '123456' + u.nome = 'Admin' + u.matricula = '123456789' + u.departamento = depto + end + + allow_any_instance_of(ApplicationController).to receive(:current_user).and_return(@admin) + + allow_any_instance_of(TemplatesController).to receive(:set_admin) do |controller| + controller.instance_variable_set(:@admin, @admin) + end +end + +Given('I Am on the home page') do + visit inicio_path +end + +Given('I go to the {string} page') do |page| + admin = Administrador.first + visit admin_templates_path(admin) if page == "Meus Templates" +end + +Given('I am on the {string} page') do |page_name| + expect(page).to have_content("Nome do template:") +end + +When('I follow {string}') do |link| + if link == "Adicionar novo template" + admin = Administrador.first + visit new_admin_template_path(admin) + else + click_link_or_button(link) + end +end + +When('I follow {string} for {string}') do |acao, template_nome| + card = find('.card', text: template_nome) + card.find("[aria-label='#{acao}']").click +end + +When('I press {string}') do |botao| + if page.has_button?('Criar') + click_button 'Criar' + else + click_button 'Salvar' + end +end + +When('I confirm the deletion') do +end + +Given('I have added the template') do |table| + dados = table.rows_hash + valor = dados['titulo'].gsub(/^"|"$/, '') + fill_in "Nome do template:", with: valor +end + +Given('I add the following elementos:') do |table| + table.hashes.each_with_index do |row, index| + find('.add-question-btn', visible: :all).click if index > 0 + + within all('.question-block:not(.deleted-block)').last do + find('.figma-input-line-full[placeholder="Digite a pergunta..."]').set(row['enunciado_elemento']) + + tipo = row['tipo_campo'] == 'multipla_escolha' ? 'Múltipla Escolha' : 'Texto' + find('.select-tipo').find("option[value='#{tipo}']").select_option + + if tipo == 'Múltipla Escolha' + opcoes = row['enunciado_campo'].split(':').map(&:strip).reject(&:empty?) + opcoes.each_with_index do |opcao, opt_idx| + find('.btn-add-option').click if opt_idx > 0 + all('.option-row:not(.deleted-option) input.figma-input-line-full').last.set(opcao) + end + end + end + end +end + +Given('I dont add elementos') do + find('input.destroy-question-input', visible: :hidden).set('1') +end + +When('I change the {string} to {string}') do |campo, valor| + fill_in "Nome do template:", with: valor if campo == "titulo" +end + +When('I change the elemento {string} to {string}') do |antigo, novo| + if novo.empty? + input = find("input.figma-input-line-full[value='#{antigo.strip}']") + bloco = input.ancestor('.question-block') + within(bloco) do + find('input.destroy-question-input', visible: :hidden).set('1') + end + else + input = find("input.figma-input-line-full[value='#{antigo.strip}']") + input.set(novo) + end +end + +Then('I should see a success message {string}') do |msg| + expect(page).to have_content(msg) +end + +Then('I should see an error message {string}') do |msg| + expect(page).to have_content(msg) +end + +Then('the template {string} should be listed in my templates') do |nome| + expect(page).to have_content(nome) +end + +Then('I should see {string}') do |texto| + expect(page).to have_content(texto) +end + +Then('I should not see {string}') do |texto| + expect(page).not_to have_content(texto) +end + +Then('I should see the message {string}') do |msg| + expect(page).to have_content(msg) +end + +Then('I should see options to {string} and {string} for each template') do |acao1, acao2| + expect(page).to have_selector("[aria-label='#{acao1}']") + expect(page).to have_selector("[aria-label='#{acao2}']") +end + +Then('I should see a button {string}') do |botao| + expect(page).to have_selector("a, button", text: botao) +end + +Then('the template {string} should have the following elementos:') do |nome, table| + template = Template.find_by(nome: nome) + expect(template.elementos.count).to eq(table.hashes.count) +end + +Given('I have the following templates saved:') do |table| + admin = Administrador.first + table.hashes.each do |row| + template = Template.new(nome: row['titulo'], administrador: admin) + elemento = template.elementos.build(enunciado: "Questão Fantasma", ordem: 1) + elemento.campos.build(tipo_elemento: "Texto", ordem: 1) + template.save! + end +end + +Given('the template {string} has the following elementos:') do |nome, table| + template = Template.find_by(nome: nome) + template.elementos.destroy_all # Limpa a fantasma + + table.hashes.each_with_index do |row, index| + tipo = row['tipo_campo'] == 'multipla_escolha' ? 'Múltipla Escolha' : 'Texto' + elemento = template.elementos.create!(enunciado: row['enunciado_elemento'], ordem: index + 1) + + if tipo == 'Múltipla Escolha' + opcoes = row['enunciado_campo'].split(':').map(&:strip).reject(&:empty?) + opcoes.each_with_index do |opcao, opt_idx| + elemento.campos.create!(tipo_elemento: tipo, enunciado: opcao, ordem: opt_idx + 1) + end + else + elemento.campos.create!(tipo_elemento: tipo, ordem: 1) + end + end +end + +Given('I have no templates saved') do + Template.destroy_all +end diff --git a/features/support/env.rb b/features/support/env.rb new file mode 100644 index 0000000000..c35be5524c --- /dev/null +++ b/features/support/env.rb @@ -0,0 +1,72 @@ +# IMPORTANT: This file is generated by cucumber-rails - edit at your own peril. +# It is recommended to regenerate this file in the future when you upgrade to a +# newer version of cucumber-rails. Consider adding your own code to a new file +# instead of editing this one. Cucumber will automatically load all features/**/*.rb +# files. + +require 'simplecov' +SimpleCov.start 'rails' do + add_filter '/spec/' + add_filter '/config/' +end +SimpleCov.command_name 'Cucumber' + +require 'cucumber/rails' + +# By default, any exception happening in your Rails application will bubble up +# to Cucumber so that your scenario will fail. This is a different from how +# your application behaves in the production environment, where an error page will +# be rendered instead. +# +# Sometimes we want to override this default behaviour and allow Rails to rescue +# exceptions and display an error page (just like when the app is running in production). +# Typical scenarios where you want to do this is when you test your error pages. +# There are two ways to allow Rails to rescue exceptions: +# +# 1) Tag your scenario (or feature) with @allow-rescue +# +# 2) Set the value below to true. Beware that doing this globally is not +# recommended as it will mask a lot of errors for you! +# +ActionController::Base.allow_rescue = false + +# Remove/comment out the lines below if your app doesn't have a database. +# For some databases (like MongoDB and CouchDB) you may need to use :truncation instead. +begin + DatabaseCleaner.strategy = :transaction +rescue NameError + raise "You need to add database_cleaner to your Gemfile (in the :test group) if you wish to use it." +end + +# You may also want to configure DatabaseCleaner to use different strategies for certain features and scenarios. +# See the DatabaseCleaner documentation for details. Example: +# +# Before('@no-txn,@selenium,@culerity,@celerity,@javascript') do +# # { except: [:widgets] } may not do what you expect here +# # as Cucumber::Rails::Database.javascript_strategy overrides +# # this setting. +# DatabaseCleaner.strategy = :truncation +# end +# +# Before('not @no-txn', 'not @selenium', 'not @culerity', 'not @celerity', 'not @javascript') do +# DatabaseCleaner.strategy = :transaction +# end +# + +# Possible values are :truncation and :transaction +# The :transaction strategy is faster, but might give you threading problems. +# See https://github.com/cucumber/cucumber-rails/blob/master/features/choose_javascript_database_strategy.feature +Cucumber::Rails::Database.javascript_strategy = :truncation + +# Make RSpec mocks available in Cucumber steps (allow_any_instance_of, allow, etc.) +require 'rspec/mocks' +World(RSpec::Mocks::ExampleMethods) + +Before do + RSpec::Mocks.setup +end + +After do + RSpec::Mocks.verify + RSpec::Mocks.teardown +end diff --git a/features/view_template.feature b/features/view_template.feature new file mode 100644 index 0000000000..27a1f82f20 --- /dev/null +++ b/features/view_template.feature @@ -0,0 +1,24 @@ +Feature: View Template + + Eu como Administrador + Quero visualizar os templates criados + A fim de poder editar e/ou deletar um template que eu criei + + Background: + Given I am authenticated as an "Administrador" + + Scenario: View template list successfully(happy path) + Given I have the following templates saved: + | titulo | + | Template Prova Matemática 2º semestre | + | Template Prova Português 2º semestre | + When I go to the "Meus Templates" page + Then I should see "Template Prova Matemática 2º semestre" + And I should see "Template Prova Português 2º semestre" + And I should see options to "Editar" and "Deletar" for each template + + Scenario: View empty template list(sad path) + Given I have no templates saved + When I go to the "Meus Templates" page + Then I should see the message "Nenhum template encontrado." + And I should see a button "Criar novo template" \ No newline at end of file diff --git a/lib/tasks/.keep b/lib/tasks/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/lib/tasks/cucumber.rake b/lib/tasks/cucumber.rake new file mode 100644 index 0000000000..b790c4d483 --- /dev/null +++ b/lib/tasks/cucumber.rake @@ -0,0 +1,68 @@ +# IMPORTANT: This file is generated by cucumber-rails - edit at your own peril. +# It is recommended to regenerate this file in the future when you upgrade to a +# newer version of cucumber-rails. Consider adding your own code to a new file +# instead of editing this one. Cucumber will automatically load all features/**/*.rb +# files. + + +unless ARGV.any? { |a| a =~ /^gems/ } # Don't load anything when running the gems:* tasks + +vendored_cucumber_bin = Dir["#{Rails.root}/vendor/{gems,plugins}/cucumber*/bin/cucumber"].first +$LOAD_PATH.unshift(File.dirname(vendored_cucumber_bin) + "/../lib") unless vendored_cucumber_bin.nil? + +begin + require "cucumber/rake/task" + + namespace :cucumber do + Cucumber::Rake::Task.new({ ok: "test:prepare" }, "Run features that should pass") do |t| + t.binary = vendored_cucumber_bin # If nil, the gem's binary is used. + t.fork = true # You may get faster startup if you set this to false + t.profile = "default" + end + + Cucumber::Rake::Task.new({ wip: "test:prepare" }, "Run features that are being worked on") do |t| + t.binary = vendored_cucumber_bin + t.fork = true # You may get faster startup if you set this to false + t.profile = "wip" + end + + Cucumber::Rake::Task.new({ rerun: "test:prepare" }, "Record failing features and run only them if any exist") do |t| + t.binary = vendored_cucumber_bin + t.fork = true # You may get faster startup if you set this to false + t.profile = "rerun" + end + + desc "Run all features" + task all: [ :ok, :wip ] + + task :statsetup do + require "rails/code_statistics" + ::STATS_DIRECTORIES << %w[Cucumber\ features features] if File.exist?("features") + ::CodeStatistics::TEST_TYPES << "Cucumber features" if File.exist?("features") + end + end + + desc "Alias for cucumber:ok" + task cucumber: "cucumber:ok" + + task default: :cucumber + + task features: :cucumber do + STDERR.puts "*** The 'features' task is deprecated. See rake -T cucumber ***" + end + + # In case we don't have the generic Rails test:prepare hook, append a no-op task that we can depend upon. + task "test:prepare" do + end + + task stats: "cucumber:statsetup" + + +rescue LoadError + desc "cucumber rake task not available (cucumber not installed)" + task :cucumber do + abort "Cucumber rake task is not available. Be sure to install cucumber as a gem or plugin" + end +end + +end diff --git a/log/.keep b/log/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/public/400.html b/public/400.html new file mode 100644 index 0000000000..640de03397 --- /dev/null +++ b/public/400.html @@ -0,0 +1,135 @@ + + + + + + + The server cannot process the request due to a client error (400 Bad Request) + + + + + + + + + + + + + +
+
+ +
+
+

The server cannot process the request due to a client error. Please check the request and try again. If you're the application owner check the logs for more information.

+
+
+ + + + diff --git a/public/404.html b/public/404.html new file mode 100644 index 0000000000..d7f0f14222 --- /dev/null +++ b/public/404.html @@ -0,0 +1,135 @@ + + + + + + + The page you were looking for doesn't exist (404 Not found) + + + + + + + + + + + + + +
+
+ +
+
+

The page you were looking for doesn't exist. You may have mistyped the address or the page may have moved. If you're the application owner check the logs for more information.

+
+
+ + + + diff --git a/public/406-unsupported-browser.html b/public/406-unsupported-browser.html new file mode 100644 index 0000000000..43d2811e8c --- /dev/null +++ b/public/406-unsupported-browser.html @@ -0,0 +1,135 @@ + + + + + + + Your browser is not supported (406 Not Acceptable) + + + + + + + + + + + + + +
+
+ +
+
+

Your browser is not supported.
Please upgrade your browser to continue.

+
+
+ + + + diff --git a/public/422.html b/public/422.html new file mode 100644 index 0000000000..f12fb4aa17 --- /dev/null +++ b/public/422.html @@ -0,0 +1,135 @@ + + + + + + + The change you wanted was rejected (422 Unprocessable Entity) + + + + + + + + + + + + + +
+
+ +
+
+

The change you wanted was rejected. Maybe you tried to change something you didn't have access to. If you're the application owner check the logs for more information.

+
+
+ + + + diff --git a/public/500.html b/public/500.html new file mode 100644 index 0000000000..e4eb18a759 --- /dev/null +++ b/public/500.html @@ -0,0 +1,135 @@ + + + + + + + We're sorry, but something went wrong (500 Internal Server Error) + + + + + + + + + + + + + +
+
+ +
+
+

We're sorry, but something went wrong.
If you're the application owner check the logs for more information.

+
+
+ + + + diff --git a/public/icon.png b/public/icon.png new file mode 100644 index 0000000000..c4c9dbfbbd Binary files /dev/null and b/public/icon.png differ diff --git a/public/icon.svg b/public/icon.svg new file mode 100644 index 0000000000..04b34bf83f --- /dev/null +++ b/public/icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/robots.txt b/public/robots.txt new file mode 100644 index 0000000000..c19f78ab68 --- /dev/null +++ b/public/robots.txt @@ -0,0 +1 @@ +# See https://www.robotstxt.org/robotstxt.html for documentation on how to use the robots.txt file diff --git a/script/.keep b/script/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/spec/models/administrador_spec.rb b/spec/models/administrador_spec.rb new file mode 100644 index 0000000000..7ae82480c1 --- /dev/null +++ b/spec/models/administrador_spec.rb @@ -0,0 +1,40 @@ +require 'rails_helper' + +RSpec.describe Administrador, type: :model do + let(:departamento) { Departamento.find_or_create_by!(nome: "Ciência da Computação", codigo: "CIC") } + + context "validações de criação" do + it "é válido com todos os atributos obrigatórios" do + admin = Administrador.new( + nome: "Admin Teste", + matricula: "admin123", + email: "admin@unb.br", + senha: "Senha123", + departamento: departamento + ) + expect(admin).to be_valid + end + + it "não é válido sem um nome" do + admin = Administrador.new( + nome: nil, + matricula: "admin123", + email: "admin@unb.br", + senha: "Senha123", + departamento: departamento + ) + expect(admin).not_to be_valid + end + + it "não é válido sem um departamento associado" do + admin = Administrador.new( + nome: "Admin Teste", + matricula: "admin123", + email: "admin@unb.br", + senha: "Senha123", + departamento: nil + ) + expect(admin).not_to be_valid + end + end +end diff --git a/spec/models/campo_form_spec.rb b/spec/models/campo_form_spec.rb new file mode 100644 index 0000000000..0ae16d5a5f --- /dev/null +++ b/spec/models/campo_form_spec.rb @@ -0,0 +1,37 @@ +require 'rails_helper' + +RSpec.describe CampoForm, type: :model do + let(:departamento) { Departamento.find_or_create_by!(nome: "Ciência da Computação", codigo: "CIC") } + let(:disciplina) { Disciplina.find_or_create_by!(nome: "Engenharia de Software", codigo: "CIC0097", departamento: departamento) } + let(:turma) { Turma.find_or_create_by!(numero_da_turma: "TA", disciplina: disciplina, semestre: "2026.1") } + let(:formulario) { Formulario.create!(turma: turma) } + let(:elemento_form) { ElementoForm.create!(ordem: 1, formulario: formulario) } + + context "validações" do + it "é válido com todos os atributos obrigatórios" do + cf = CampoForm.new(ordem: 1, elemento_form: elemento_form) + expect(cf).to be_valid + end + + it "não é válido sem ordem" do + cf = CampoForm.new(elemento_form: elemento_form) + expect(cf).not_to be_valid + expect(cf.errors[:ordem]).to be_present + end + + it "não é válido sem elemento_form" do + cf = CampoForm.new(ordem: 1) + expect(cf).not_to be_valid + end + end + + context "associações" do + it "possui associação com resposta_elems" do + expect(CampoForm.new).to respond_to(:resposta_elems) + end + + it "possui associação com elemento_form" do + expect(CampoForm.new).to respond_to(:elemento_form) + end + end +end diff --git a/spec/models/campo_spec.rb b/spec/models/campo_spec.rb new file mode 100644 index 0000000000..5a9b17b7fe --- /dev/null +++ b/spec/models/campo_spec.rb @@ -0,0 +1,62 @@ +require 'rails_helper' + +RSpec.describe Campo, type: :model do + let(:departamento) { Departamento.find_or_create_by!(nome: "Ciência da Computação", codigo: "CIC") } + let(:admin) do + Administrador.find_or_create_by!(email: "admin_campo@unb.br") do |a| + a.nome = "Admin Campo" + a.matricula = "adm_campo" + a.senha = "Senha123" + a.departamento = departamento + end + end + let(:template) do + t = Template.new(nome: "Template", administrador: admin) + t.save(validate: false) + t + end + let(:elemento) { Elemento.create!(enunciado: "Questão 1", ordem: 1, template: template) } + + context "validações" do + it "é válido com todos os atributos obrigatórios" do + campo = Campo.new(ordem: 1, tipo_elemento: "Multipla Escolha", elemento: elemento) + expect(campo).to be_valid + end + + it "não é válido sem ordem" do + campo = Campo.new(tipo_elemento: "Multipla Escolha", elemento: elemento) + expect(campo).not_to be_valid + expect(campo.errors[:ordem]).to be_present + end + + it "não é válido sem tipo_elemento" do + campo = Campo.new(ordem: 1, elemento: elemento) + expect(campo).not_to be_valid + expect(campo.errors[:tipo_elemento]).to be_present + end + + it "não é válido sem elemento" do + campo = Campo.new(ordem: 1, tipo_elemento: "Multipla Escolha") + expect(campo).not_to be_valid + end + + it "não é válido com ordem duplicada no mesmo elemento" do + Campo.create!(ordem: 1, tipo_elemento: "Texto", elemento: elemento) + outro = Campo.new(ordem: 1, tipo_elemento: "Multipla Escolha", elemento: elemento) + expect(outro).not_to be_valid + expect(outro.errors[:ordem]).to be_present + end + + it "é válido com ordens distintas no mesmo elemento" do + Campo.create!(ordem: 1, tipo_elemento: "Texto", elemento: elemento) + outro = Campo.new(ordem: 2, tipo_elemento: "Multipla Escolha", elemento: elemento) + expect(outro).to be_valid + end + end + + context "associações" do + it "possui associação com elemento" do + expect(Campo.new).to respond_to(:elemento) + end + end +end diff --git a/spec/models/curso_spec.rb b/spec/models/curso_spec.rb new file mode 100644 index 0000000000..7d8d97d630 --- /dev/null +++ b/spec/models/curso_spec.rb @@ -0,0 +1,52 @@ +require 'rails_helper' + +RSpec.describe Curso, type: :model do + let(:departamento) { Departamento.find_or_create_by!(nome: "Ciência da Computação", codigo: "CIC") } + + context "validações" do + it "é válido com todos os atributos obrigatórios" do + curso = Curso.new(nome: "Engenharia de Software", codigo: "ESW", departamento: departamento) + expect(curso).to be_valid + end + + it "não é válido sem nome" do + curso = Curso.new(codigo: "ESW", departamento: departamento) + expect(curso).not_to be_valid + expect(curso.errors[:nome]).to be_present + end + + it "não é válido sem codigo" do + curso = Curso.new(nome: "Engenharia de Software", departamento: departamento) + expect(curso).not_to be_valid + expect(curso.errors[:codigo]).to be_present + end + + it "não é válido sem departamento" do + curso = Curso.new(nome: "Engenharia de Software", codigo: "ESW") + expect(curso).not_to be_valid + end + + it "não é válido com codigo duplicado" do + Curso.create!(nome: "ES Original", codigo: "ESW", departamento: departamento) + outro = Curso.new(nome: "ES Duplicado", codigo: "ESW", departamento: departamento) + expect(outro).not_to be_valid + expect(outro.errors[:codigo]).to be_present + end + + it "é válido com codigos distintos no mesmo departamento" do + Curso.create!(nome: "ES", codigo: "ESW", departamento: departamento) + outro = Curso.new(nome: "CC", codigo: "CC01", departamento: departamento) + expect(outro).to be_valid + end + end + + context "associações" do + it "possui associação com discentes" do + expect(Curso.new).to respond_to(:discentes) + end + + it "possui associação com departamento" do + expect(Curso.new).to respond_to(:departamento) + end + end +end diff --git a/spec/models/departamento_spec.rb b/spec/models/departamento_spec.rb new file mode 100644 index 0000000000..d8e465446e --- /dev/null +++ b/spec/models/departamento_spec.rb @@ -0,0 +1,49 @@ +require 'rails_helper' + +RSpec.describe Departamento, type: :model do + context "validações" do + it "é válido com todos os atributos obrigatórios" do + dep = Departamento.new(nome: "Ciência da Computação", codigo: "CIC") + expect(dep).to be_valid + end + + it "não é válido sem nome" do + dep = Departamento.new(codigo: "CIC") + expect(dep).not_to be_valid + expect(dep.errors[:nome]).to be_present + end + + it "não é válido sem codigo" do + dep = Departamento.new(nome: "Ciência da Computação") + expect(dep).not_to be_valid + expect(dep.errors[:codigo]).to be_present + end + + it "não é válido com codigo duplicado" do + Departamento.create!(nome: "CIC Original", codigo: "CIC") + outro = Departamento.new(nome: "CIC Duplicado", codigo: "CIC") + expect(outro).not_to be_valid + expect(outro.errors[:codigo]).to be_present + end + + it "é válido com codigos distintos" do + Departamento.create!(nome: "CIC", codigo: "CIC") + outro = Departamento.new(nome: "MAT", codigo: "MAT") + expect(outro).to be_valid + end + end + + context "associações" do + it "possui associação com cursos" do + expect(Departamento.new).to respond_to(:cursos) + end + + it "possui associação com disciplinas" do + expect(Departamento.new).to respond_to(:disciplinas) + end + + it "possui associação com administradores" do + expect(Departamento.new).to respond_to(:administradores) + end + end +end diff --git a/spec/models/disciplina_spec.rb b/spec/models/disciplina_spec.rb new file mode 100644 index 0000000000..a0ae666201 --- /dev/null +++ b/spec/models/disciplina_spec.rb @@ -0,0 +1,52 @@ +require 'rails_helper' + +RSpec.describe Disciplina, type: :model do + let(:departamento) { Departamento.find_or_create_by!(nome: "Ciência da Computação", codigo: "CIC") } + + context "validações" do + it "é válida com todos os atributos obrigatórios" do + disciplina = Disciplina.new(nome: "Engenharia de Software", codigo: "CIC0097", departamento: departamento) + expect(disciplina).to be_valid + end + + it "não é válida sem nome" do + disciplina = Disciplina.new(codigo: "CIC0097", departamento: departamento) + expect(disciplina).not_to be_valid + expect(disciplina.errors[:nome]).to be_present + end + + it "não é válida sem codigo" do + disciplina = Disciplina.new(nome: "Engenharia de Software", departamento: departamento) + expect(disciplina).not_to be_valid + expect(disciplina.errors[:codigo]).to be_present + end + + it "não é válida sem departamento" do + disciplina = Disciplina.new(nome: "Engenharia de Software", codigo: "CIC0097") + expect(disciplina).not_to be_valid + end + + it "não é válida com codigo duplicado" do + Disciplina.create!(nome: "ES Original", codigo: "CIC0097", departamento: departamento) + outra = Disciplina.new(nome: "ES Duplicada", codigo: "CIC0097", departamento: departamento) + expect(outra).not_to be_valid + expect(outra.errors[:codigo]).to be_present + end + + it "é válida com codigos distintos" do + Disciplina.create!(nome: "ES", codigo: "CIC0097", departamento: departamento) + outra = Disciplina.new(nome: "BD", codigo: "CIC0098", departamento: departamento) + expect(outra).to be_valid + end + end + + context "associações" do + it "possui associação com turmas" do + expect(Disciplina.new).to respond_to(:turmas) + end + + it "possui associação com departamento" do + expect(Disciplina.new).to respond_to(:departamento) + end + end +end diff --git a/spec/models/elemento_form_spec.rb b/spec/models/elemento_form_spec.rb new file mode 100644 index 0000000000..7a2a0d0807 --- /dev/null +++ b/spec/models/elemento_form_spec.rb @@ -0,0 +1,36 @@ +require 'rails_helper' + +RSpec.describe ElementoForm, type: :model do + let(:departamento) { Departamento.find_or_create_by!(nome: "Ciência da Computação", codigo: "CIC") } + let(:disciplina) { Disciplina.find_or_create_by!(nome: "Engenharia de Software", codigo: "CIC0097", departamento: departamento) } + let(:turma) { Turma.find_or_create_by!(numero_da_turma: "TA", disciplina: disciplina, semestre: "2026.1") } + let(:formulario) { Formulario.create!(turma: turma) } + + context "validações" do + it "é válido com todos os atributos obrigatórios" do + ef = ElementoForm.new(ordem: 1, formulario: formulario) + expect(ef).to be_valid + end + + it "não é válido sem ordem" do + ef = ElementoForm.new(formulario: formulario) + expect(ef).not_to be_valid + expect(ef.errors[:ordem]).to be_present + end + + it "não é válido sem formulario" do + ef = ElementoForm.new(ordem: 1) + expect(ef).not_to be_valid + end + end + + context "associações" do + it "possui associação com campo_forms" do + expect(ElementoForm.new).to respond_to(:campo_forms) + end + + it "possui associação com formulario" do + expect(ElementoForm.new).to respond_to(:formulario) + end + end +end diff --git a/spec/models/elemento_spec.rb b/spec/models/elemento_spec.rb new file mode 100644 index 0000000000..a56984913f --- /dev/null +++ b/spec/models/elemento_spec.rb @@ -0,0 +1,38 @@ +require 'rails_helper' + +RSpec.describe Elemento, type: :model do + let(:departamento) { Departamento.find_or_create_by!(nome: "Ciência da Computação", codigo: "CIC") } + let(:admin) do + Administrador.find_or_create_by!(email: "admin_elem@unb.br") do |a| + a.nome = "Admin Elem" + a.matricula = "adm_elem" + a.senha = "Senha123" + a.departamento = departamento + end + end + let(:template) do + t = Template.new(nome: "Template Teste", administrador: admin) + t.save(validate: false) + t + end + + context "validações e associações" do + it "é válido quando associado a um template" do + elemento = Elemento.new(enunciado: "Questão 1", ordem: 1, template: template) + expect(elemento).to be_valid + end + + it "não é válido sem template" do + elemento = Elemento.new(enunciado: "Questão 1", ordem: 1) + expect(elemento).not_to be_valid + end + + it "possui associação com campos" do + expect(Elemento.new).to respond_to(:campos) + end + + it "possui associação com template" do + expect(Elemento.new).to respond_to(:template) + end + end +end diff --git a/spec/models/formulario_spec.rb b/spec/models/formulario_spec.rb new file mode 100644 index 0000000000..0a1f9a7e79 --- /dev/null +++ b/spec/models/formulario_spec.rb @@ -0,0 +1,29 @@ +require 'rails_helper' + +RSpec.describe Formulario, type: :model do + let(:departamento) { Departamento.find_or_create_by!(nome: "Ciência da Computação", codigo: "CIC") } + let(:disciplina) { Disciplina.find_or_create_by!(nome: "Engenharia de Software", codigo: "CIC0097", departamento: departamento) } + let(:turma) { Turma.find_or_create_by!(numero_da_turma: "TA", disciplina: disciplina, semestre: "2026.1") } + + context "validações de criação e relacionamentos" do + it "é válido quando associado a uma turma" do + formulario = Formulario.new(turma: turma) + expect(formulario).to be_valid + end + + it "não é válido sem estar vinculado a uma turma" do + formulario = Formulario.new(turma: nil) + expect(formulario).not_to be_valid + end + + it "possui relacionamento com elemento_forms" do + formulario = Formulario.new(turma: turma) + expect(formulario).to respond_to(:elemento_forms) + end + + it "possui relacionamento com resposta_forms" do + formulario = Formulario.new(turma: turma) + expect(formulario).to respond_to(:resposta_forms) + end + end +end diff --git a/spec/models/resposta_elem_spec.rb b/spec/models/resposta_elem_spec.rb new file mode 100644 index 0000000000..04e425b150 --- /dev/null +++ b/spec/models/resposta_elem_spec.rb @@ -0,0 +1,71 @@ +require 'rails_helper' + +RSpec.describe RespostaElem, type: :model do + let(:departamento) { Departamento.find_or_create_by!(nome: "Ciência da Computação", codigo: "CIC") } + let(:disciplina) { Disciplina.find_or_create_by!(nome: "Engenharia de Software", codigo: "CIC0097", departamento: departamento) } + let(:turma) { Turma.find_or_create_by!(numero_da_turma: "TA", disciplina: disciplina, semestre: "2026.1") } + let(:formulario) { Formulario.create!(turma: turma) } + let(:elemento_form) { ElementoForm.create!(ordem: 1, tipo: "Texto", formulario: formulario) } + let(:docente) do + Docente.find_or_create_by!(email: "doc_re@unb.br") do |d| + d.nome = "Docente RE" + d.matricula = "doc_re001" + d.formacao = "Doutorado" + d.senha = "Senha123" + end + end + let(:resposta_form) do + RespostaForm.create!(data_submissao: Date.today, formulario: formulario, usuario: docente) + end + + context "validações" do + it "é válido com todos os atributos obrigatórios" do + re = RespostaElem.new( + texto_resposta: "Muito bom", + resposta_form: resposta_form, + elemento_form: elemento_form + ) + expect(re).to be_valid + end + + it "não é válido sem texto_resposta" do + re = RespostaElem.new(resposta_form: resposta_form, elemento_form: elemento_form) + expect(re).not_to be_valid + expect(re.errors[:texto_resposta]).to be_present + end + + it "não é válido sem resposta_form" do + re = RespostaElem.new(texto_resposta: "Bom", elemento_form: elemento_form) + expect(re).not_to be_valid + end + + it "não é válido sem elemento_form" do + re = RespostaElem.new(texto_resposta: "Bom", resposta_form: resposta_form) + expect(re).not_to be_valid + end + + it "é válido sem campo_form (campo opcional)" do + re = RespostaElem.new( + texto_resposta: "Bom", + resposta_form: resposta_form, + elemento_form: elemento_form, + campo_form: nil + ) + expect(re).to be_valid + end + end + + context "associações" do + it "possui associação com resposta_form" do + expect(RespostaElem.new).to respond_to(:resposta_form) + end + + it "possui associação com elemento_form" do + expect(RespostaElem.new).to respond_to(:elemento_form) + end + + it "possui associação com campo_form" do + expect(RespostaElem.new).to respond_to(:campo_form) + end + end +end diff --git a/spec/models/resposta_form_spec.rb b/spec/models/resposta_form_spec.rb new file mode 100644 index 0000000000..1961322dca --- /dev/null +++ b/spec/models/resposta_form_spec.rb @@ -0,0 +1,72 @@ +require 'rails_helper' + +RSpec.describe RespostaForm, type: :model do + let(:departamento) { Departamento.find_or_create_by!(nome: "Ciência da Computação", codigo: "CIC") } + let(:disciplina) { Disciplina.find_or_create_by!(nome: "Engenharia de Software", codigo: "CIC0097", departamento: departamento) } + let(:turma) { Turma.find_or_create_by!(numero_da_turma: "TA", disciplina: disciplina, semestre: "2026.1") } + let(:formulario) { Formulario.create!(turma: turma) } + let(:docente) do + Docente.find_or_create_by!(email: "doc_rf@unb.br") do |d| + d.nome = "Docente RF" + d.matricula = "doc_rf001" + d.formacao = "Doutorado" + d.senha = "Senha123" + end + end + + context "validações" do + it "é válido com todos os atributos obrigatórios" do + rf = RespostaForm.new(data_submissao: Date.today, formulario: formulario, usuario: docente) + expect(rf).to be_valid + end + + it "não é válido sem data_submissao" do + rf = RespostaForm.new(formulario: formulario, usuario: docente) + expect(rf).not_to be_valid + expect(rf.errors[:data_submissao]).to be_present + end + + it "não é válido sem formulario" do + rf = RespostaForm.new(data_submissao: Date.today, usuario: docente) + expect(rf).not_to be_valid + end + + it "não é válido sem usuario" do + rf = RespostaForm.new(data_submissao: Date.today, formulario: formulario) + expect(rf).not_to be_valid + end + + it "não é válido quando o mesmo usuário responde o mesmo formulário duas vezes" do + RespostaForm.create!(data_submissao: Date.today, formulario: formulario, usuario: docente) + duplicado = RespostaForm.new(data_submissao: Date.today, formulario: formulario, usuario: docente) + expect(duplicado).not_to be_valid + expect(duplicado.errors[:usuario_id]).to be_present + end + + it "é válido quando usuários diferentes respondem o mesmo formulário" do + outro = Docente.find_or_create_by!(email: "doc2_rf@unb.br") do |d| + d.nome = "Docente 2" + d.matricula = "doc2_rf" + d.formacao = "Mestrado" + d.senha = "Senha123" + end + RespostaForm.create!(data_submissao: Date.today, formulario: formulario, usuario: docente) + segundo = RespostaForm.new(data_submissao: Date.today, formulario: formulario, usuario: outro) + expect(segundo).to be_valid + end + end + + context "associações" do + it "possui associação com resposta_elems" do + expect(RespostaForm.new).to respond_to(:resposta_elems) + end + + it "possui associação com formulario" do + expect(RespostaForm.new).to respond_to(:formulario) + end + + it "possui associação com usuario" do + expect(RespostaForm.new).to respond_to(:usuario) + end + end +end diff --git a/spec/models/template_spec.rb b/spec/models/template_spec.rb new file mode 100644 index 0000000000..19f682bc13 --- /dev/null +++ b/spec/models/template_spec.rb @@ -0,0 +1,59 @@ +require 'rails_helper' + +RSpec.describe Template, type: :model do + let(:departamento) { Departamento.find_or_create_by!(nome: "Ciência da Computação", codigo: "CIC") } + let(:admin) do + Administrador.find_or_create_by!(email: "admin_template@unb.br") do |u| + u.nome = "Admin Template" + u.matricula = "78910" + u.senha = "Senha123" + u.departamento = departamento + end + end + + context "validações de criação e relacionamento" do + it "é válido com nome, um administrador e pelo menos um elemento" do + template = Template.new(nome: "Avaliação da Turma", administrador: admin) + template.elementos.build(enunciado: "Questão 1", ordem: 1) + + expect(template).to be_valid + end + + it "não é válido sem um nome (título)" do + template = Template.new(nome: "", administrador: admin) + template.elementos.build(enunciado: "Questão 1", ordem: 1) + + expect(template).not_to be_valid + end + + it "não é válido sem um administrador associado" do + template = Template.new(nome: "Formulário Fantasma", administrador: nil) + template.elementos.build(enunciado: "Questão 1", ordem: 1) + + expect(template).not_to be_valid + end + + it "não é válido se não possuir nenhum elemento (questão)" do + template = Template.new(nome: "Formulário Vazio", administrador: admin) + + expect(template).not_to be_valid + end + + it "não é válido se o enunciado de uma questão (elemento) estiver em branco" do + template = Template.new(nome: "Avaliação da Turma", administrador: admin) + template.elementos.build(enunciado: "", ordem: 1) + + expect(template).not_to be_valid + expect(template.errors[:base]).to include("O texto de todas as questões deve ser preenchido!") + end + + it "não é válido se uma opção (campo) que não seja do tipo Texto estiver com enunciado em branco" do + template = Template.new(nome: "Avaliação da Turma", administrador: admin) + elemento = template.elementos.build(enunciado: "Questão 1", ordem: 1) + elemento.campos.build(tipo_elemento: "Multipla Escolha", enunciado: "", ordem: 1) + + expect(template).not_to be_valid + expect(template.errors[:base]).to include("Todas as opções das questões devem ser preenchidas!") + end + end +end diff --git a/spec/models/turma_spec.rb b/spec/models/turma_spec.rb new file mode 100644 index 0000000000..8e05cb0510 --- /dev/null +++ b/spec/models/turma_spec.rb @@ -0,0 +1,67 @@ +require 'rails_helper' + +RSpec.describe Turma, type: :model do + let(:departamento) { Departamento.find_or_create_by!(nome: "Ciência da Computação", codigo: "CIC") } + let(:disciplina) { Disciplina.find_or_create_by!(nome: "Engenharia de Software", codigo: "CIC0097", departamento: departamento) } + + context "validações" do + it "é válida com todos os atributos obrigatórios" do + turma = Turma.new(numero_da_turma: "TA", semestre: "2026.1", disciplina: disciplina) + expect(turma).to be_valid + end + + it "não é válida sem numero_da_turma" do + turma = Turma.new(semestre: "2026.1", disciplina: disciplina) + expect(turma).not_to be_valid + expect(turma.errors[:numero_da_turma]).to be_present + end + + it "não é válida sem semestre" do + turma = Turma.new(numero_da_turma: "TA", disciplina: disciplina) + expect(turma).not_to be_valid + expect(turma.errors[:semestre]).to be_present + end + + it "não é válida sem disciplina" do + turma = Turma.new(numero_da_turma: "TA", semestre: "2026.1") + expect(turma).not_to be_valid + end + + it "não é válida com numero_da_turma duplicado no mesmo semestre e disciplina" do + Turma.create!(numero_da_turma: "TA", semestre: "2026.1", disciplina: disciplina) + outra = Turma.new(numero_da_turma: "TA", semestre: "2026.1", disciplina: disciplina) + expect(outra).not_to be_valid + expect(outra.errors[:numero_da_turma]).to be_present + end + + it "é válida com mesmo numero_da_turma em semestres distintos" do + Turma.create!(numero_da_turma: "TA", semestre: "2026.1", disciplina: disciplina) + outra = Turma.new(numero_da_turma: "TA", semestre: "2026.2", disciplina: disciplina) + expect(outra).to be_valid + end + + it "é válida com numero_da_turma distinto no mesmo semestre" do + Turma.create!(numero_da_turma: "TA", semestre: "2026.1", disciplina: disciplina) + outra = Turma.new(numero_da_turma: "TB", semestre: "2026.1", disciplina: disciplina) + expect(outra).to be_valid + end + end + + context "associações" do + it "possui associação com formularios" do + expect(Turma.new).to respond_to(:formularios) + end + + it "possui associação com discentes" do + expect(Turma.new).to respond_to(:discentes) + end + + it "possui associação com docentes" do + expect(Turma.new).to respond_to(:docentes) + end + + it "possui associação com disciplina" do + expect(Turma.new).to respond_to(:disciplina) + end + end +end diff --git a/spec/models/usuario_spec.rb b/spec/models/usuario_spec.rb new file mode 100644 index 0000000000..8f1baa9b8b --- /dev/null +++ b/spec/models/usuario_spec.rb @@ -0,0 +1,166 @@ +require 'rails_helper' + +RSpec.describe Usuario, type: :model do + let(:departamento) { Departamento.find_or_create_by!(nome: "Ciência da Computação", codigo: "CIC") } + let(:curso) { Curso.find_or_create_by!(nome: "Engenharia de Software", codigo: "ESW", departamento: departamento) } + + let(:docente_valido) do + Docente.new( + nome: "Professor Teste", + matricula: "doc001", + email: "prof@unb.br", + formacao: "Doutorado", + senha: "Senha123", + senha_confirmation: "Senha123" + ) + end + + context "validações" do + it "é válido com todos os atributos obrigatórios" do + expect(docente_valido).to be_valid + end + + it "não é válido sem nome" do + docente_valido.nome = nil + expect(docente_valido).not_to be_valid + end + + it "não é válido sem matrícula" do + docente_valido.matricula = nil + expect(docente_valido).not_to be_valid + end + + it "não é válido sem email" do + docente_valido.email = nil + expect(docente_valido).not_to be_valid + end + + it "não é válido com matrícula duplicada" do + docente_valido.save! + outro = Docente.new( + nome: "Outro Prof", + matricula: "doc001", + email: "outro@unb.br", + formacao: "Mestrado", + senha: "Senha123", + senha_confirmation: "Senha123" + ) + expect(outro).not_to be_valid + end + + it "não é válido com email duplicado" do + docente_valido.save! + outro = Docente.new( + nome: "Outro Prof", + matricula: "doc002", + email: "prof@unb.br", + formacao: "Mestrado", + senha: "Senha123", + senha_confirmation: "Senha123" + ) + expect(outro).not_to be_valid + end + + it "não é válido com senha menor que 6 caracteres" do + docente_valido.senha = "abc" + docente_valido.senha_confirmation = "abc" + expect(docente_valido).not_to be_valid + end + + it "não é válido quando confirmação de senha não confere" do + docente_valido.senha_confirmation = "outra_senha" + expect(docente_valido).not_to be_valid + end + end + + context "#senha_definida?" do + it "retorna false quando senha_hash está em branco" do + usuario = Docente.new(nome: "X", matricula: "x1", email: "x@x.com", formacao: "Grad") + expect(usuario.senha_definida?).to be false + end + + it "retorna true após definir e salvar uma senha" do + docente_valido.save! + expect(docente_valido.senha_definida?).to be true + end + end + + context "#autenticar_senha" do + before { docente_valido.save! } + + it "retorna true com a senha correta" do + expect(docente_valido.autenticar_senha("Senha123")).to be true + end + + it "retorna false com a senha incorreta" do + expect(docente_valido.autenticar_senha("errada")).to be false + end + + it "retorna false quando senha_hash está em branco" do + usuario = Docente.new(nome: "Y", matricula: "y1", email: "y@y.com", formacao: "Grad") + expect(usuario.autenticar_senha("qualquer")).to be false + end + end + + context "#gerar_definicao_senha_token!" do + before { docente_valido.save! } + + it "preenche definicao_senha_token" do + docente_valido.gerar_definicao_senha_token! + expect(docente_valido.definicao_senha_token).to be_present + end + + it "preenche definicao_senha_sent_at" do + docente_valido.gerar_definicao_senha_token! + expect(docente_valido.definicao_senha_sent_at).to be_present + end + end + + context "#limpar_definicao_senha_token!" do + before do + docente_valido.save! + docente_valido.gerar_definicao_senha_token! + end + + it "apaga definicao_senha_token" do + docente_valido.limpar_definicao_senha_token! + expect(docente_valido.definicao_senha_token).to be_nil + end + + it "apaga definicao_senha_sent_at" do + docente_valido.limpar_definicao_senha_token! + expect(docente_valido.definicao_senha_sent_at).to be_nil + end + end + + context "#gerar_redefinicao_senha_token!" do + before { docente_valido.save! } + + it "preenche redefinicao_senha_token" do + docente_valido.gerar_redefinicao_senha_token! + expect(docente_valido.redefinicao_senha_token).to be_present + end + + it "preenche redefinicao_senha_sent_at" do + docente_valido.gerar_redefinicao_senha_token! + expect(docente_valido.redefinicao_senha_sent_at).to be_present + end + end + + context "#limpar_redefinicao_senha_token!" do + before do + docente_valido.save! + docente_valido.gerar_redefinicao_senha_token! + end + + it "apaga redefinicao_senha_token" do + docente_valido.limpar_redefinicao_senha_token! + expect(docente_valido.redefinicao_senha_token).to be_nil + end + + it "apaga redefinicao_senha_sent_at" do + docente_valido.limpar_redefinicao_senha_token! + expect(docente_valido.redefinicao_senha_sent_at).to be_nil + end + end +end diff --git a/spec/rails_helper.rb b/spec/rails_helper.rb new file mode 100644 index 0000000000..23169c63ba --- /dev/null +++ b/spec/rails_helper.rb @@ -0,0 +1,87 @@ +# This file is copied to spec/ when you run 'rails generate rspec:install' + +require 'simplecov' + +SimpleCov.command_name 'RSpec' +SimpleCov.start 'rails' do + add_group "Controllers", "app/controllers" + add_group "Models", "app/models" + + add_filter '/spec/' + add_filter '/config/' + add_filter '/vendor/' +end + + +require 'spec_helper' +ENV['RAILS_ENV'] ||= 'test' +require_relative '../config/environment' +# Prevent database truncation if the environment is production +abort("The Rails environment is running in production mode!") if Rails.env.production? +# Uncomment the line below in case you have `--require rails_helper` in the `.rspec` file +# that will avoid rails generators crashing because migrations haven't been run yet +# return unless Rails.env.test? +require 'rspec/rails' +# Add additional requires below this line. Rails is not loaded until this point! +require 'simplecov' +SimpleCov.start +# Requires supporting ruby files with custom matchers and macros, etc, in +# spec/support/ and its subdirectories. Files matching `spec/**/*_spec.rb` are +# run as spec files by default. This means that files in spec/support that end +# in _spec.rb will both be required and run as specs, causing the specs to be +# run twice. It is recommended that you do not name files matching this glob to +# end with _spec.rb. You can configure this pattern with the --pattern +# option on the command line or in ~/.rspec, .rspec or `.rspec-local`. +# +# The following line is provided for convenience purposes. It has the downside +# of increasing the boot-up time by auto-requiring all files in the support +# directory. Alternatively, in the individual `*_spec.rb` files, manually +# require only the support files necessary. +# +# Rails.root.glob('spec/support/**/*.rb').sort_by(&:to_s).each { |f| require f } + +# Ensures that the test database schema matches the current schema file. +# If there are pending migrations it will invoke `db:test:prepare` to +# recreate the test database by loading the schema. +# If you are not using ActiveRecord, you can remove these lines. +begin + ActiveRecord::Migration.maintain_test_schema! +rescue ActiveRecord::PendingMigrationError => e + abort e.to_s.strip +end +RSpec.configure do |config| + # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures + config.fixture_paths = [ + Rails.root.join('spec/fixtures') + ] + + # If you're not using ActiveRecord, or you'd prefer not to run each of your + # examples within a transaction, remove the following line or assign false + # instead of true. + config.use_transactional_fixtures = true + + # You can uncomment this line to turn off ActiveRecord support entirely. + # config.use_active_record = false + + # RSpec Rails uses metadata to mix in different behaviours to your tests, + # for example enabling you to call `get` and `post` in request specs. e.g.: + # + # RSpec.describe UsersController, type: :request do + # # ... + # end + # + # The different available types are documented in the features, such as in + # https://rspec.info/features/8-0/rspec-rails + # + # You can also infer these behaviours automatically by location, e.g. + # /spec/models would pull in the same behaviour as `type: :model` but this + # behaviour is considered legacy and will be removed in a future version. + # + # To enable this behaviour uncomment the line below. + # config.infer_spec_type_from_file_location! + + # Filter lines from Rails gems in backtraces. + config.filter_rails_from_backtrace! + # arbitrary gems may also be filtered via: + # config.filter_gems_from_backtrace("gem name") +end diff --git a/spec/requests/admin_spec.rb b/spec/requests/admin_spec.rb new file mode 100644 index 0000000000..a16c77986b --- /dev/null +++ b/spec/requests/admin_spec.rb @@ -0,0 +1,237 @@ +require 'rails_helper' + +RSpec.describe "Admin", type: :request do + let(:departamento) { Departamento.find_or_create_by!(nome: "Ciência da Computação", codigo: "CIC") } + let!(:admin) do + Administrador.create!( + nome: "Admin Teste", + matricula: "adm_admin", + email: "admin_ctrl@unb.br", + senha: "Senha123", + senha_confirmation: "Senha123", + departamento: departamento + ) + end + + before { post login_path, params: { login: admin.email, senha: "Senha123" } } + + describe "GET /admin/:admin_id/avaliacoes" do + it "retorna 200 OK" do + get admin_avaliacoes_path(admin_id: admin.id) + expect(response).to have_http_status(:ok) + end + end + + describe "GET /admin/:admin_id/gerenciamento" do + it "retorna 200 OK" do + get admin_gerenciamento_path(admin_id: admin.id) + expect(response).to have_http_status(:ok) + end + end + + describe "Controle de acesso" do + let!(:outro_admin) do + Administrador.create!( + nome: "Outro Admin", + matricula: "adm_outro", + email: "outro_admin@unb.br", + senha: "Senha123", + senha_confirmation: "Senha123", + departamento: departamento + ) + end + + it "redireciona ao tentar acessar páginas de outro administrador" do + get admin_gerenciamento_path(admin_id: outro_admin.id) + expect(response).to redirect_to(inicio_path) + end + end + + describe "GET /admin/:admin_id/enviar_formularios" do + it "retorna 200 OK" do + get admin_enviar_formularios_path(admin_id: admin.id) + expect(response).to have_http_status(:ok) + end + end + + describe "POST /admin/:admin_id/enviar_formularios" do + let(:disciplina) { Disciplina.find_or_create_by!(nome: "ES", codigo: "CIC001A", departamento: departamento) } + let!(:turma) { Turma.find_or_create_by!(numero_da_turma: "TA", disciplina: disciplina, semestre: "2026.1") } + let!(:template) do + t = admin.templates.build(nome: "Template Ctrl") + t.elementos.build(enunciado: "Questão 1", ordem: 1) + t.save! + t + end + + it "redireciona com alerta quando template não informado" do + post admin_enviar_formularios_path(admin_id: admin.id), params: { + template_id: nil, + turma_ids: [ turma.id ] + } + expect(response).to redirect_to(admin_enviar_formularios_path(admin)) + expect(flash[:alert]).to include("Selecione um template") + end + + it "redireciona com alerta quando turmas não informadas" do + post admin_enviar_formularios_path(admin_id: admin.id), params: { + template_id: template.id, + turma_ids: nil + } + expect(response).to redirect_to(admin_enviar_formularios_path(admin)) + expect(flash[:alert]).to include("Selecione pelo menos uma turma") + end + + it "cria formulário com sucesso para uma turma" do + expect { + post admin_enviar_formularios_path(admin_id: admin.id), params: { + template_id: template.id, + turma_ids: [ turma.id ] + } + }.to change(Formulario, :count).by(1) + + expect(response).to redirect_to(admin_gerenciamento_path(admin)) + expect(flash[:notice]).to eq("Formulário criado com sucesso") + end + + it "cria múltiplos formulários para múltiplas turmas" do + outra_turma = Turma.create!(numero_da_turma: "TB", disciplina: disciplina, semestre: "2026.1") + + expect { + post admin_enviar_formularios_path(admin_id: admin.id), params: { + template_id: template.id, + turma_ids: [ turma.id, outra_turma.id ] + } + }.to change(Formulario, :count).by(2) + + expect(flash[:notice]).to eq("Formulários criados com sucesso") + end + + it "cria elemento_forms associados ao formulário" do + post admin_enviar_formularios_path(admin_id: admin.id), params: { + template_id: template.id, + turma_ids: [ turma.id ] + } + formulario = Formulario.last + expect(formulario.elemento_forms.count).to eq(1) + end + end + + describe "GET /admin/:admin_id/resultados" do + it "retorna 200 OK" do + get admin_resultados_path(admin_id: admin.id) + expect(response).to have_http_status(:ok) + end + end + + describe "GET /admin/:admin_id/resultados/:id/download.csv" do + let(:disciplina) { Disciplina.find_or_create_by!(nome: "ES Download", codigo: "CIC002A", departamento: departamento) } + let(:turma) { Turma.find_or_create_by!(numero_da_turma: "TA", disciplina: disciplina, semestre: "2026.1") } + let!(:formulario) { Formulario.create!(turma: turma) } + let(:docente) do + Docente.find_or_create_by!(email: "doc_csv@unb.br") do |d| + d.nome = "Docente CSV" + d.matricula = "doc_csv" + d.formacao = "Doutorado" + d.senha = "Senha123" + end + end + + it "redireciona com alerta quando formulário não encontrado" do + get admin_baixar_csv_path(admin_id: admin.id, id: 999999) + expect(response).to redirect_to(admin_resultados_path(admin)) + expect(flash[:alert]).to include("não encontrado") + end + + it "redireciona com alerta quando formulário sem respostas" do + get admin_baixar_csv_path(admin_id: admin.id, id: formulario.id) + expect(response).to redirect_to(admin_resultados_path(admin)) + expect(flash[:alert]).to include("não possui respostas") + end + + it "retorna CSV quando formulário tem respostas" do + RespostaForm.create!(formulario: formulario, usuario: docente, data_submissao: Date.today) + get admin_baixar_csv_path(admin_id: admin.id, id: formulario.id) + expect(response).to have_http_status(:ok) + end + end + + describe "GET /admin/:admin_id/sincronizar_sigaa" do + it "renderiza a página de sincronização" do + get admin_sincronizar_sigaa_path(admin_id: admin.id) + expect(response).to have_http_status(:ok) + end + end + + describe "POST /admin/:admin_id/sincronizar_sigaa" do + let(:json_file) { fixture_file_upload(Rails.root.join("class_members.json"), "application/json") } + + it "redireciona com alerta quando arquivos ausentes" do + post admin_sincronizar_sigaa_path(admin_id: admin.id), params: { acao: "importar" } + expect(response).to be_redirect + end + + context "com SigaaImporter mockado" do + it "importar com resultado 'alguns dados'" do + allow(SigaaImporter).to receive(:import_from_files).and_return("alguns dados já foram importados") + post admin_sincronizar_sigaa_path(admin_id: admin.id), params: { + acao: "importar", arquivo_classes: json_file, arquivo_membros: json_file + } + expect(response).to redirect_to(admin_gerenciamento_path(admin)) + end + + it "atualizar com resultado 'alguns dados'" do + allow(SigaaImporter).to receive(:update_from_files).and_return("alguns dados já estão atualizados") + post admin_sincronizar_sigaa_path(admin_id: admin.id), params: { + acao: "atualizar", arquivo_classes: json_file, arquivo_membros: json_file + } + expect(response).to redirect_to(admin_gerenciamento_path(admin)) + end + + it "importar com resultado 'sucesso'" do + allow(SigaaImporter).to receive(:import_from_files).and_return("importação realizada com sucesso") + post admin_sincronizar_sigaa_path(admin_id: admin.id), params: { + acao: "importar", arquivo_classes: json_file, arquivo_membros: json_file + } + expect(response).to redirect_to(admin_gerenciamento_path(admin)) + expect(flash[:notice]).to include("estão presentes no sistema") + end + + it "atualizar com resultado 'sucesso'" do + allow(SigaaImporter).to receive(:update_from_files).and_return("atualização realizada com sucesso") + post admin_sincronizar_sigaa_path(admin_id: admin.id), params: { + acao: "atualizar", arquivo_classes: json_file, arquivo_membros: json_file + } + expect(response).to redirect_to(admin_gerenciamento_path(admin)) + expect(flash[:notice]).to include("atualizados no sistema") + end + + it "importar com resultado 'já existem'" do + allow(SigaaImporter).to receive(:import_from_files).and_return("os dados já existem") + post admin_sincronizar_sigaa_path(admin_id: admin.id), params: { + acao: "importar", arquivo_classes: json_file, arquivo_membros: json_file + } + expect(response).to redirect_to(admin_gerenciamento_path(admin)) + expect(flash[:alert]).to be_present + end + + it "atualizar com resultado 'já estão atualizados'" do + allow(SigaaImporter).to receive(:update_from_files).and_return("os dados já estão atualizados") + post admin_sincronizar_sigaa_path(admin_id: admin.id), params: { + acao: "atualizar", arquivo_classes: json_file, arquivo_membros: json_file + } + expect(response).to redirect_to(admin_gerenciamento_path(admin)) + expect(flash[:alert]).to be_present + end + + it "ação inválida resulta em redirect com alert" do + allow(SigaaImporter).to receive(:import_from_files).and_return("ação inválida") + post admin_sincronizar_sigaa_path(admin_id: admin.id), params: { + acao: "invalida", arquivo_classes: json_file, arquivo_membros: json_file + } + expect(response).to redirect_to(admin_gerenciamento_path(admin)) + expect(flash[:alert]).to be_present + end + end + end +end diff --git a/spec/requests/campo_forms_spec.rb b/spec/requests/campo_forms_spec.rb new file mode 100644 index 0000000000..e2e18d40d5 --- /dev/null +++ b/spec/requests/campo_forms_spec.rb @@ -0,0 +1,107 @@ +require 'rails_helper' + +RSpec.describe "CampoForms", type: :request do + let(:departamento) { Departamento.find_or_create_by!(nome: "Ciência da Computação", codigo: "CIC") } + let(:disciplina) { Disciplina.find_or_create_by!(nome: "Engenharia de Software", codigo: "CIC0097", departamento: departamento) } + let(:turma) { Turma.find_or_create_by!(numero_da_turma: "TA", disciplina: disciplina, semestre: "2026.1") } + let(:formulario) { Formulario.create!(turma: turma) } + let(:elemento_form) { ElementoForm.create!(ordem: 1, formulario: formulario) } + let!(:docente) do + Docente.create!( + nome: "Docente CF", + matricula: "doc_cf", + email: "doc_cf@unb.br", + formacao: "Doutorado", + senha: "Senha123", + senha_confirmation: "Senha123" + ) + end + let!(:campo_form) { CampoForm.create!(ordem: 1, enunciado: "Opção A", elemento_form: elemento_form) } + + before { post login_path, params: { login: docente.email, senha: "Senha123" } } + + describe "GET /campo_forms" do + it "sem sessão ativa redireciona para login" do + delete logout_path + get campo_forms_path + expect(response).to redirect_to(root_path) + end + + it "retorna 200 OK" do + get campo_forms_path + expect(response).to have_http_status(:ok) + end + end + + describe "GET /campo_forms/new" do + it "retorna 200 OK" do + get new_campo_form_path + expect(response).to have_http_status(:ok) + end + end + + describe "POST /campo_forms" do + it "cria campo_form com sucesso (happy path)" do + expect { + post campo_forms_path, params: { + campo_form: { ordem: 99, enunciado: "Nova Opção", elemento_form_id: elemento_form.id } + } + }.to change(CampoForm, :count).by(1) + + expect(response).to redirect_to(campo_form_url(CampoForm.last)) + end + + it "falha ao criar sem ordem (sad path)" do + expect { + post campo_forms_path, params: { + campo_form: { ordem: nil, enunciado: "X", elemento_form_id: elemento_form.id } + } + }.not_to change(CampoForm, :count) + + expect(response).to have_http_status(:unprocessable_content) + end + end + + describe "GET /campo_forms/:id" do + it "retorna 200 OK" do + get campo_form_path(campo_form) + expect(response).to have_http_status(:ok) + end + end + + describe "GET /campo_forms/:id/edit" do + it "retorna 200 OK" do + get edit_campo_form_path(campo_form) + expect(response).to have_http_status(:ok) + end + end + + describe "PATCH /campo_forms/:id" do + it "atualiza com sucesso (happy path)" do + patch campo_form_path(campo_form), params: { + campo_form: { ordem: 1, enunciado: "Opção Atualizada", elemento_form_id: elemento_form.id } + } + campo_form.reload + expect(campo_form.enunciado).to eq("Opção Atualizada") + expect(response).to redirect_to(campo_form_url(campo_form)) + end + + it "falha ao atualizar sem ordem (sad path)" do + patch campo_form_path(campo_form), params: { + campo_form: { ordem: nil, enunciado: "X", elemento_form_id: elemento_form.id } + } + expect(response).to have_http_status(:unprocessable_content) + end + end + + describe "DELETE /campo_forms/:id" do + it "destrói o campo_form e redireciona" do + cf = CampoForm.create!(ordem: 50, elemento_form: elemento_form) + expect { + delete campo_form_path(cf) + }.to change(CampoForm, :count).by(-1) + + expect(response).to redirect_to(campo_forms_url) + end + end +end diff --git a/spec/requests/campos_spec.rb b/spec/requests/campos_spec.rb new file mode 100644 index 0000000000..4dbc942c4f --- /dev/null +++ b/spec/requests/campos_spec.rb @@ -0,0 +1,109 @@ +require 'rails_helper' + +RSpec.describe "Campos", type: :request do + let(:departamento) { Departamento.find_or_create_by!(nome: "Ciência da Computação", codigo: "CIC") } + let!(:admin) do + Administrador.create!( + nome: "Admin Campo", + matricula: "adm_campo2", + email: "adm_campo2@unb.br", + senha: "Senha123", + senha_confirmation: "Senha123", + departamento: departamento + ) + end + let(:template) do + t = admin.templates.build(nome: "Template Campo") + t.save(validate: false) + t + end + let(:elemento) { Elemento.create!(enunciado: "Q1", ordem: 1, template: template) } + let!(:campo) { Campo.create!(ordem: 1, tipo_elemento: "Multipla Escolha", enunciado: "Opção A", elemento: elemento) } + + before { post login_path, params: { login: admin.email, senha: "Senha123" } } + + describe "GET /campos" do + it "sem sessão ativa redireciona para login" do + delete logout_path + get campos_path + expect(response).to redirect_to(root_path) + end + + it "retorna 200 OK" do + get campos_path + expect(response).to have_http_status(:ok) + end + end + + describe "GET /campos/new" do + it "retorna 200 OK" do + get new_campo_path + expect(response).to have_http_status(:ok) + end + end + + describe "POST /campos" do + it "cria campo com sucesso (happy path)" do + expect { + post campos_path, params: { + campo: { ordem: 99, tipo_elemento: "Texto", enunciado: "Novo campo", elemento_id: elemento.id } + } + }.to change(Campo, :count).by(1) + + expect(response).to redirect_to(campo_url(Campo.last)) + end + + it "falha ao criar sem tipo_elemento (sad path)" do + expect { + post campos_path, params: { + campo: { ordem: 2, tipo_elemento: "", enunciado: "X", elemento_id: elemento.id } + } + }.not_to change(Campo, :count) + + expect(response).to have_http_status(:unprocessable_content) + end + end + + describe "GET /campos/:id" do + it "retorna 200 OK" do + get campo_path(campo) + expect(response).to have_http_status(:ok) + end + end + + describe "GET /campos/:id/edit" do + it "retorna 200 OK" do + get edit_campo_path(campo) + expect(response).to have_http_status(:ok) + end + end + + describe "PATCH /campos/:id" do + it "atualiza com sucesso (happy path)" do + patch campo_path(campo), params: { + campo: { ordem: campo.ordem, tipo_elemento: "Texto", enunciado: "Atualizado", elemento_id: elemento.id } + } + campo.reload + expect(campo.enunciado).to eq("Atualizado") + expect(response).to redirect_to(campo_url(campo)) + end + + it "falha ao atualizar sem tipo_elemento (sad path)" do + patch campo_path(campo), params: { + campo: { ordem: 1, tipo_elemento: "", enunciado: "X", elemento_id: elemento.id } + } + expect(response).to have_http_status(:unprocessable_content) + end + end + + describe "DELETE /campos/:id" do + it "destrói o campo e redireciona" do + c = Campo.create!(ordem: 50, tipo_elemento: "Texto", elemento: elemento) + expect { + delete campo_path(c) + }.to change(Campo, :count).by(-1) + + expect(response).to redirect_to(campos_url) + end + end +end diff --git a/spec/requests/cursos_spec.rb b/spec/requests/cursos_spec.rb new file mode 100644 index 0000000000..62a23c8b8c --- /dev/null +++ b/spec/requests/cursos_spec.rb @@ -0,0 +1,94 @@ +require 'rails_helper' + +RSpec.describe "Cursos", type: :request do + let(:departamento) { Departamento.find_or_create_by!(nome: "Ciência da Computação", codigo: "CIC") } + let!(:docente) do + Docente.create!( + nome: "Docente Cursos", + matricula: "doc_cursos", + email: "doc_cursos@unb.br", + formacao: "Doutorado", + senha: "Senha123", + senha_confirmation: "Senha123" + ) + end + let!(:curso) { Curso.create!(nome: "Engenharia de Software", codigo: "ESW01", departamento: departamento) } + + before { post login_path, params: { login: docente.email, senha: "Senha123" } } + + describe "GET /cursos" do + it "sem sessão ativa redireciona para login" do + delete logout_path + get cursos_path + expect(response).to redirect_to(root_path) + end + + it "retorna 200 OK" do + get cursos_path + expect(response).to have_http_status(:ok) + end + end + + describe "GET /cursos/new" do + it "retorna 200 OK" do + get new_curso_path + expect(response).to have_http_status(:ok) + end + end + + describe "POST /cursos" do + it "cria curso com sucesso (happy path)" do + expect { + post cursos_path, params: { curso: { nome: "Novo Curso", codigo: "NC01", departamento_id: departamento.id } } + }.to change(Curso, :count).by(1) + + expect(response).to redirect_to(curso_url(Curso.last)) + end + + it "falha ao criar curso com dados inválidos (sad path)" do + expect { + post cursos_path, params: { curso: { nome: "", codigo: "", departamento_id: departamento.id } } + }.not_to change(Curso, :count) + + expect(response).to have_http_status(:unprocessable_content) + end + end + + describe "GET /cursos/:id" do + it "retorna 200 OK" do + get curso_path(curso) + expect(response).to have_http_status(:ok) + end + end + + describe "GET /cursos/:id/edit" do + it "retorna 200 OK" do + get edit_curso_path(curso) + expect(response).to have_http_status(:ok) + end + end + + describe "PATCH /cursos/:id" do + it "atualiza curso com sucesso (happy path)" do + patch curso_path(curso), params: { curso: { nome: "Nome Atualizado", codigo: curso.codigo, departamento_id: departamento.id } } + curso.reload + expect(curso.nome).to eq("Nome Atualizado") + expect(response).to redirect_to(curso_url(curso)) + end + + it "falha ao atualizar com dados inválidos (sad path)" do + patch curso_path(curso), params: { curso: { nome: "", codigo: "", departamento_id: departamento.id } } + expect(response).to have_http_status(:unprocessable_content) + end + end + + describe "DELETE /cursos/:id" do + it "destrói o curso e redireciona" do + expect { + delete curso_path(curso) + }.to change(Curso, :count).by(-1) + + expect(response).to redirect_to(cursos_url) + end + end +end diff --git a/spec/requests/departamentos_spec.rb b/spec/requests/departamentos_spec.rb new file mode 100644 index 0000000000..d5d81cff36 --- /dev/null +++ b/spec/requests/departamentos_spec.rb @@ -0,0 +1,94 @@ +require 'rails_helper' + +RSpec.describe "Departamentos", type: :request do + let!(:docente) do + Docente.create!( + nome: "Docente Dep", + matricula: "doc_dep", + email: "doc_dep@unb.br", + formacao: "Doutorado", + senha: "Senha123", + senha_confirmation: "Senha123" + ) + end + let!(:departamento) { Departamento.create!(nome: "Matemática", codigo: "MAT01") } + + before { post login_path, params: { login: docente.email, senha: "Senha123" } } + + describe "GET /departamentos" do + it "sem sessão ativa redireciona para login" do + delete logout_path + get departamentos_path + expect(response).to redirect_to(root_path) + end + + it "retorna 200 OK" do + get departamentos_path + expect(response).to have_http_status(:ok) + end + end + + describe "GET /departamentos/new" do + it "retorna 200 OK" do + get new_departamento_path + expect(response).to have_http_status(:ok) + end + end + + describe "POST /departamentos" do + it "cria departamento com sucesso (happy path)" do + expect { + post departamentos_path, params: { departamento: { nome: "Física", codigo: "FIS01" } } + }.to change(Departamento, :count).by(1) + + expect(response).to redirect_to(departamento_url(Departamento.last)) + end + + it "falha ao criar com dados inválidos (sad path)" do + expect { + post departamentos_path, params: { departamento: { nome: "", codigo: "" } } + }.not_to change(Departamento, :count) + + expect(response).to have_http_status(:unprocessable_content) + end + end + + describe "GET /departamentos/:id" do + it "retorna 200 OK" do + get departamento_path(departamento) + expect(response).to have_http_status(:ok) + end + end + + describe "GET /departamentos/:id/edit" do + it "retorna 200 OK" do + get edit_departamento_path(departamento) + expect(response).to have_http_status(:ok) + end + end + + describe "PATCH /departamentos/:id" do + it "atualiza com sucesso (happy path)" do + patch departamento_path(departamento), params: { departamento: { nome: "Matemática Aplicada", codigo: departamento.codigo } } + departamento.reload + expect(departamento.nome).to eq("Matemática Aplicada") + expect(response).to redirect_to(departamento_url(departamento)) + end + + it "falha ao atualizar com dados inválidos (sad path)" do + patch departamento_path(departamento), params: { departamento: { nome: "", codigo: "" } } + expect(response).to have_http_status(:unprocessable_content) + end + end + + describe "DELETE /departamentos/:id" do + it "destrói o departamento e redireciona" do + dep = Departamento.create!(nome: "Para Deletar", codigo: "DEL01") + expect { + delete departamento_path(dep) + }.to change(Departamento, :count).by(-1) + + expect(response).to redirect_to(departamentos_url) + end + end +end diff --git a/spec/requests/discentes_spec.rb b/spec/requests/discentes_spec.rb new file mode 100644 index 0000000000..d2dfbda8ed --- /dev/null +++ b/spec/requests/discentes_spec.rb @@ -0,0 +1,113 @@ +require 'rails_helper' + +RSpec.describe "Discentes", type: :request do + let(:departamento) { Departamento.find_or_create_by!(nome: "Ciência da Computação", codigo: "CIC") } + let(:curso) { Curso.find_or_create_by!(nome: "Engenharia de Software", codigo: "ESW_D", departamento: departamento) } + let!(:docente) do + Docente.create!( + nome: "Docente Disc2", + matricula: "doc_disc2", + email: "doc_disc2@unb.br", + formacao: "Doutorado", + senha: "Senha123", + senha_confirmation: "Senha123" + ) + end + let!(:discente) do + Discente.create!( + nome: "Discente Teste", + matricula: "disc_teste", + email: "disc_teste@unb.br", + curso: curso, + senha: "Senha123", + senha_confirmation: "Senha123" + ) + end + + before { post login_path, params: { login: docente.email, senha: "Senha123" } } + + describe "GET /discentes" do + it "sem sessão ativa redireciona para login" do + delete logout_path + get discentes_path + expect(response).to redirect_to(root_path) + end + + it "retorna 200 OK" do + get discentes_path + expect(response).to have_http_status(:ok) + end + end + + describe "GET /discentes/new" do + it "retorna 200 OK" do + get new_discente_path + expect(response).to have_http_status(:ok) + end + end + + describe "POST /discentes" do + it "cria discente com sucesso (happy path)" do + expect { + post discentes_path, params: { + discente: { nome: "Novo Aluno", matricula: "disc_novo", email: "disc_novo@unb.br", curso_id: curso.id } + } + }.to change(Discente, :count).by(1) + + expect(response).to redirect_to(discente_url(Discente.last)) + end + + it "falha ao criar com dados inválidos (sad path)" do + expect { + post discentes_path, params: { + discente: { nome: "", matricula: "", email: "", curso_id: nil } + } + }.not_to change(Discente, :count) + + expect(response).to have_http_status(:unprocessable_content) + end + end + + describe "GET /discentes/:id" do + it "retorna 200 OK" do + get discente_path(discente) + expect(response).to have_http_status(:ok) + end + end + + describe "GET /discentes/:id/edit" do + it "retorna 200 OK" do + get edit_discente_path(discente) + expect(response).to have_http_status(:ok) + end + end + + describe "PATCH /discentes/:id" do + it "atualiza com sucesso (happy path)" do + patch discente_path(discente), params: { + discente: { nome: "Aluno Atualizado", matricula: discente.matricula, email: discente.email, curso_id: curso.id } + } + discente.reload + expect(discente.nome).to eq("Aluno Atualizado") + expect(response).to redirect_to(discente_url(discente)) + end + + it "falha ao atualizar com dados inválidos (sad path)" do + patch discente_path(discente), params: { + discente: { nome: "", matricula: "", email: "", curso_id: nil } + } + expect(response).to have_http_status(:unprocessable_content) + end + end + + describe "DELETE /discentes/:id" do + it "destrói o discente e redireciona" do + d = Discente.create!(nome: "Para Deletar", matricula: "del_disc", email: "del_disc@unb.br", curso: curso) + expect { + delete discente_path(d) + }.to change(Discente, :count).by(-1) + + expect(response).to redirect_to(discentes_url) + end + end +end diff --git a/spec/requests/disciplinas_spec.rb b/spec/requests/disciplinas_spec.rb new file mode 100644 index 0000000000..f4ceb01271 --- /dev/null +++ b/spec/requests/disciplinas_spec.rb @@ -0,0 +1,103 @@ +require 'rails_helper' + +RSpec.describe "Disciplinas", type: :request do + let(:departamento) { Departamento.find_or_create_by!(nome: "Ciência da Computação", codigo: "CIC") } + let!(:docente) do + Docente.create!( + nome: "Docente Disc", + matricula: "doc_disc", + email: "doc_disc@unb.br", + formacao: "Doutorado", + senha: "Senha123", + senha_confirmation: "Senha123" + ) + end + let!(:disciplina) { Disciplina.create!(nome: "Álgebra Linear", codigo: "MAT001D", departamento: departamento) } + + before { post login_path, params: { login: docente.email, senha: "Senha123" } } + + describe "GET /disciplinas" do + it "sem sessão ativa redireciona para login" do + delete logout_path + get disciplinas_path + expect(response).to redirect_to(root_path) + end + + it "retorna 200 OK" do + get disciplinas_path + expect(response).to have_http_status(:ok) + end + end + + describe "GET /disciplinas/new" do + it "retorna 200 OK" do + get new_disciplina_path + expect(response).to have_http_status(:ok) + end + end + + describe "POST /disciplinas" do + it "cria disciplina com sucesso (happy path)" do + expect { + post disciplinas_path, params: { + disciplina: { nome: "Cálculo 1", codigo: "MAT002D", departamento_id: departamento.id } + } + }.to change(Disciplina, :count).by(1) + + expect(response).to redirect_to(disciplina_url(Disciplina.last)) + end + + it "falha ao criar com dados inválidos (sad path)" do + expect { + post disciplinas_path, params: { + disciplina: { nome: "", codigo: "", departamento_id: departamento.id } + } + }.not_to change(Disciplina, :count) + + expect(response).to have_http_status(:unprocessable_content) + end + end + + describe "GET /disciplinas/:id" do + it "retorna 200 OK" do + get disciplina_path(disciplina) + expect(response).to have_http_status(:ok) + end + end + + describe "GET /disciplinas/:id/edit" do + it "retorna 200 OK" do + get edit_disciplina_path(disciplina) + expect(response).to have_http_status(:ok) + end + end + + describe "PATCH /disciplinas/:id" do + it "atualiza com sucesso (happy path)" do + patch disciplina_path(disciplina), params: { + disciplina: { nome: "Álgebra Linear Avançada", codigo: disciplina.codigo, departamento_id: departamento.id } + } + disciplina.reload + expect(disciplina.nome).to eq("Álgebra Linear Avançada") + expect(response).to redirect_to(disciplina_url(disciplina)) + end + + it "falha ao atualizar com dados inválidos (sad path)" do + patch disciplina_path(disciplina), params: { + disciplina: { nome: "", codigo: "", departamento_id: departamento.id } + } + expect(response).to have_http_status(:unprocessable_content) + end + end + + describe "DELETE /disciplinas/:id" do + it "destrói a disciplina e redireciona" do + disc = Disciplina.create!(nome: "Para Deletar", codigo: "DEL001D", departamento: departamento) + expect { + delete disciplina_path(disc) + }.to change(Disciplina, :count).by(-1) + + expect(response).to redirect_to(disciplinas_url) + end + end +end diff --git a/spec/requests/docentes_spec.rb b/spec/requests/docentes_spec.rb new file mode 100644 index 0000000000..94b517a796 --- /dev/null +++ b/spec/requests/docentes_spec.rb @@ -0,0 +1,101 @@ +require 'rails_helper' + +RSpec.describe "Docentes", type: :request do + let!(:docente) do + Docente.create!( + nome: "Docente Principal", + matricula: "doc_princ", + email: "doc_princ@unb.br", + formacao: "Doutorado", + senha: "Senha123", + senha_confirmation: "Senha123" + ) + end + + before { post login_path, params: { login: docente.email, senha: "Senha123" } } + + describe "GET /docentes" do + it "sem sessão ativa redireciona para login" do + delete logout_path + get docentes_path + expect(response).to redirect_to(root_path) + end + + it "retorna 200 OK" do + get docentes_path + expect(response).to have_http_status(:ok) + end + end + + describe "GET /docentes/new" do + it "retorna 200 OK" do + get new_docente_path + expect(response).to have_http_status(:ok) + end + end + + describe "POST /docentes" do + it "cria docente com sucesso (happy path)" do + expect { + post docentes_path, params: { + docente: { nome: "Novo Docente", matricula: "doc_novo", email: "doc_novo@unb.br", formacao: "Mestrado" } + } + }.to change(Docente, :count).by(1) + + expect(response).to redirect_to(docente_url(Docente.last)) + end + + it "falha ao criar com dados inválidos (sad path)" do + expect { + post docentes_path, params: { + docente: { nome: "", matricula: "", email: "", formacao: "" } + } + }.not_to change(Docente, :count) + + expect(response).to have_http_status(:unprocessable_content) + end + end + + describe "GET /docentes/:id" do + it "retorna 200 OK" do + get docente_path(docente) + expect(response).to have_http_status(:ok) + end + end + + describe "GET /docentes/:id/edit" do + it "retorna 200 OK" do + get edit_docente_path(docente) + expect(response).to have_http_status(:ok) + end + end + + describe "PATCH /docentes/:id" do + it "atualiza com sucesso (happy path)" do + patch docente_path(docente), params: { + docente: { nome: "Nome Atualizado", matricula: docente.matricula, email: docente.email, formacao: "PhD" } + } + docente.reload + expect(docente.nome).to eq("Nome Atualizado") + expect(response).to redirect_to(docente_url(docente)) + end + + it "falha ao atualizar com dados inválidos (sad path)" do + patch docente_path(docente), params: { + docente: { nome: "", matricula: "", email: "", formacao: "" } + } + expect(response).to have_http_status(:unprocessable_content) + end + end + + describe "DELETE /docentes/:id" do + it "destrói o docente e redireciona" do + d = Docente.create!(nome: "Para Deletar", matricula: "del_doc", email: "del_doc@unb.br", formacao: "Grad") + expect { + delete docente_path(d) + }.to change(Docente, :count).by(-1) + + expect(response).to redirect_to(docentes_url) + end + end +end diff --git a/spec/requests/elemento_forms_spec.rb b/spec/requests/elemento_forms_spec.rb new file mode 100644 index 0000000000..232b963a30 --- /dev/null +++ b/spec/requests/elemento_forms_spec.rb @@ -0,0 +1,106 @@ +require 'rails_helper' + +RSpec.describe "ElementoForms", type: :request do + let(:departamento) { Departamento.find_or_create_by!(nome: "Ciência da Computação", codigo: "CIC") } + let(:disciplina) { Disciplina.find_or_create_by!(nome: "Engenharia de Software", codigo: "CIC0097", departamento: departamento) } + let(:turma) { Turma.find_or_create_by!(numero_da_turma: "TA", disciplina: disciplina, semestre: "2026.1") } + let(:formulario) { Formulario.create!(turma: turma) } + let!(:docente) do + Docente.create!( + nome: "Docente EF", + matricula: "doc_ef", + email: "doc_ef@unb.br", + formacao: "Doutorado", + senha: "Senha123", + senha_confirmation: "Senha123" + ) + end + let!(:elemento_form) { ElementoForm.create!(ordem: 1, enunciado: "Questão EF", formulario: formulario) } + + before { post login_path, params: { login: docente.email, senha: "Senha123" } } + + describe "GET /elemento_forms" do + it "sem sessão ativa redireciona para login" do + delete logout_path + get elemento_forms_path + expect(response).to redirect_to(root_path) + end + + it "retorna 200 OK" do + get elemento_forms_path + expect(response).to have_http_status(:ok) + end + end + + describe "GET /elemento_forms/new" do + it "retorna 200 OK" do + get new_elemento_form_path + expect(response).to have_http_status(:ok) + end + end + + describe "POST /elemento_forms" do + it "cria elemento_form com sucesso (happy path)" do + expect { + post elemento_forms_path, params: { + elemento_form: { ordem: 99, enunciado: "Novo EF", formulario_id: formulario.id } + } + }.to change(ElementoForm, :count).by(1) + + expect(response).to redirect_to(elemento_form_url(ElementoForm.last)) + end + + it "falha ao criar sem ordem (sad path)" do + expect { + post elemento_forms_path, params: { + elemento_form: { ordem: nil, enunciado: "EF", formulario_id: formulario.id } + } + }.not_to change(ElementoForm, :count) + + expect(response).to have_http_status(:unprocessable_content) + end + end + + describe "GET /elemento_forms/:id" do + it "retorna 200 OK" do + get elemento_form_path(elemento_form) + expect(response).to have_http_status(:ok) + end + end + + describe "GET /elemento_forms/:id/edit" do + it "retorna 200 OK" do + get edit_elemento_form_path(elemento_form) + expect(response).to have_http_status(:ok) + end + end + + describe "PATCH /elemento_forms/:id" do + it "atualiza com sucesso (happy path)" do + patch elemento_form_path(elemento_form), params: { + elemento_form: { ordem: 1, enunciado: "EF Atualizado", formulario_id: formulario.id } + } + elemento_form.reload + expect(elemento_form.enunciado).to eq("EF Atualizado") + expect(response).to redirect_to(elemento_form_url(elemento_form)) + end + + it "falha ao atualizar sem ordem (sad path)" do + patch elemento_form_path(elemento_form), params: { + elemento_form: { ordem: nil, enunciado: "EF", formulario_id: formulario.id } + } + expect(response).to have_http_status(:unprocessable_content) + end + end + + describe "DELETE /elemento_forms/:id" do + it "destrói o elemento_form e redireciona" do + ef = ElementoForm.create!(ordem: 50, formulario: formulario) + expect { + delete elemento_form_path(ef) + }.to change(ElementoForm, :count).by(-1) + + expect(response).to redirect_to(elemento_forms_url) + end + end +end diff --git a/spec/requests/elementos_spec.rb b/spec/requests/elementos_spec.rb new file mode 100644 index 0000000000..d472029e79 --- /dev/null +++ b/spec/requests/elementos_spec.rb @@ -0,0 +1,109 @@ +require 'rails_helper' + +RSpec.describe "Elementos", type: :request do + let(:departamento) { Departamento.find_or_create_by!(nome: "Ciência da Computação", codigo: "CIC") } + let!(:admin) do + Administrador.create!( + nome: "Admin Elem", + matricula: "adm_elem2", + email: "adm_elem2@unb.br", + senha: "Senha123", + senha_confirmation: "Senha123", + departamento: departamento + ) + end + let(:template) do + t = admin.templates.build(nome: "Template Elem") + t.elementos.build(enunciado: "Q Setup", ordem: 1) + t.save! + t + end + let!(:elemento) { template.elementos.first } + + before { post login_path, params: { login: admin.email, senha: "Senha123" } } + + describe "GET /elementos" do + it "sem sessão ativa redireciona para login" do + delete logout_path + get elementos_path + expect(response).to redirect_to(root_path) + end + + it "retorna 200 OK" do + get elementos_path + expect(response).to have_http_status(:ok) + end + end + + describe "GET /elementos/new" do + it "retorna 200 OK" do + get new_elemento_path + expect(response).to have_http_status(:ok) + end + end + + describe "POST /elementos" do + it "cria elemento com sucesso (happy path)" do + expect { + post elementos_path, params: { + elemento: { enunciado: "Nova Questão", ordem: 99, template_id: template.id } + } + }.to change(Elemento, :count).by(1) + + expect(response).to redirect_to(elemento_url(Elemento.last)) + end + + it "falha ao criar sem template (sad path)" do + expect { + post elementos_path, params: { + elemento: { enunciado: "Questão", ordem: 1, template_id: nil } + } + }.not_to change(Elemento, :count) + + expect(response).to have_http_status(:unprocessable_content) + end + end + + describe "GET /elementos/:id" do + it "retorna 200 OK" do + get elemento_path(elemento) + expect(response).to have_http_status(:ok) + end + end + + describe "GET /elementos/:id/edit" do + it "retorna 200 OK" do + get edit_elemento_path(elemento) + expect(response).to have_http_status(:ok) + end + end + + describe "PATCH /elementos/:id" do + it "atualiza com sucesso (happy path)" do + patch elemento_path(elemento), params: { + elemento: { enunciado: "Questão Atualizada", ordem: elemento.ordem, template_id: template.id } + } + elemento.reload + expect(elemento.enunciado).to eq("Questão Atualizada") + expect(response).to redirect_to(elemento_url(elemento)) + end + + it "falha ao atualizar sem template (sad path)" do + patch elemento_path(elemento), params: { + elemento: { enunciado: "Q", ordem: 1, template_id: nil } + } + expect(response).to have_http_status(:unprocessable_content) + end + end + + describe "DELETE /elementos/:id" do + it "destrói o elemento e redireciona" do + e = Elemento.create!(enunciado: "Para Deletar", ordem: 50, template: template) + expect { + delete elemento_path(e) + }.to change(Elemento, :count).by(-1) + + expect(response).to redirect_to(elementos_url) + end + end +end diff --git a/spec/requests/formulario_spec.rb b/spec/requests/formulario_spec.rb new file mode 100644 index 0000000000..1e43978085 --- /dev/null +++ b/spec/requests/formulario_spec.rb @@ -0,0 +1,109 @@ +require 'rails_helper' + +RSpec.describe "Formularios", type: :request do + let(:departamento) { Departamento.find_or_create_by!(nome: "Ciência da Computação", codigo: "CIC") } + let(:disciplina) { Disciplina.find_or_create_by!(nome: "Engenharia de Software", codigo: "CIC0097", departamento: departamento) } + let(:turma) { Turma.find_or_create_by!(numero_da_turma: "TA", disciplina: disciplina, semestre: "2026.1") } + + let(:curso) { Curso.find_or_create_by!(nome: "Ciência da Computação", codigo: "CIC", departamento: departamento) } + + let(:admin) do + Administrador.create!( + nome: "Admin", matricula: "123", email: "admin@unb.br", + senha: "Senha123", senha_confirmation: "Senha123", departamento: departamento + ) + end + + let(:discente) do + Discente.create!( + nome: "Aluno Teste", matricula: "241000", email: "aluno@unb.br", + curso: curso, # 2. Recebendo a variável em vez da string! + senha: "Senha123", senha_confirmation: "Senha123" + ) + end + + describe "Criar formulário (Admin)" do + before { post login_path, params: { login: admin.email, senha: "Senha123" } } + + it "cria um formulário vinculando à turma" do + expect { + post formularios_path, params: { + formulario: { + turma_id: turma.id + } + } + }.to change(Formulario, :count).by(1) + + expect(response).to be_redirect + end + end + + describe "Visualizar formulários (Participante)" do + let!(:formulario) do + Formulario.create!(turma: turma) + end + + before do + post login_path, params: { login: discente.email, senha: "Senha123" } + end + + it "lista os formulários disponíveis para o aluno" do + get formularios_path + expect(response).to have_http_status(:ok) + end + end + + describe "Ações CRUD complementares" do + let!(:outra_turma) { Turma.find_or_create_by!(numero_da_turma: "TB", disciplina: disciplina, semestre: "2026.1") } + let!(:formulario) { Formulario.create!(turma: turma) } + + before do + post login_path, params: { login: admin.email, senha: "Senha123" } + end + + it "acessa a página de show" do + get formulario_path(formulario) + expect(response).to have_http_status(:ok) + end + + it "acessa a página de new" do + get new_formulario_path + expect(response).to have_http_status(:ok) + end + + it "acessa a página de edit" do + get edit_formulario_path(formulario) + expect(response).to have_http_status(:ok) + end + + it "falha ao criar um formulário inválido (sad path)" do + expect { + post formularios_path, params: { formulario: { turma_id: nil } } + }.to change(Formulario, :count).by(0) + + expect(response).to have_http_status(:unprocessable_content) + end + + it "atualiza um formulário existente com sucesso (happy path)" do + patch formulario_path(formulario), params: { formulario: { turma_id: outra_turma.id } } + formulario.reload + + expect(formulario.turma_id).to eq(outra_turma.id) + expect(response).to redirect_to(formulario_url(formulario)) + end + + it "falha ao atualizar com dados inválidos (sad path)" do + patch formulario_path(formulario), params: { formulario: { turma_id: nil } } + + expect(response).to have_http_status(:unprocessable_content) + end + + it "deleta um formulário com sucesso" do + expect { + delete formulario_path(formulario) + }.to change(Formulario, :count).by(-1) + + expect(response).to redirect_to(formularios_url) + end + end +end diff --git a/spec/requests/home_spec.rb b/spec/requests/home_spec.rb new file mode 100644 index 0000000000..7054f084bc --- /dev/null +++ b/spec/requests/home_spec.rb @@ -0,0 +1,33 @@ +require 'rails_helper' + +RSpec.describe "Home", type: :request do + let(:departamento) { Departamento.find_or_create_by!(nome: "Ciência da Computação", codigo: "CIC") } + let!(:docente) do + Docente.create!( + nome: "Docente Home", + matricula: "doc_home", + email: "doc_home@unb.br", + formacao: "Doutorado", + senha: "Senha123", + senha_confirmation: "Senha123" + ) + end + + describe "GET /inicio" do + context "sem sessão ativa" do + it "redireciona para a tela de login" do + get inicio_path + expect(response).to redirect_to(root_path) + end + end + + context "com sessão ativa" do + before { post login_path, params: { login: docente.email, senha: "Senha123" } } + + it "retorna 200 OK" do + get inicio_path + expect(response).to have_http_status(:ok) + end + end + end +end diff --git a/spec/requests/importacao_sigaa_spec.rb b/spec/requests/importacao_sigaa_spec.rb new file mode 100644 index 0000000000..7d6ac1fc5d --- /dev/null +++ b/spec/requests/importacao_sigaa_spec.rb @@ -0,0 +1,33 @@ +require 'rails_helper' + +RSpec.describe "Importação SIGAA", type: :request do + let(:departamento) { Departamento.find_or_create_by!(nome: "Ciência da Computação", codigo: "CIC") } + let(:admin) do + Administrador.create!( + nome: "Admin", + matricula: "123", + email: "admin@unb.br", + senha: "Senha123", + senha_confirmation: "Senha123", + departamento: departamento + ) + end + + before do + post login_path, params: { login: admin.email, senha: "Senha123" } + end + + describe "POST /admin/:admin_id/sincronizar_sigaa" do + it "importa usuários do JSON com sucesso" do + json_file = fixture_file_upload(Rails.root.join('class_members.json'), 'application/json') + + post admin_sincronizar_sigaa_path(admin_id: admin.id), params: { + acao: "importar", + arquivo_classes: json_file, + arquivo_membros: json_file + } + + expect(response).to redirect_to(admin_gerenciamento_path(admin)) + end + end +end diff --git a/spec/requests/resposta_elems_spec.rb b/spec/requests/resposta_elems_spec.rb new file mode 100644 index 0000000000..66ca06ecf3 --- /dev/null +++ b/spec/requests/resposta_elems_spec.rb @@ -0,0 +1,139 @@ +require 'rails_helper' + +RSpec.describe "RespostaElems", type: :request do + let(:departamento) { Departamento.find_or_create_by!(nome: "Ciência da Computação", codigo: "CIC") } + let(:disciplina) { Disciplina.find_or_create_by!(nome: "Engenharia de Software", codigo: "CIC0097", departamento: departamento) } + let(:turma) { Turma.find_or_create_by!(numero_da_turma: "TA", disciplina: disciplina, semestre: "2026.1") } + let(:formulario) { Formulario.create!(turma: turma) } + let(:elemento_form) { ElementoForm.create!(ordem: 1, tipo: "Texto", formulario: formulario) } + let!(:docente) do + Docente.create!( + nome: "Docente RE2", + matricula: "doc_re2", + email: "doc_re2@unb.br", + formacao: "Doutorado", + senha: "Senha123", + senha_confirmation: "Senha123" + ) + end + let(:resposta_form) do + RespostaForm.create!(data_submissao: Date.today, formulario: formulario, usuario: docente) + end + let!(:resposta_elem) do + RespostaElem.create!( + texto_resposta: "Resposta inicial", + resposta_form: resposta_form, + elemento_form: elemento_form + ) + end + + before { post login_path, params: { login: docente.email, senha: "Senha123" } } + + describe "GET /resposta_elems" do + it "sem sessão ativa redireciona para login" do + delete logout_path + get resposta_elems_path + expect(response).to redirect_to(root_path) + end + + it "retorna 200 OK" do + get resposta_elems_path + expect(response).to have_http_status(:ok) + end + end + + describe "GET /resposta_elems/new" do + it "retorna 200 OK" do + get new_resposta_elem_path + expect(response).to have_http_status(:ok) + end + end + + describe "POST /resposta_elems" do + let(:outro_ef) { ElementoForm.create!(ordem: 2, formulario: formulario) } + + it "cria resposta_elem com sucesso (happy path)" do + expect { + post resposta_elems_path, params: { + resposta_elem: { + texto_resposta: "Nova Resposta", + resposta_form_id: resposta_form.id, + elemento_form_id: outro_ef.id + } + } + }.to change(RespostaElem, :count).by(1) + + expect(response).to redirect_to(resposta_elem_url(RespostaElem.last)) + end + + it "falha ao criar sem texto_resposta (sad path)" do + expect { + post resposta_elems_path, params: { + resposta_elem: { + texto_resposta: "", + resposta_form_id: resposta_form.id, + elemento_form_id: outro_ef.id + } + } + }.not_to change(RespostaElem, :count) + + expect(response).to have_http_status(:unprocessable_content) + end + end + + describe "GET /resposta_elems/:id" do + it "retorna 200 OK" do + get resposta_elem_path(resposta_elem) + expect(response).to have_http_status(:ok) + end + end + + describe "GET /resposta_elems/:id/edit" do + it "retorna 200 OK" do + get edit_resposta_elem_path(resposta_elem) + expect(response).to have_http_status(:ok) + end + end + + describe "PATCH /resposta_elems/:id" do + it "atualiza com sucesso (happy path)" do + patch resposta_elem_path(resposta_elem), params: { + resposta_elem: { + texto_resposta: "Texto Atualizado", + resposta_form_id: resposta_form.id, + elemento_form_id: elemento_form.id + } + } + resposta_elem.reload + expect(resposta_elem.texto_resposta).to eq("Texto Atualizado") + expect(response).to redirect_to(resposta_elem_url(resposta_elem)) + end + + it "falha ao atualizar sem texto_resposta (sad path)" do + patch resposta_elem_path(resposta_elem), params: { + resposta_elem: { + texto_resposta: "", + resposta_form_id: resposta_form.id, + elemento_form_id: elemento_form.id + } + } + expect(response).to have_http_status(:unprocessable_content) + end + end + + describe "DELETE /resposta_elems/:id" do + it "destrói a resposta_elem e redireciona" do + outro_doc = Docente.create!(nome: "Del RE", matricula: "del_re", email: "del_re@unb.br", formacao: "Grad") + outro_form_obj = Formulario.create!(turma: turma) + outro_ef2 = ElementoForm.create!(ordem: 1, formulario: outro_form_obj) + outro_rf = RespostaForm.create!(data_submissao: Date.today, formulario: outro_form_obj, usuario: outro_doc) + re = RespostaElem.create!(texto_resposta: "Para Deletar", resposta_form: outro_rf, elemento_form: outro_ef2) + + expect { + delete resposta_elem_path(re) + }.to change(RespostaElem, :count).by(-1) + + expect(response).to redirect_to(resposta_elems_url) + end + end +end diff --git a/spec/requests/resposta_forms_spec.rb b/spec/requests/resposta_forms_spec.rb new file mode 100644 index 0000000000..d136e25bfd --- /dev/null +++ b/spec/requests/resposta_forms_spec.rb @@ -0,0 +1,141 @@ +require 'rails_helper' + +RSpec.describe "RespostaForms", type: :request do + let(:departamento) { Departamento.find_or_create_by!(nome: "Ciência da Computação", codigo: "CIC") } + let(:disciplina) { Disciplina.find_or_create_by!(nome: "Engenharia de Software", codigo: "CIC0097", departamento: departamento) } + let(:turma) { Turma.find_or_create_by!(numero_da_turma: "TA", disciplina: disciplina, semestre: "2026.1") } + let(:formulario) { Formulario.create!(turma: turma) } + let!(:docente) do + Docente.create!( + nome: "Docente RF2", + matricula: "doc_rf2", + email: "doc_rf2@unb.br", + formacao: "Doutorado", + senha: "Senha123", + senha_confirmation: "Senha123" + ) + end + let!(:resposta_form) do + RespostaForm.create!(data_submissao: Date.today, formulario: formulario, usuario: docente) + end + + before { post login_path, params: { login: docente.email, senha: "Senha123" } } + + describe "GET /resposta_forms" do + it "sem sessão ativa redireciona para login" do + delete logout_path + get resposta_forms_path + expect(response).to redirect_to(root_path) + end + + it "retorna 200 OK" do + get resposta_forms_path + expect(response).to have_http_status(:ok) + end + end + + describe "GET /resposta_forms/new" do + it "retorna 200 OK" do + get new_resposta_form_path + expect(response).to have_http_status(:ok) + end + end + + describe "POST /resposta_forms" do + let(:outro_formulario) { Formulario.create!(turma: turma) } + let(:outro_docente) do + Docente.create!( + nome: "Docente RF3", + matricula: "doc_rf3", + email: "doc_rf3@unb.br", + formacao: "Mestrado", + senha: "Senha123", + senha_confirmation: "Senha123" + ) + end + + it "cria resposta_form com sucesso (happy path)" do + expect { + post resposta_forms_path, params: { + resposta_form: { + data_submissao: Date.today, + formulario_id: outro_formulario.id, + usuario_id: docente.id + } + } + }.to change(RespostaForm, :count).by(1) + + expect(response).to redirect_to(resposta_form_url(RespostaForm.last)) + end + + it "falha ao criar sem data_submissao (sad path)" do + expect { + post resposta_forms_path, params: { + resposta_form: { + data_submissao: nil, + formulario_id: formulario.id, + usuario_id: outro_docente.id + } + } + }.not_to change(RespostaForm, :count) + + expect(response).to have_http_status(:unprocessable_content) + end + end + + describe "GET /resposta_forms/:id" do + it "retorna 200 OK" do + get resposta_form_path(resposta_form) + expect(response).to have_http_status(:ok) + end + end + + describe "GET /resposta_forms/:id/edit" do + it "retorna 200 OK" do + get edit_resposta_form_path(resposta_form) + expect(response).to have_http_status(:ok) + end + end + + describe "PATCH /resposta_forms/:id" do + let(:outro_formulario) { Formulario.create!(turma: turma) } + + it "atualiza com sucesso (happy path)" do + patch resposta_form_path(resposta_form), params: { + resposta_form: { + data_submissao: Date.yesterday, + formulario_id: resposta_form.formulario_id, + usuario_id: resposta_form.usuario_id + } + } + resposta_form.reload + expect(resposta_form.data_submissao).to eq(Date.yesterday) + expect(response).to redirect_to(resposta_form_url(resposta_form)) + end + + it "falha ao atualizar sem data_submissao (sad path)" do + patch resposta_form_path(resposta_form), params: { + resposta_form: { + data_submissao: nil, + formulario_id: resposta_form.formulario_id, + usuario_id: resposta_form.usuario_id + } + } + expect(response).to have_http_status(:unprocessable_content) + end + end + + describe "DELETE /resposta_forms/:id" do + it "destrói a resposta_form e redireciona" do + outro_doc = Docente.create!(nome: "Del RF", matricula: "del_rf", email: "del_rf@unb.br", formacao: "Grad") + outro_form = Formulario.create!(turma: turma) + rf = RespostaForm.create!(data_submissao: Date.today, formulario: outro_form, usuario: outro_doc) + + expect { + delete resposta_form_path(rf) + }.to change(RespostaForm, :count).by(-1) + + expect(response).to redirect_to(resposta_forms_url) + end + end +end diff --git a/spec/requests/senhas_spec.rb b/spec/requests/senhas_spec.rb new file mode 100644 index 0000000000..84e1a05830 --- /dev/null +++ b/spec/requests/senhas_spec.rb @@ -0,0 +1,165 @@ +require 'rails_helper' + +RSpec.describe "Gerenciamento de Senhas", type: :request do + let(:departamento) { Departamento.find_or_create_by!(nome: "Ciência da Computação", codigo: "CIC") } + + let(:usuario_sem_senha) do + Docente.create!( + nome: "Novo Professor", + matricula: "doc002", + email: "novo@unb.br", + formacao: "Mestrado", + senha_hash: nil, + definicao_senha_token: "token_definicao_123" + ) + end + + let(:usuario_esquecido) do + Docente.create!( + nome: "Professor Esquecido", + matricula: "doc003", + email: "esquecido@unb.br", + formacao: "Doutorado", + senha: "SenhaAntiga123", + senha_confirmation: "SenhaAntiga123", + redefinicao_senha_token: "token_redefinicao_456" + ) + end + + describe "Cadastrar senha (Primeiro Acesso)" do + it "GET /definir_senha/:token acessa a tela de cadastro" do + get edit_definicao_senha_path(token: usuario_sem_senha.definicao_senha_token) + expect(response).to have_http_status(:ok) + end + + it "GET /definir_senha/:token redireciona para root se o token for inválido (sad path)" do + get edit_definicao_senha_path(token: "token_inexistente") + expect(response).to redirect_to(root_path) + expect(flash[:alert]).to eq("Link de definição de senha inválido.") + end + + it "PATCH /definir_senha/:token define a senha e redireciona para login" do + patch definicao_senha_path(token: usuario_sem_senha.definicao_senha_token), params: { + senha: "NovaSenhaSegura123", + senha_confirmation: "NovaSenhaSegura123" + } + usuario_sem_senha.reload + expect(usuario_sem_senha.senha_definida?).to be true + expect(response).to redirect_to(root_path) + end + + it "PATCH /definir_senha/:token redireciona para root se o token for inválido (sad path)" do + patch definicao_senha_path(token: "token_inexistente"), params: { + senha: "NovaSenhaSegura123", + senha_confirmation: "NovaSenhaSegura123" + } + expect(response).to redirect_to(root_path) + expect(flash[:alert]).to eq("Link de definição de senha inválido.") + end + + it "PATCH /definir_senha/:token falha quando senhas não conferem (sad path)" do + patch definicao_senha_path(token: usuario_sem_senha.definicao_senha_token), params: { + senha: "NovaSenha123", + senha_confirmation: "SenhaDiferente456" + } + expect(response).to have_http_status(:unprocessable_content) + expect(flash.now[:alert]).to include("confirmação não confere") + end + + it "PATCH /definir_senha/:token falha quando senha menor que 6 caracteres (sad path)" do + patch definicao_senha_path(token: usuario_sem_senha.definicao_senha_token), params: { + senha: "abc", + senha_confirmation: "abc" + } + expect(response).to have_http_status(:unprocessable_content) + expect(flash.now[:alert]).to include("senha inválida") + end + + it "PATCH /definir_senha/:token falha se o modelo falhar ao salvar no banco (sad path)" do + allow_any_instance_of(Usuario).to receive(:save).and_return(false) + patch definicao_senha_path(token: usuario_sem_senha.definicao_senha_token), params: { + senha: "NovaSenhaSegura123", + senha_confirmation: "NovaSenhaSegura123" + } + expect(response).to have_http_status(:unprocessable_content) + expect(flash.now[:alert]).to eq("Flha na definição de senha: senha inválida").or eq("Falha na definição de senha: senha inválida") + end + end + + describe "Redefinir senha" do + it "GET /redefinir_senha exibe o formulário de solicitação" do + get redefinir_senha_path + expect(response).to have_http_status(:ok) + end + + it "POST /redefinir_senha redireciona com alerta quando email em branco" do + post redefinir_senha_path, params: { email: "" } + expect(response).to redirect_to(redefinir_senha_path) + expect(flash[:alert]).to include("informe seu email") + end + + it "POST /redefinir_senha redireciona com alerta quando usuário não encontrado" do + post redefinir_senha_path, params: { email: "naoexiste@unb.br" } + expect(response).to redirect_to(redefinir_senha_path) + expect(flash[:alert]).to include("usuário não encontrado") + end + + it "POST /redefinir_senha solicita a troca e envia email" do + post redefinir_senha_path, params: { email: usuario_esquecido.email } + usuario_esquecido.reload + expect(usuario_esquecido.redefinicao_senha_token).not_to be_nil + expect(response).to redirect_to(root_path) + end + + it "GET /redefinir_senha/:token redireciona para root se o token for inválido (sad path)" do + get edit_redefinicao_senha_path(token: "token_inexistente") + expect(response).to redirect_to(root_path) + expect(flash[:alert]).to eq("Link de redefinição de senha inválido.") + end + + it "PATCH /redefinir_senha/:token salva a nova senha e redireciona" do + patch redefinicao_senha_path(token: usuario_esquecido.redefinicao_senha_token), params: { + senha: "SenhaTotalmenteNova1", + senha_confirmation: "SenhaTotalmenteNova1" + } + expect(response).to redirect_to(root_path) + end + + it "PATCH /redefinir_senha/:token redireciona para root se o token for inválido (sad path)" do + patch redefinicao_senha_path(token: "token_inexistente"), params: { + senha: "SenhaTotalmenteNova1", + senha_confirmation: "SenhaTotalmenteNova1" + } + expect(response).to redirect_to(root_path) + expect(flash[:alert]).to eq("Link de redefinição de senha inválido.") + end + + it "PATCH /redefinir_senha/:token falha quando senhas não conferem (sad path)" do + patch redefinicao_senha_path(token: usuario_esquecido.redefinicao_senha_token), params: { + senha: "SenhaNova123", + senha_confirmation: "SenhaDiferente456" + } + expect(response).to have_http_status(:unprocessable_content) + expect(flash.now[:alert]).to include("confirmação não confere") + end + + it "PATCH /redefinir_senha/:token falha quando senha menor que 6 caracteres (sad path)" do + patch redefinicao_senha_path(token: usuario_esquecido.redefinicao_senha_token), params: { + senha: "abc", + senha_confirmation: "abc" + } + expect(response).to have_http_status(:unprocessable_content) + expect(flash.now[:alert]).to include("senha inválida") + end + + it "PATCH /redefinir_senha/:token falha se o modelo falhar ao salvar no banco (sad path)" do + allow_any_instance_of(Usuario).to receive(:save).and_return(false) + patch redefinicao_senha_path(token: usuario_esquecido.redefinicao_senha_token), params: { + senha: "SenhaTotalmenteNova1", + senha_confirmation: "SenhaTotalmenteNova1" + } + expect(response).to have_http_status(:unprocessable_content) + expect(flash.now[:alert]).to eq("Falha na redefinição de senha: senha inválida") + end + end +end diff --git a/spec/requests/sessions_spec.rb b/spec/requests/sessions_spec.rb new file mode 100644 index 0000000000..25e5261454 --- /dev/null +++ b/spec/requests/sessions_spec.rb @@ -0,0 +1,125 @@ +require 'rails_helper' + +RSpec.describe "Sessions", type: :request do + let(:departamento) { Departamento.find_or_create_by!(nome: "Ciência da Computação", codigo: "CIC") } + + let!(:admin) do + Administrador.create!( + nome: "Admin Teste", + matricula: "adm001", + email: "admin@unb.br", + senha: "Senha123", + senha_confirmation: "Senha123", + departamento: departamento + ) + end + + let!(:docente) do + Docente.create!( + nome: "Prof Teste", + matricula: "doc001", + email: "prof@unb.br", + formacao: "Doutorado", + senha: "Senha123", + senha_confirmation: "Senha123" + ) + end + + describe "GET /" do + context "quando não está logado" do + it "exibe a tela de login" do + get root_path + expect(response).to have_http_status(:ok) + end + end + + context "quando já está logado como Administrador" do + before { post login_path, params: { login: admin.email, senha: "Senha123" } } + + it "redireciona para a página de avaliações do admin" do + get root_path + expect(response).to redirect_to(admin_avaliacoes_path(admin.id)) + end + end + + context "quando já está logado como usuário comum" do + before { post login_path, params: { login: docente.email, senha: "Senha123" } } + + it "redireciona para a página do usuário" do + get root_path + expect(response).to redirect_to(usuarios_avaliacoes_path(docente.id)) + end + end + end + + describe "POST /login" do + context "com credenciais inválidas" do + it "redireciona para root com alerta quando login está em branco" do + post login_path, params: { login: "", senha: "Senha123" } + expect(response).to redirect_to(root_path) + follow_redirect! + expect(response.body).to include("informe seu email ou matrícula") + end + + it "redireciona para root com alerta quando senha está em branco" do + post login_path, params: { login: docente.email, senha: "" } + expect(response).to redirect_to(root_path) + follow_redirect! + expect(response.body).to include("informe a sua senha") + end + + it "redireciona para root com alerta quando usuário não existe" do + post login_path, params: { login: "naoexiste@unb.br", senha: "Senha123" } + expect(response).to redirect_to(root_path) + follow_redirect! + expect(response.body).to include("usuário não encontrado") + end + + it "redireciona para root com alerta quando senha está incorreta" do + post login_path, params: { login: docente.email, senha: "errada" } + expect(response).to redirect_to(root_path) + follow_redirect! + expect(response.body).to include("senha incorreta") + end + end + + context "com credenciais válidas de Administrador" do + it "redireciona para a página de avaliações do admin" do + post login_path, params: { login: admin.email, senha: "Senha123" } + expect(response).to redirect_to(admin_avaliacoes_path(admin.id)) + end + + it "aceita login pela matrícula" do + post login_path, params: { login: admin.matricula, senha: "Senha123" } + expect(response).to redirect_to(admin_avaliacoes_path(admin.id)) + end + end + + context "com credenciais válidas de usuário comum" do + it "redireciona para a página do usuário" do + post login_path, params: { login: docente.email, senha: "Senha123" } + expect(response).to redirect_to(usuarios_avaliacoes_path(docente.id)) + end + + it "aceita login pela matrícula" do + post login_path, params: { login: docente.matricula, senha: "Senha123" } + expect(response).to redirect_to(usuarios_avaliacoes_path(docente.id)) + end + end + end + + describe "DELETE /logout" do + before { post login_path, params: { login: docente.email, senha: "Senha123" } } + + it "redireciona para a raiz" do + delete logout_path + expect(response).to redirect_to(root_path) + end + + it "encerra a sessão e exige novo login para rotas protegidas" do + delete logout_path + get inicio_path + expect(response).to redirect_to(root_path) + end + end +end diff --git a/spec/requests/templates_spec.rb b/spec/requests/templates_spec.rb new file mode 100644 index 0000000000..3c1cd9046c --- /dev/null +++ b/spec/requests/templates_spec.rb @@ -0,0 +1,65 @@ +require 'rails_helper' + +RSpec.describe "Templates", type: :request do + let(:departamento) { Departamento.find_or_create_by!(nome: "Ciência da Computação", codigo: "CIC") } + let(:admin) do + Administrador.create!( + nome: "Admin", + matricula: "123", + email: "admin@unb.br", + senha: "Senha123", + senha_confirmation: "Senha123", + departamento: departamento + ) + end + let!(:template_existente) do + template = Template.new(nome: "Template Base", administrador: admin) + template.elementos.build(enunciado: "Questão 1", ordem: 1) + template.save! + template + end + + before do + post login_path, params: { login: admin.email, senha: "Senha123" } + end + + describe "GET /templates" do + it "Feature 6: Visualiza a lista de templates" do + get admin_templates_path(admin_id: admin.id) + expect(response).to have_http_status(:ok) + end + end + + describe "POST /templates" do + it "Feature 5: Cria um template com sucesso" do + expect { + post admin_templates_path(admin_id: admin.id), params: { + template: { + nome: "Avaliação Nova", + administrador_id: admin.id, + elementos_attributes: [ { enunciado: "Questão 1", ordem: 1 } ] + } + } + }.to change(Template, :count).by(1) + expect(response).to be_redirect + end + end + + describe "PATCH /templates/:id" do + it "Feature 7: Edita um template existente" do + patch admin_template_path(admin_id: admin.id, id: template_existente.id), params: { + template: { nome: "Nome Atualizado" } + } + template_existente.reload + expect(template_existente.nome).to eq("Nome Atualizado") + end + end + + describe "DELETE /templates/:id" do + it "Feature 7: Deleta um template" do + expect { + delete admin_template_path(admin_id: admin.id, id: template_existente.id) + }.to change(Template, :count).by(-1) + end + end +end diff --git a/spec/requests/turmas_spec.rb b/spec/requests/turmas_spec.rb new file mode 100644 index 0000000000..d114fd8eeb --- /dev/null +++ b/spec/requests/turmas_spec.rb @@ -0,0 +1,104 @@ +require 'rails_helper' + +RSpec.describe "Turmas", type: :request do + let(:departamento) { Departamento.find_or_create_by!(nome: "Ciência da Computação", codigo: "CIC") } + let(:disciplina) { Disciplina.find_or_create_by!(nome: "Engenharia de Software", codigo: "CIC0097", departamento: departamento) } + let!(:docente) do + Docente.create!( + nome: "Docente Turma", + matricula: "doc_turma", + email: "doc_turma@unb.br", + formacao: "Doutorado", + senha: "Senha123", + senha_confirmation: "Senha123" + ) + end + let!(:turma) { Turma.create!(numero_da_turma: "TA", semestre: "2026.1", disciplina: disciplina) } + + before { post login_path, params: { login: docente.email, senha: "Senha123" } } + + describe "GET /turmas" do + it "sem sessão ativa redireciona para login" do + delete logout_path + get turmas_path + expect(response).to redirect_to(root_path) + end + + it "retorna 200 OK" do + get turmas_path + expect(response).to have_http_status(:ok) + end + end + + describe "GET /turmas/new" do + it "retorna 200 OK" do + get new_turma_path + expect(response).to have_http_status(:ok) + end + end + + describe "POST /turmas" do + it "cria turma com sucesso (happy path)" do + expect { + post turmas_path, params: { + turma: { numero_da_turma: "TC", semestre: "2026.2", disciplina_id: disciplina.id } + } + }.to change(Turma, :count).by(1) + + expect(response).to redirect_to(turma_url(Turma.last)) + end + + it "falha ao criar com dados inválidos (sad path)" do + expect { + post turmas_path, params: { + turma: { numero_da_turma: "", semestre: "", disciplina_id: disciplina.id } + } + }.not_to change(Turma, :count) + + expect(response).to have_http_status(:unprocessable_content) + end + end + + describe "GET /turmas/:id" do + it "retorna 200 OK" do + get turma_path(turma) + expect(response).to have_http_status(:ok) + end + end + + describe "GET /turmas/:id/edit" do + it "retorna 200 OK" do + get edit_turma_path(turma) + expect(response).to have_http_status(:ok) + end + end + + describe "PATCH /turmas/:id" do + it "atualiza com sucesso (happy path)" do + patch turma_path(turma), params: { + turma: { numero_da_turma: "TA", semestre: "2027.1", disciplina_id: disciplina.id } + } + turma.reload + expect(turma.semestre).to eq("2027.1") + expect(response).to redirect_to(turma_url(turma)) + end + + it "falha ao atualizar com dados inválidos (sad path)" do + patch turma_path(turma), params: { + turma: { numero_da_turma: "", semestre: "", disciplina_id: disciplina.id } + } + expect(response).to have_http_status(:unprocessable_content) + end + end + + describe "DELETE /turmas/:id" do + it "destrói a turma e redireciona" do + t = Turma.create!(numero_da_turma: "TZ", semestre: "2026.1", disciplina: disciplina) + expect { + delete turma_path(t) + }.to change(Turma, :count).by(-1) + + expect(response).to redirect_to(turmas_url) + end + end +end diff --git a/spec/requests/usuarios_spec.rb b/spec/requests/usuarios_spec.rb new file mode 100644 index 0000000000..d5744c9aaa --- /dev/null +++ b/spec/requests/usuarios_spec.rb @@ -0,0 +1,269 @@ +require 'rails_helper' + +RSpec.describe "Usuarios", type: :request do + let(:departamento) { Departamento.find_or_create_by!(nome: "Ciência da Computação", codigo: "CIC") } + + let!(:admin) do + Administrador.create!( + nome: "Admin Teste", + matricula: "adm001", + email: "admin@unb.br", + senha: "Senha123", + senha_confirmation: "Senha123", + departamento: departamento + ) + end + + let!(:docente) do + Docente.create!( + nome: "Prof Teste", + matricula: "doc001", + email: "prof@unb.br", + formacao: "Doutorado", + senha: "Senha123", + senha_confirmation: "Senha123" + ) + end + + def logar_como(usuario) + post login_path, params: { login: usuario.email, senha: "Senha123" } + end + + describe "GET /usuarios (require_login)" do + context "sem sessão ativa" do + it "redireciona para a tela de login com alerta" do + get usuarios_path + expect(response).to redirect_to(root_path) + follow_redirect! + expect(response.body).to include("precisa estar logado") + end + end + end + + describe "GET /usuarios (require_admin)" do + context "logado como usuário comum" do + before { logar_como(docente) } + + it "redireciona para a página inicial com alerta de acesso negado" do + get usuarios_path + expect(response).to redirect_to(inicio_path) + follow_redirect! + expect(response.body).to include("Acesso negado") + end + end + + context "logado como Administrador" do + before { logar_como(admin) } + + it "permite o acesso" do + get usuarios_path + expect(response).to have_http_status(:ok) + end + end + end + + describe "GET /usuarios/:id" do + context "sem sessão ativa" do + it "redireciona para a tela de login" do + get usuario_path(docente) + expect(response).to redirect_to(root_path) + end + end + + context "logado como usuário comum" do + before { logar_como(docente) } + + it "redireciona para a página inicial" do + get usuario_path(docente) + expect(response).to redirect_to(inicio_path) + end + end + + context "logado como Administrador" do + before { logar_como(admin) } + + it "permite o acesso" do + get usuario_path(docente) + expect(response).to have_http_status(:ok) + end + end + end + + describe "DELETE /usuarios/:id" do + context "sem sessão ativa" do + it "redireciona para a tela de login" do + delete usuario_path(docente) + expect(response).to redirect_to(root_path) + end + end + + context "logado como usuário comum" do + before { logar_como(docente) } + + it "redireciona para a página inicial" do + delete usuario_path(docente) + expect(response).to redirect_to(inicio_path) + end + end + + context "logado como Administrador" do + before { logar_como(admin) } + + it "remove o usuário e redireciona para a listagem" do + delete usuario_path(docente) + expect(response).to redirect_to(usuarios_path) + end + end + end + + describe "Ações CRUD Adicionais" do + before { logar_como(admin) } + + it "acessa a página de new" do + get new_usuario_path + expect(response).to have_http_status(:ok) + end + + it "acessa a página de edit" do + get edit_usuario_path(docente) + expect(response).to have_http_status(:ok) + end + + it "cria um novo usuário com sucesso (happy path)" do + expect { + post usuarios_path, params: { + usuario: { + matricula: "novo123", + email: "novo@unb.br", + nome: "Novo Teste", + type: "Docente", + senha: "Senha123", + senha_confirmation: "Senha123", + formacao: "Mestrado" + } + } + }.to change(Usuario, :count).by(1) + expect(response).to redirect_to(docente_url(Usuario.last)).or redirect_to(usuario_url(Usuario.last)) + end + + it "falha ao criar usuário com dados inválidos (sad path)" do + expect { + post usuarios_path, params: { usuario: { email: "" } } # Email em branco falha + }.to change(Usuario, :count).by(0) + expect(response).to have_http_status(:unprocessable_content) + end + + it "atualiza um usuário com sucesso (happy path)" do + patch usuario_path(docente), params: { usuario: { nome: "Nome Atualizado" } } + docente.reload + expect(docente.nome).to eq("Nome Atualizado") + expect(response).to redirect_to(docente_url(docente)).or redirect_to(usuario_url(docente)) + end + + it "falha ao atualizar usuário com dados inválidos (sad path)" do + patch usuario_path(docente), params: { usuario: { email: "" } } # Email em branco falha + expect(response).to have_http_status(:unprocessable_content) + end + end + + describe "Avaliações e Respostas" do + let(:disciplina) { Disciplina.find_or_create_by!(nome: "Software", codigo: "SW1", departamento: departamento) } + let(:turma) { Turma.find_or_create_by!(numero_da_turma: "TA", disciplina: disciplina, semestre: "2026.1") } + let(:formulario) { Formulario.create!(turma: turma) } + + let!(:elemento) { formulario.elemento_forms.create!(enunciado: "Avalie o professor", ordem: 1, tipo: "Texto") } + let!(:campo) { elemento.campo_forms.create!(enunciado: "Resposta", ordem: 1) } + + let(:curso) { Curso.find_or_create_by!(nome: "Ciência da Computação", codigo: "CIC", departamento: departamento) } + + let(:discente) do + Discente.create!( + nome: "Aluno Teste", + matricula: "disc001", + email: "aluno@unb.br", + curso: curso, + senha: "Senha123", + senha_confirmation: "Senha123" + ) + end + + before do + turma.docentes << docente + turma.discentes << discente + end + + context "GET /usuarios/:usuario_id/avaliacoes" do + it "lista avaliações para um docente" do + logar_como(docente) + get usuarios_avaliacoes_path(docente) + expect(response).to have_http_status(:ok) + expect(response.body).to include(formulario.id.to_s).or include(turma.disciplina.nome) + end + + it "lista avaliações para um discente" do + logar_como(discente) + get usuarios_avaliacoes_path(discente) + expect(response).to have_http_status(:ok) + expect(response.body).to include(formulario.id.to_s).or include(turma.disciplina.nome) + end + + it "retorna lista vazia para administrador (não possui turmas diretas no model atual)" do + logar_como(admin) + get usuarios_avaliacoes_path(admin) + expect(response).to have_http_status(:ok) + expect(response.body).not_to include(turma.disciplina.nome) + end + end + + context "GET /usuarios/:usuario_id/formularios/:formulario_id/responder" do + before { logar_como(discente) } + + it "acessa a página de resposta do formulário" do + get usuarios_responder_formulario_path(usuario_id: discente.id, formulario_id: formulario.id) + expect(response).to have_http_status(:ok) + end + + it "redireciona com alerta se o formulário já foi respondido" do + RespostaForm.create!(formulario: formulario, usuario: discente, data_submissao: Date.today) + get usuarios_responder_formulario_path(usuario_id: discente.id, formulario_id: formulario.id) + + expect(response).to redirect_to(usuarios_avaliacoes_path(discente)) + expect(flash[:notice]).to eq("Você já respondeu este formulário.") + end + end + + context "POST /usuarios/:usuario_id/formularios/:formulario_id/responder (submeter_resposta)" do + before { logar_como(discente) } + + it "submete respostas com sucesso (happy path)" do + expect { + post usuarios_submeter_resposta_path(usuario_id: discente.id, formulario_id: formulario.id), + params: { respostas: { elemento.id.to_s => "O professor foi ótimo" } } + }.to change(RespostaForm, :count).by(1).and change(RespostaElem, :count).by(1) + + expect(response).to redirect_to(usuarios_avaliacoes_path(discente)) + expect(flash[:notice]).to eq("Respostas enviadas com sucesso!") + end + + it "falha ao submeter deixando uma resposta em branco (sad path)" do + expect { + post usuarios_submeter_resposta_path(usuario_id: discente.id, formulario_id: formulario.id), + params: { respostas: { elemento.id.to_s => "" } } + }.to change(RespostaForm, :count).by(0) + + expect(response).to have_http_status(:unprocessable_content) + expect(flash.now[:alert]).to eq("Por favor, responda todas as perguntas obrigatórias") + end + + it "redireciona se tentar submeter um formulário já respondido" do + RespostaForm.create!(formulario: formulario, usuario: discente, data_submissao: Date.today) + + post usuarios_submeter_resposta_path(usuario_id: discente.id, formulario_id: formulario.id), + params: { respostas: { elemento.id.to_s => "O professor foi ótimo" } } + + expect(response).to redirect_to(usuarios_avaliacoes_path(discente)) + expect(flash[:alert]).to eq("Você já respondeu este formulário.") + end + end + end +end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb new file mode 100644 index 0000000000..78c51a2a5c --- /dev/null +++ b/spec/spec_helper.rb @@ -0,0 +1,99 @@ +# This file was generated by the `rails generate rspec:install` command. Conventionally, all +# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`. +# The generated `.rspec` file contains `--require spec_helper` which will cause +# this file to always be loaded, without a need to explicitly require it in any +# files. +# +# Given that it is always loaded, you are encouraged to keep this file as +# light-weight as possible. Requiring heavyweight dependencies from this file +# will add to the boot time of your test suite on EVERY test run, even for an +# individual file that may not need all of that loaded. Instead, consider making +# a separate helper file that requires the additional dependencies and performs +# the additional setup, and require it from the spec files that actually need +# it. +# +# See https://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration +# +# +require 'simplecov' +SimpleCov.start + +RSpec.configure do |config| + # rspec-expectations config goes here. You can use an alternate + # assertion/expectation library such as wrong or the stdlib/minitest + # assertions if you prefer. + config.expect_with :rspec do |expectations| + # This option will default to `true` in RSpec 4. It makes the `description` + # and `failure_message` of custom matchers include text for helper methods + # defined using `chain`, e.g.: + # be_bigger_than(2).and_smaller_than(4).description + # # => "be bigger than 2 and smaller than 4" + # ...rather than: + # # => "be bigger than 2" + expectations.include_chain_clauses_in_custom_matcher_descriptions = true + end + + # rspec-mocks config goes here. You can use an alternate test double + # library (such as bogus or mocha) by changing the `mock_with` option here. + config.mock_with :rspec do |mocks| + # Prevents you from mocking or stubbing a method that does not exist on + # a real object. This is generally recommended, and will default to + # `true` in RSpec 4. + mocks.verify_partial_doubles = true + end + + # This option will default to `:apply_to_host_groups` in RSpec 4 (and will + # have no way to turn it off -- the option exists only for backwards + # compatibility in RSpec 3). It causes shared context metadata to be + # inherited by the metadata hash of host groups and examples, rather than + # triggering implicit auto-inclusion in groups with matching metadata. + config.shared_context_metadata_behavior = :apply_to_host_groups + +# The settings below are suggested to provide a good initial experience +# with RSpec, but feel free to customize to your heart's content. +=begin + # This allows you to limit a spec run to individual examples or groups + # you care about by tagging them with `:focus` metadata. When nothing + # is tagged with `:focus`, all examples get run. RSpec also provides + # aliases for `it`, `describe`, and `context` that include `:focus` + # metadata: `fit`, `fdescribe` and `fcontext`, respectively. + config.filter_run_when_matching :focus + + # Allows RSpec to persist some state between runs in order to support + # the `--only-failures` and `--next-failure` CLI options. We recommend + # you configure your source control system to ignore this file. + config.example_status_persistence_file_path = "spec/examples.txt" + + # Limits the available syntax to the non-monkey patched syntax that is + # recommended. For more details, see: + # https://rspec.info/features/3-12/rspec-core/configuration/zero-monkey-patching-mode/ + config.disable_monkey_patching! + + # Many RSpec users commonly either run the entire suite or an individual + # file, and it's useful to allow more verbose output when running an + # individual spec file. + if config.files_to_run.one? + # Use the documentation formatter for detailed output, + # unless a formatter has already been configured + # (e.g. via a command-line flag). + config.default_formatter = "doc" + end + + # Print the 10 slowest examples and example groups at the + # end of the spec run, to help surface which specs are running + # particularly slow. + config.profile_examples = 10 + + # Run specs in random order to surface order dependencies. If you find an + # order dependency and want to debug it, you can fix the order by providing + # the seed, which is printed after each run. + # --seed 1234 + config.order = :random + + # Seed global randomization in this process using the `--seed` CLI option. + # Setting this allows you to use `--seed` to deterministically reproduce + # test failures related to randomization by passing the same `--seed` value + # as the one that triggered the failure. + Kernel.srand config.seed +=end +end diff --git a/storage/.keep b/storage/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/controllers/.keep b/test/controllers/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/fixtures/files/.keep b/test/fixtures/files/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/helpers/.keep b/test/helpers/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/integration/.keep b/test/integration/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/mailers/.keep b/test/mailers/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/models/.keep b/test/models/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/test_helper.rb b/test/test_helper.rb new file mode 100644 index 0000000000..fc95fbcfd3 --- /dev/null +++ b/test/test_helper.rb @@ -0,0 +1,18 @@ +ENV["RAILS_ENV"] ||= "test" +require_relative "../config/environment" +require "rails/test_help" + +require "simplecov" +SimpleCov.start + +module ActiveSupport + class TestCase + # Run tests in parallel with specified workers + parallelize(workers: :number_of_processors) + + # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order. + fixtures :all + + # Add more helper methods to be used by all tests here... + end +end diff --git a/tmp/.keep b/tmp/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tmp/pids/.keep b/tmp/pids/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tmp/storage/.keep b/tmp/storage/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/vendor/.keep b/vendor/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/vendor/javascript/.keep b/vendor/javascript/.keep new file mode 100644 index 0000000000..e69de29bb2