From 837afc73d287adc8246ac4aebfe6d6b10cd15b05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gon=C3=A7alo=20Morais?= <385232+gnclmorais@users.noreply.github.com> Date: Sat, 31 Jan 2026 23:03:04 +0100 Subject: [PATCH 1/2] Extend Rubocop scope Add a few more extensions --- .rubocop.yml | 2 ++ Gemfile | 4 +++- Gemfile.lock | 9 +++++++++ 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/.rubocop.yml b/.rubocop.yml index d98f2c3d2..a50e8b830 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -10,9 +10,11 @@ AllCops: - vendor/bundle/**/* plugins: + - rubocop-capybara - rubocop-performance - rubocop-rails - rubocop-rspec + - rubocop-rspec_rails Layout/LineLength: Max: 120 diff --git a/Gemfile b/Gemfile index b7ce607a7..4302209cb 100644 --- a/Gemfile +++ b/Gemfile @@ -96,9 +96,11 @@ group :development, :test do gem 'rspec-collection_matchers' gem 'rspec-rails' gem 'rubocop', require: false - gem 'rubocop-rails', require: false + gem 'rubocop-capybara', require: false gem 'rubocop-performance', require: false + gem 'rubocop-rails', require: false gem 'rubocop-rspec', require: false + gem 'rubocop-rspec_rails', require: false gem 'bullet' end diff --git a/Gemfile.lock b/Gemfile.lock index e2f308b51..49f331aa2 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -484,6 +484,9 @@ GEM rubocop-ast (1.49.0) parser (>= 3.3.7.2) prism (~> 1.7) + rubocop-capybara (2.22.1) + lint_roller (~> 1.1) + rubocop (~> 1.72, >= 1.72.1) rubocop-performance (1.26.1) lint_roller (~> 1.1) rubocop (>= 1.75.0, < 2.0) @@ -497,6 +500,10 @@ GEM rubocop-rspec (3.9.0) lint_roller (~> 1.1) rubocop (~> 1.81) + rubocop-rspec_rails (2.32.0) + lint_roller (~> 1.1) + rubocop (~> 1.72, >= 1.72.1) + rubocop-rspec (~> 3.5) ruby-progressbar (1.13.0) ruby-vips (2.3.0) ffi (~> 1.12) @@ -664,9 +671,11 @@ DEPENDENCIES rspec-collection_matchers rspec-rails rubocop + rubocop-capybara rubocop-performance rubocop-rails rubocop-rspec + rubocop-rspec_rails sassc-rails scout_apm selenium-webdriver From 58f5484ddac344ecb7fbfb3a724b96afc9c43b53 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gon=C3=A7alo=20Morais?= <385232+gnclmorais@users.noreply.github.com> Date: Sat, 31 Jan 2026 23:03:59 +0100 Subject: [PATCH 2/2] Fix safe Rubocop warnings --- Gemfile | 6 +++--- app/controllers/admin/events_controller.rb | 2 +- app/controllers/admin/meetings_controller.rb | 2 +- app/controllers/application_controller.rb | 6 +++--- app/controllers/auth_services_controller.rb | 16 +++++++--------- app/controllers/chapter_controller.rb | 3 +-- .../concerns/admin/sponsor_concerns.rb | 6 +++--- app/controllers/dashboard_controller.rb | 6 ++---- app/controllers/members_controller.rb | 2 +- app/helpers/application_helper.rb | 1 - app/models/member.rb | 6 +++--- app/models/tutorial.rb | 2 +- app/uploaders/avatar_uploader.rb | 4 +--- 13 files changed, 27 insertions(+), 35 deletions(-) diff --git a/Gemfile b/Gemfile index 4302209cb..1a3644f61 100644 --- a/Gemfile +++ b/Gemfile @@ -5,8 +5,8 @@ gem 'rails', '~> 7.2.2.2' # LOCKED: It is Rails. # The original asset pipeline for Rails [https://github.com/rails/sprockets-rails] gem 'sprockets-rails' -gem "amazing_print" # colourful output (suggested by rails_semantic_logger) -gem "rails_semantic_logger" # condense log lines: https://github.com/codebar/planner/issues/2339 +gem 'amazing_print' # colourful output (suggested by rails_semantic_logger) +gem 'rails_semantic_logger' # condense log lines: https://github.com/codebar/planner/issues/2339 gem 'acts-as-taggable-on' gem 'benchmark' # LOCKED: Added because of activesupport 7.0 @@ -124,4 +124,4 @@ gem 'rollbar' gem 'scout_apm' gem 'carrierwave-aws', '~> 1.6' -gem "sitemap_generator", github: "kjvarga/sitemap_generator", branch: "master" # LOCKED: When a version higher than 6.3.0 is released, drop this LOCKED. +gem 'sitemap_generator', github: 'kjvarga/sitemap_generator', branch: 'master' # LOCKED: When a version higher than 6.3.0 is released, drop this LOCKED. diff --git a/app/controllers/admin/events_controller.rb b/app/controllers/admin/events_controller.rb index cee7b0302..4584b1699 100644 --- a/app/controllers/admin/events_controller.rb +++ b/app/controllers/admin/events_controller.rb @@ -27,7 +27,7 @@ def show @attending_students = InvitationPresenter.decorate_collection(@original_event.attending_students) @attending_coaches = InvitationPresenter.decorate_collection(@original_event.attending_coaches) - return render plain: @event.attendees_csv if request.format.csv? + render plain: @event.attendees_csv if request.format.csv? end def update diff --git a/app/controllers/admin/meetings_controller.rb b/app/controllers/admin/meetings_controller.rb index 8a21c1715..e37cee41b 100644 --- a/app/controllers/admin/meetings_controller.rb +++ b/app/controllers/admin/meetings_controller.rb @@ -21,7 +21,7 @@ def create def show @invitations = @meeting.invitations.accepted.includes(:member).order(:created_at) - return render plain: @meeting.attendees_csv if request.format.csv? + render plain: @meeting.attendees_csv if request.format.csv? end def edit; end diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 6339dd9f2..b398d5420 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -85,8 +85,8 @@ def previous_path end def finish_registration - if current_user.requires_additional_details? - redirect_to edit_member_details_path unless providing_additional_details? + if current_user.requires_additional_details? && !providing_additional_details? + redirect_to edit_member_details_path end end @@ -141,7 +141,7 @@ def user_not_authorized end def user_path - request.referrer || root_path + request.referer || root_path end def chapters diff --git a/app/controllers/auth_services_controller.rb b/app/controllers/auth_services_controller.rb index aa49ce3eb..1296c918b 100644 --- a/app/controllers/auth_services_controller.rb +++ b/app/controllers/auth_services_controller.rb @@ -18,15 +18,14 @@ def create provider: omnihash[:provider]) end redirect_to root_path - else - if current_service - session[:member_id] = current_service.member.id - session[:service_id] = current_service.id - session[:oauth_token] = omnihash[:credentials][:token] - session[:oauth_token_secret] = omnihash[:credentials][:secret] + elsif current_service + session[:member_id] = current_service.member.id + session[:service_id] = current_service.id + session[:oauth_token] = omnihash[:credentials][:token] + session[:oauth_token_secret] = omnihash[:credentials][:secret] - finish_registration || redirect_to(referer_or_dashboard_path) - else + finish_registration || redirect_to(referer_or_dashboard_path) + else member = Member.find_by(email: omnihash[:info][:email]) member ||= Member.new(email: omnihash[:info][:email]) @@ -48,7 +47,6 @@ def create session[:oauth_token_secret] = omnihash[:credentials][:secret] redirect_to edit_member_details_path(member_type: member_type) - end end end diff --git a/app/controllers/chapter_controller.rb b/app/controllers/chapter_controller.rb index 35c200307..a5165f44a 100644 --- a/app/controllers/chapter_controller.rb +++ b/app/controllers/chapter_controller.rb @@ -26,9 +26,8 @@ def upcoming_events_by_chapter(chapter) end def event_presenters_by_date(events) - events.map.inject({}) do |hash, (date, value)| + events.map.each_with_object({}) do |(date, value), hash| hash[date] = EventPresenter.decorate_collection(value) - hash end end end diff --git a/app/controllers/concerns/admin/sponsor_concerns.rb b/app/controllers/concerns/admin/sponsor_concerns.rb index 06673603d..7105c1be0 100644 --- a/app/controllers/concerns/admin/sponsor_concerns.rb +++ b/app/controllers/concerns/admin/sponsor_concerns.rb @@ -10,10 +10,10 @@ module Admin::SponsorConcerns module InstanceMethods def sponsor - if workshop_sponsors.save - flash[:notice] = 'Sponsor added successfully' + flash[:notice] = if workshop_sponsors.save + 'Sponsor added successfully' else - flash[:notice] = workshop_sponsors.errors.full_messages.to_s + workshop_sponsors.errors.full_messages.to_s end redirect_back fallback_location: root_path end diff --git a/app/controllers/dashboard_controller.rb b/app/controllers/dashboard_controller.rb index 770aec86b..39100d7c2 100644 --- a/app/controllers/dashboard_controller.rb +++ b/app/controllers/dashboard_controller.rb @@ -9,9 +9,8 @@ class DashboardController < ApplicationController def show @chapters = Chapter.active.all.order(:created_at) @user = current_user ? MemberPresenter.new(current_user) : nil - @upcoming_workshops = upcoming_events.map.inject({}) do |hash, (key, value)| + @upcoming_workshops = upcoming_events.map.each_with_object({}) do |(key, value), hash| hash[key] = EventPresenter.decorate_collection(value) - hash end @testimonials = Testimonial.order(Arel.sql('RANDOM()')).limit(5).includes(:member) @@ -19,9 +18,8 @@ def show def dashboard @user = MemberPresenter.new(current_user) - @ordered_events = upcoming_events_for_user.map.inject({}) do |hash, (key, value)| + @ordered_events = upcoming_events_for_user.map.each_with_object({}) do |(key, value), hash| hash[key] = EventPresenter.decorate_collection(value) - hash end @announcements = current_user.announcements.active end diff --git a/app/controllers/members_controller.rb b/app/controllers/members_controller.rb index ace862104..7f8b2264a 100644 --- a/app/controllers/members_controller.rb +++ b/app/controllers/members_controller.rb @@ -42,7 +42,7 @@ def unsubscribe authenticate_member! redirect_to subscriptions_path - rescue + rescue StandardError redirect_to root_path, notice: 'Your token is invalid. ' end diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index f4e86f1c4..68656f308 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -1,5 +1,4 @@ module ApplicationHelper - def humanize_date(datetime, end_time = nil, with_time: false, with_year: false) return I18n.l(datetime, format: :humanised_with_year) if with_year return humanize_date_with_time(datetime, end_time) if with_time diff --git a/app/models/member.rb b/app/models/member.rb index c96b0fed4..b6be0e8a3 100644 --- a/app/models/member.rb +++ b/app/models/member.rb @@ -29,8 +29,8 @@ class Member < ApplicationRecord validates :about_you, length: { maximum: 255 } DIETARY_RESTRICTIONS = %w[vegan vegetarian pescetarian halal gluten_free dairy_free other].freeze - validates_inclusion_of :dietary_restrictions, in: DIETARY_RESTRICTIONS - validates_presence_of :other_dietary_restrictions, if: :other_dietary_restrictions? + validates :dietary_restrictions, inclusion: { in: DIETARY_RESTRICTIONS } + validates :other_dietary_restrictions, presence: { if: :other_dietary_restrictions? } scope :accepted_toc, -> { where.not(accepted_toc_at: nil) } scope :order_by_email, -> { order(:email) } @@ -146,7 +146,7 @@ def other_dietary_restrictions? def self.find_members_by_name(name) name.strip! - name.eql?('') ? self.none : where("CONCAT(name, ' ', surname) ILIKE ?", "%#{name}%") + name.eql?('') ? none : where("CONCAT(name, ' ', surname) ILIKE ?", "%#{name}%") end private diff --git a/app/models/tutorial.rb b/app/models/tutorial.rb index 3d081d271..7debe2ac8 100644 --- a/app/models/tutorial.rb +++ b/app/models/tutorial.rb @@ -1,5 +1,5 @@ class Tutorial < ApplicationRecord - belongs_to :workshop, optional: true + belongs_to :workshop, optional: true validates :title, presence: true default_scope -> { order(:created_at) } diff --git a/app/uploaders/avatar_uploader.rb b/app/uploaders/avatar_uploader.rb index ecc107a07..507fccad1 100644 --- a/app/uploaders/avatar_uploader.rb +++ b/app/uploaders/avatar_uploader.rb @@ -1,12 +1,10 @@ -# encoding: utf-8 - class AvatarUploader < CarrierWave::Uploader::Base storage :aws if Rails.env.production? include CarrierWave::MiniMagick def content_type_allowlist - [/image\//] + [%r{image/}] end # Override the directory where uploaded files will be stored.