From 08df447dd6d2ad7664ec92d14e1df73392143622 Mon Sep 17 00:00:00 2001 From: Sebastian Cohnen Date: Fri, 16 Oct 2026 15:34:27 +0200 Subject: [PATCH 1/6] addresses Performance/MapMethodChain --- app/controllers/repositories_controller.rb | 2 +- app/models/query.rb | 8 ++++---- modules/bim/lib/open_project/bim/bcf_xml/aggregations.rb | 2 +- .../app/services/boards/version_board_create_service.rb | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/app/controllers/repositories_controller.rb b/app/controllers/repositories_controller.rb index 426c91ac56e0..ca31e2aad616 100644 --- a/app/controllers/repositories_controller.rb +++ b/app/controllers/repositories_controller.rb @@ -101,7 +101,7 @@ def update def committers @committers = @repository.committers @users = @project.users.to_a - additional_user_ids = @committers.map(&:last).map(&:to_i) - @users.map(&:id) + additional_user_ids = @committers.map { |c| c.last.to_i } - @users.map(&:id) @users += User.where(id: additional_user_ids) unless additional_user_ids.empty? @users.compact! @users.sort! diff --git a/app/models/query.rb b/app/models/query.rb index 2a8b9612d5f9..0aff9dc5c6de 100644 --- a/app/models/query.rb +++ b/app/models/query.rb @@ -128,7 +128,7 @@ def validate_columns end def validate_sort_criteria - available_criteria = sortable_columns.map(&:name).map(&:to_s) + available_criteria = sortable_columns.map { |col| col.name.to_s } sort_criteria.each do |name, _dir| unless available_criteria.include? name.to_s @@ -521,13 +521,13 @@ def valid_filter_subset! end def valid_group_by_subset! - unless groupable_columns.map(&:name).map(&:to_s).include?(group_by.to_s) + unless groupable_columns.map { |col| col.name.to_s }.include?(group_by.to_s) self.group_by = nil end end def valid_sort_criteria_subset! - available_criteria = sortable_columns.map(&:name).map(&:to_s) + available_criteria = sortable_columns.map { |col| col.name.to_s } self.sort_criteria = sort_criteria.select do |criteria| available_criteria.include? criteria.first.to_s @@ -535,7 +535,7 @@ def valid_sort_criteria_subset! end def valid_column_subset! - available_names = displayable_columns.map(&:name).map(&:to_sym) + available_names = displayable_columns.map { |col| col.name.to_sym } self.column_names &= available_names end diff --git a/modules/bim/lib/open_project/bim/bcf_xml/aggregations.rb b/modules/bim/lib/open_project/bim/bcf_xml/aggregations.rb index 4f0edf7d05f2..af424526fd67 100644 --- a/modules/bim/lib/open_project/bim/bcf_xml/aggregations.rb +++ b/modules/bim/lib/open_project/bim/bcf_xml/aggregations.rb @@ -51,7 +51,7 @@ def known_users end def unknown_mails - @instance_cache[:unknown_mails] ||= all_mails.map(&:downcase) - known_users.map(&:mail).map(&:downcase) + @instance_cache[:unknown_mails] ||= all_mails.map(&:downcase) - known_users.map { |user| user.mail.downcase } end def members diff --git a/modules/boards/app/services/boards/version_board_create_service.rb b/modules/boards/app/services/boards/version_board_create_service.rb index 5af510044dcf..71c327c92685 100644 --- a/modules/boards/app/services/boards/version_board_create_service.rb +++ b/modules/boards/app/services/boards/version_board_create_service.rb @@ -36,7 +36,7 @@ def before_perform(_service_result) return create_queries_results.find(&:failure?) if create_queries_results.any?(&:failure?) - set_attributes(params.merge(query_ids: create_queries_results.map(&:result).map(&:id))) + set_attributes(params.merge(query_ids: create_queries_results.map { |result| result.result.id })) end private From f59cb2fdd2ed2ff36a623f1e01a39553561b13fa Mon Sep 17 00:00:00 2001 From: Sebastian Cohnen Date: Fri, 16 Oct 2026 17:24:18 +0200 Subject: [PATCH 2/6] addresses Performance/MethodObjectAsBlock --- app/controllers/oauth/auth_base_controller.rb | 2 +- .../work_packages/set_attributes_service.rb | 2 +- app/workers/work_packages/bulk_job.rb | 6 +++--- .../work_package_at_timestamp_representer.rb | 2 +- .../open_project/bim/bcf_xml/issue_writer.rb | 4 ++-- .../open_project/github_integration/engine.rb | 9 +++------ .../open_project/gitlab_integration/engine.rb | 17 +++++++---------- .../services/grids/set_attributes_service.rb | 2 +- .../models/ldap_groups/synchronized_group.rb | 2 +- modules/reporting/lib/report/walker.rb | 4 ++-- 10 files changed, 22 insertions(+), 28 deletions(-) diff --git a/app/controllers/oauth/auth_base_controller.rb b/app/controllers/oauth/auth_base_controller.rb index bb81c2267461..f9258a6fd19f 100644 --- a/app/controllers/oauth/auth_base_controller.rb +++ b/app/controllers/oauth/auth_base_controller.rb @@ -64,7 +64,7 @@ def application_http_redirect_uris def application_native_redirect_uris registered_redirect_uris .reject { |url| url.start_with?("http", "urn") } - .map(&method(:parse_native_redirect_uri)) + .map { |url| parse_native_redirect_uri(url) } .compact end diff --git a/app/services/work_packages/set_attributes_service.rb b/app/services/work_packages/set_attributes_service.rb index d4da411cb893..1071081aac67 100644 --- a/app/services/work_packages/set_attributes_service.rb +++ b/app/services/work_packages/set_attributes_service.rb @@ -264,7 +264,7 @@ def default_description? TypeVariant .pluck(:default_work_package_description) .compact - .map(&method(:normalize_whitespace)) + .map { |desc| normalize_whitespace(desc) } .include?(normalize_whitespace(work_package.description)) end diff --git a/app/workers/work_packages/bulk_job.rb b/app/workers/work_packages/bulk_job.rb index 8b0b77f1078f..f728c4ffe618 100644 --- a/app/workers/work_packages/bulk_job.rb +++ b/app/workers/work_packages/bulk_job.rb @@ -44,9 +44,9 @@ def perform(user:, work_package_ids:, project:, target_project:, params:, follow service_class .new(user:, work_packages:) .call(params) - .on_success(&method(:successful_status_update)) - .on_failure(&method(:failure_status_update)) - .then(&method(:wrap_result)) + .on_success { |call| successful_status_update(call) } + .on_failure { |call| failure_status_update(call) } + .then { |call| wrap_result(call) } end def store_status? diff --git a/lib/api/v3/work_packages/work_package_at_timestamp_representer.rb b/lib/api/v3/work_packages/work_package_at_timestamp_representer.rb index 74fb034bbc0d..63045e32118f 100644 --- a/lib/api/v3/work_packages/work_package_at_timestamp_representer.rb +++ b/lib/api/v3/work_packages/work_package_at_timestamp_representer.rb @@ -87,7 +87,7 @@ def compile_links_for(configs, *) def rendered_properties @rendered_properties ||= begin - properties = changed_properties_as_api_name.select(&method(:property_supported?)) + STATIC_NON_LINK_PROPERTIES + properties = changed_properties_as_api_name.select { |prop| property_supported?(prop) } + STATIC_NON_LINK_PROPERTIES if represented.exists_at_timestamp? properties + STATIC_LINK_PROPERTIES diff --git a/modules/bim/lib/open_project/bim/bcf_xml/issue_writer.rb b/modules/bim/lib/open_project/bim/bcf_xml/issue_writer.rb index a35d075ee9c4..a00622ec033e 100644 --- a/modules/bim/lib/open_project/bim/bcf_xml/issue_writer.rb +++ b/modules/bim/lib/open_project/bim/bcf_xml/issue_writer.rb @@ -215,13 +215,13 @@ def topic_due_date(topic_node) def replace_comments markup_node.xpath("./Comment").remove - Nokogiri::XML::Builder.with(markup_node, &method(:comments)) + Nokogiri::XML::Builder.with(markup_node) { |xml| comments(xml) } end def replace_viewpoints markup_node.xpath("./Viewpoints").remove - Nokogiri::XML::Builder.with(markup_node, &method(:viewpoints)) + Nokogiri::XML::Builder.with(markup_node) { |xml| viewpoints(xml) } end ## diff --git a/modules/github_integration/lib/open_project/github_integration/engine.rb b/modules/github_integration/lib/open_project/github_integration/engine.rb index 200f69e637ac..3c0917a22f97 100644 --- a/modules/github_integration/lib/open_project/github_integration/engine.rb +++ b/modules/github_integration/lib/open_project/github_integration/engine.rb @@ -100,12 +100,9 @@ def self.settings initializer "github.subscribe_to_notifications" do |app| app.config.after_initialize do - ::OpenProject::Notifications.subscribe("github.check_run", - &NotificationHandler.method(:check_run)) - ::OpenProject::Notifications.subscribe("github.issue_comment", - &NotificationHandler.method(:issue_comment)) - ::OpenProject::Notifications.subscribe("github.pull_request", - &NotificationHandler.method(:pull_request)) + ::OpenProject::Notifications.subscribe("github.check_run") { |payload| NotificationHandler.check_run(payload) } + ::OpenProject::Notifications.subscribe("github.issue_comment") { |payload| NotificationHandler.issue_comment(payload) } + ::OpenProject::Notifications.subscribe("github.pull_request") { |payload| NotificationHandler.pull_request(payload) } end end diff --git a/modules/gitlab_integration/lib/open_project/gitlab_integration/engine.rb b/modules/gitlab_integration/lib/open_project/gitlab_integration/engine.rb index 87e6802c4c82..474ce38cdd6c 100644 --- a/modules/gitlab_integration/lib/open_project/gitlab_integration/engine.rb +++ b/modules/gitlab_integration/lib/open_project/gitlab_integration/engine.rb @@ -109,16 +109,13 @@ def self.settings end initializer "gitlab.subscribe_to_notifications" do - ::OpenProject::Notifications.subscribe("gitlab.merge_request_hook", - &NotificationHandlers.method(:merge_request_hook)) - ::OpenProject::Notifications.subscribe("gitlab.note_hook", - &NotificationHandlers.method(:note_hook)) - ::OpenProject::Notifications.subscribe("gitlab.issue_hook", - &NotificationHandlers.method(:issue_hook)) - ::OpenProject::Notifications.subscribe("gitlab.push_hook", - &NotificationHandlers.method(:push_hook)) - ::OpenProject::Notifications.subscribe("gitlab.pipeline_hook", - &NotificationHandlers.method(:pipeline_hook)) + ::OpenProject::Notifications.subscribe("gitlab.merge_request_hook") do |payload| + NotificationHandlers.merge_request_hook(payload) + end + ::OpenProject::Notifications.subscribe("gitlab.note_hook") { |payload| NotificationHandlers.note_hook(payload) } + ::OpenProject::Notifications.subscribe("gitlab.issue_hook") { |payload| NotificationHandlers.issue_hook(payload) } + ::OpenProject::Notifications.subscribe("gitlab.push_hook") { |payload| NotificationHandlers.push_hook(payload) } + ::OpenProject::Notifications.subscribe("gitlab.pipeline_hook") { |payload| NotificationHandlers.pipeline_hook(payload) } end extend_api_response(:v3, :work_packages, :work_package, diff --git a/modules/grids/app/services/grids/set_attributes_service.rb b/modules/grids/app/services/grids/set_attributes_service.rb index 0e8c9da5a55a..d3d31fd756ad 100644 --- a/modules/grids/app/services/grids/set_attributes_service.rb +++ b/modules/grids/app/services/grids/set_attributes_service.rb @@ -119,7 +119,7 @@ def cleanup_prohibited_widgets(widgets) return if widgets&.any? || model.persisted? # As it is a new record, we can do direct assignments without risking saving. - model.widgets = model.widgets.select(&method(:allowed_widget?)) + model.widgets = model.widgets.select { |widget| allowed_widget?(widget) } end def allowed_widget?(widget) diff --git a/modules/ldap_groups/app/models/ldap_groups/synchronized_group.rb b/modules/ldap_groups/app/models/ldap_groups/synchronized_group.rb index c145a6db4c2d..acfa820c56bd 100644 --- a/modules/ldap_groups/app/models/ldap_groups/synchronized_group.rb +++ b/modules/ldap_groups/app/models/ldap_groups/synchronized_group.rb @@ -76,7 +76,7 @@ def add_members!(new_users) def remove_members!(users_to_remove) return if users_to_remove.empty? - user_ids = users_to_remove.map(&method(:user_id)) + user_ids = users_to_remove.map { |user| user_id(user) } self.class.transaction do # 1) Delete synchronized group MEMBERSHIPS from collection. diff --git a/modules/reporting/lib/report/walker.rb b/modules/reporting/lib/report/walker.rb index b6580824c34b..17ebbfb34586 100644 --- a/modules/reporting/lib/report/walker.rb +++ b/modules/reporting/lib/report/walker.rb @@ -118,7 +118,7 @@ def body(result = nil, &) result ||= query.result.tap { |r| sort(r) } if result.row? if result.final_row? - subresults = query.table.with_gaps_for(:column, result).map(&method(:walk_cell)) + subresults = query.table.with_gaps_for(:column, result).map { |cell| walk_cell(cell) } for_final_row.call result, subresults else subresults = result.map { |r| body(r) } @@ -126,7 +126,7 @@ def body(result = nil, &) end else # you only get here if no rows are defined - result.each_direct_result.map(&method(:walk_cell)) + result.each_direct_result.map { |cell| walk_cell(cell) } end end end From 0445787fc1f300287a25b65924e3f41aee70e020 Mon Sep 17 00:00:00 2001 From: Sebastian Cohnen Date: Fri, 16 Oct 2026 17:25:33 +0200 Subject: [PATCH 3/6] addresses Performance/RedundantMerge --- app/services/oauth_clients/set_attributes_service.rb | 2 +- app/services/projects/gantt_query_generator_service.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/services/oauth_clients/set_attributes_service.rb b/app/services/oauth_clients/set_attributes_service.rb index a62a6dd6802c..99a9621c2f0d 100644 --- a/app/services/oauth_clients/set_attributes_service.rb +++ b/app/services/oauth_clients/set_attributes_service.rb @@ -39,7 +39,7 @@ def replace_client_secret_with_nil(params) cloned_param = params.clone if cloned_param[:client_secret] == "" - cloned_param.merge!(client_secret: nil) + cloned_param[:client_secret] = nil end cloned_param diff --git a/app/services/projects/gantt_query_generator_service.rb b/app/services/projects/gantt_query_generator_service.rb index fbead51e8196..99ad16556119 100644 --- a/app/services/projects/gantt_query_generator_service.rb +++ b/app/services/projects/gantt_query_generator_service.rb @@ -54,7 +54,7 @@ def default_gantt_query milestone_ids = Type.milestone.pluck(:id).map(&:to_s) if milestone_ids.any? - default_with_filter.merge!("f" => [{ "n" => "type", "o" => "=", "v" => milestone_ids }]) + default_with_filter["f"] = [{ "n" => "type", "o" => "=", "v" => milestone_ids }] end JSON.dump(default_with_filter) From 58c5ae908d609249cb0c75e779cb01abe0e40b1e Mon Sep 17 00:00:00 2001 From: Sebastian Cohnen Date: Fri, 16 Oct 2026 17:28:48 +0200 Subject: [PATCH 4/6] addresses Performance/MapCompact --- app/controllers/oauth/auth_base_controller.rb | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/controllers/oauth/auth_base_controller.rb b/app/controllers/oauth/auth_base_controller.rb index f9258a6fd19f..5dd5cd5b35f6 100644 --- a/app/controllers/oauth/auth_base_controller.rb +++ b/app/controllers/oauth/auth_base_controller.rb @@ -64,8 +64,7 @@ def application_http_redirect_uris def application_native_redirect_uris registered_redirect_uris .reject { |url| url.start_with?("http", "urn") } - .map { |url| parse_native_redirect_uri(url) } - .compact + .filter_map { |url| parse_native_redirect_uri(url) } end def parse_native_redirect_uri(value) From 7637b561c1aadd3f198ce4c49e82291c95208c81 Mon Sep 17 00:00:00 2001 From: Sebastian Cohnen Date: Fri, 16 Oct 2026 17:34:34 +0200 Subject: [PATCH 5/6] addresses Performance/TimesMap --- .../app/models/xls_export/work_package/exporter/xls.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/xls_export/app/models/xls_export/work_package/exporter/xls.rb b/modules/xls_export/app/models/xls_export/work_package/exporter/xls.rb index eadd8da6412a..31becb265c41 100644 --- a/modules/xls_export/app/models/xls_export/work_package/exporter/xls.rb +++ b/modules/xls_export/app/models/xls_export/work_package/exporter/xls.rb @@ -91,7 +91,7 @@ def sanitize(string) module WithRelations def add_headers!(spreadsheet) headers_0 = [I18n.t(:label_work_package_plural)] + - columns.size.times.map { |_| "" } + + Array.new(columns.size) { "" } + [I18n.t("js.work_packages.tabs.relations")] spreadsheet.add_headers headers_0, 0 From f1f50040003a8c166fccd5a93b968fd31b9ea033 Mon Sep 17 00:00:00 2001 From: Sebastian Cohnen Date: Fri, 16 Oct 2026 17:46:57 +0200 Subject: [PATCH 6/6] removes config for Performance/Casecmp, as it has been retired years ago --- .rubocop.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index f11657bfe2b1..4ba039e11607 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -171,9 +171,6 @@ OpenProject/AddPreviewForViewComponent: # root. Note the gap this leaves: a spec that builds a work package and reads configuration off # its `type` is the real bug and is no longer flagged here. -Performance/Casecmp: - Enabled: false - # Don't force us to use tag instead of content_tag # as this breaks angular elements Rails/ContentTag: