diff --git a/.rubocop.yml b/.rubocop.yml index 6a62c752338..51877a85a99 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -784,6 +784,10 @@ Style/RegexpLiteralMixedPreserve: - mixed_preserve EnforcedStyle: mixed_preserve +# See https://gitlab.com/gitlab-org/gitlab/-/merge_requests/94317#note_1139610896 +Style/Lambda: + EnforcedStyle: literal + RSpec/TopLevelDescribePath: Exclude: - 'spec/fixtures/**/*.rb' diff --git a/.rubocop_todo/style/lambda.yml b/.rubocop_todo/style/lambda.yml index f733af601ec..9da29f7bb59 100644 --- a/.rubocop_todo/style/lambda.yml +++ b/.rubocop_todo/style/lambda.yml @@ -1,273 +1,81 @@ --- -# Cop supports --auto-correct. +# Cop supports --autocorrect. Style/Lambda: - # Offense count: 653 - # Temporarily disabled due to too many offenses - Enabled: false + Details: grace period Exclude: - - 'app/controllers/concerns/notes_actions.rb' - - 'app/controllers/concerns/spammable_actions/captcha_check/rest_api_actions_support.rb' - - 'app/controllers/projects/issues_controller.rb' - - 'app/controllers/search_controller.rb' - - 'app/graphql/mutations/container_repositories/destroy_tags.rb' - - 'app/graphql/mutations/design_management/delete.rb' - - 'app/graphql/types/permission_types/base_permission_type.rb' - - 'app/models/analytics/cycle_analytics/issue_stage_event.rb' - - 'app/models/analytics/cycle_analytics/merge_request_stage_event.rb' - - 'app/models/bulk_imports/tracker.rb' - - 'app/models/ci/build.rb' - - 'app/models/ci/deleted_object.rb' - - 'app/models/ci/instance_variable.rb' - - 'app/models/ci/job_artifact.rb' - - 'app/models/ci/namespace_mirror.rb' - - 'app/models/ci/pending_build.rb' - - 'app/models/ci/pipeline.rb' - - 'app/models/ci/processable.rb' - - 'app/models/ci/runner.rb' - - 'app/models/clusters/cluster.rb' - - 'app/models/clusters/concerns/application_status.rb' - - 'app/models/commit_status.rb' - - 'app/models/concerns/analytics/cycle_analytics/stage_event_model.rb' - - 'app/models/concerns/approvable_base.rb' - - 'app/models/concerns/atomic_internal_id.rb' - - 'app/models/concerns/ci/has_status.rb' - - 'app/models/concerns/clusters/agents/authorization_config_scopes.rb' - - 'app/models/concerns/has_environment_scope.rb' - - 'app/models/concerns/has_wiki_page_meta_attributes.rb' - - 'app/models/concerns/id_in_ordered.rb' - - 'app/models/concerns/integrations/has_issue_tracker_fields.rb' - - 'app/models/concerns/issuable.rb' - - 'app/models/concerns/issue_resource_event.rb' - - 'app/models/concerns/milestoneable.rb' - - 'app/models/concerns/mirror_authentication.rb' - - 'app/models/concerns/packages/debian/component_file.rb' - - 'app/models/concerns/reactive_caching.rb' - - 'app/models/concerns/timebox.rb' - - 'app/models/container_repository.rb' - - 'app/models/custom_emoji.rb' - - 'app/models/deployment.rb' - - 'app/models/design_management/action.rb' - - 'app/models/design_management/design.rb' - - 'app/models/design_management/version.rb' - - 'app/models/environment.rb' - - 'app/models/event.rb' - - 'app/models/group.rb' - - 'app/models/group_deploy_key.rb' - - 'app/models/group_group_link.rb' - - 'app/models/hooks/web_hook.rb' - - 'app/models/identity.rb' - - 'app/models/import_failure.rb' - - 'app/models/integrations/zentao_tracker_data.rb' - - 'app/models/internal_id.rb' - - 'app/models/issue.rb' - - 'app/models/issue/metrics.rb' - - 'app/models/jira_connect_installation.rb' - - 'app/models/label.rb' - - 'app/models/label_link.rb' - - 'app/models/loose_foreign_keys/deleted_record.rb' - - 'app/models/member.rb' - - 'app/models/members/project_member.rb' - - 'app/models/merge_request.rb' - - 'app/models/merge_request/cleanup_schedule.rb' - - 'app/models/merge_request_diff.rb' - - 'app/models/merge_request_diff_file.rb' - - 'app/models/merge_requests_closing_issues.rb' - - 'app/models/milestone.rb' - - 'app/models/namespace.rb' - - 'app/models/note.rb' - - 'app/models/note_diff_file.rb' - - 'app/models/notification_setting.rb' - - 'app/models/onboarding/progress.rb' - - 'app/models/operations/feature_flags/user_list.rb' - - 'app/models/packages/package.rb' - - 'app/models/packages/package_file.rb' - - 'app/models/pages_domain.rb' - - 'app/models/product_analytics_event.rb' - - 'app/models/programming_language.rb' - - 'app/models/project.rb' + - 'app/controllers/concerns/project_unauthorized.rb' + - 'app/controllers/profiles/two_factor_auths_controller.rb' + - 'app/models/concerns/featurable.rb' - 'app/models/project_feature.rb' - - 'app/models/project_feature_usage.rb' - - 'app/models/projects/topic.rb' - - 'app/models/prometheus_alert_event.rb' - - 'app/models/raw_usage_data.rb' - - 'app/models/redirect_route.rb' - - 'app/models/release.rb' - - 'app/models/remote_mirror.rb' - - 'app/models/repository_language.rb' - - 'app/models/snippet.rb' - - 'app/models/timelog.rb' - - 'app/models/todo.rb' - - 'app/models/user.rb' - - 'app/models/users/in_product_marketing_email.rb' - 'app/serializers/ci/daily_build_group_report_result_entity.rb' - 'app/serializers/group_child_entity.rb' - 'app/serializers/issuable_sidebar_basic_entity.rb' - 'app/serializers/merge_request_sidebar_basic_entity.rb' - - 'app/services/issues/referenced_merge_requests_service.rb' - - 'config/initializers/deprecations.rb' - - 'config/initializers/rspec_profiling.rb' + - 'config/application.rb' + - 'config/initializers/0_license.rb' + - 'config/initializers/0_log_deprecations.rb' + - 'config/initializers/action_cable.rb' + - 'config/initializers/gitlab_experiment.rb' + - 'config/initializers/lograge.rb' + - 'config/routes.rb' - 'config/routes/dashboard.rb' - 'config/routes/group.rb' - 'config/routes/issues.rb' - - 'db/post_migrate/20210303121224_update_gitlab_subscriptions_start_at_post_eoa.rb' - - 'db/post_migrate/20210513155546_backfill_nuget_temporary_packages_to_processing_status.rb' - - 'db/post_migrate/20210823132600_remove_duplicate_dast_site_tokens.rb' - - 'db/post_migrate/20220425121435_backfill_integrations_enable_ssl_verification.rb' - - 'ee/app/controllers/groups/analytics/productivity_analytics_controller.rb' - - 'ee/app/models/analytics/devops_adoption/enabled_namespace.rb' - - 'ee/app/models/analytics/devops_adoption/snapshot.rb' - - 'ee/app/models/app_sec/fuzzing/coverage/corpus.rb' - - 'ee/app/models/approval_merge_request_rule.rb' - - 'ee/app/models/boards/epic_board_position.rb' - - 'ee/app/models/boards/epic_user_preference.rb' - - 'ee/app/models/ci/minutes/project_monthly_usage.rb' - - 'ee/app/models/concerns/ee/protected_ref.rb' - - 'ee/app/models/concerns/geo/replicable_model.rb' - - 'ee/app/models/concerns/issue_widgets/acts_like_requirement.rb' - - 'ee/app/models/dast/profile.rb' - - 'ee/app/models/dast_site_validation.rb' - - 'ee/app/models/dora/daily_metrics.rb' - - 'ee/app/models/ee/ci/build.rb' - - 'ee/app/models/ee/ci/daily_build_group_report_result.rb' - - 'ee/app/models/ee/ci/job_artifact.rb' - - 'ee/app/models/ee/ci/pipeline.rb' - - 'ee/app/models/ee/environment.rb' - - 'ee/app/models/ee/epic.rb' - - 'ee/app/models/ee/group.rb' - - 'ee/app/models/ee/group_member.rb' - - 'ee/app/models/ee/identity.rb' - - 'ee/app/models/ee/issue.rb' - - 'ee/app/models/ee/iteration.rb' - - 'ee/app/models/ee/label.rb' - - 'ee/app/models/ee/member.rb' - - 'ee/app/models/ee/merge_request.rb' - - 'ee/app/models/ee/namespace.rb' - - 'ee/app/models/ee/namespace_ci_cd_setting.rb' - - 'ee/app/models/ee/note.rb' - - 'ee/app/models/ee/project.rb' - - 'ee/app/models/ee/user.rb' - - 'ee/app/models/ee/vulnerability.rb' - - 'ee/app/models/gitlab_subscription.rb' - - 'ee/app/models/incident_management/oncall_rotation.rb' - - 'ee/app/models/incident_management/oncall_shift.rb' - - 'ee/app/models/iterations/cadence.rb' - - 'ee/app/models/merge_request_block.rb' - - 'ee/app/models/merge_requests/external_status_check.rb' - - 'ee/app/models/merge_train.rb' - - 'ee/app/models/protected_environment.rb' - - 'ee/app/models/requirements_management/requirement.rb' - - 'ee/app/models/security/finding.rb' - - 'ee/app/models/security/orchestration_policy_configuration.rb' - - 'ee/app/models/security/orchestration_policy_rule_schedule.rb' - - 'ee/app/models/security/scan.rb' - - 'ee/app/models/security/training_provider.rb' - - 'ee/app/models/software_license_policy.rb' - - 'ee/app/models/vulnerabilities/feedback.rb' - - 'ee/app/models/vulnerabilities/finding.rb' - - 'ee/app/models/vulnerabilities/historical_statistic.rb' - - 'ee/app/models/vulnerabilities/read.rb' - - 'ee/app/models/vulnerabilities/scanner.rb' + - 'ee/app/controllers/concerns/ee/routable_actions/sso_enforcement_redirect.rb' - 'ee/app/serializers/ee/group_child_entity.rb' - - 'ee/lib/ee/api/entities/application_setting.rb' - - 'ee/lib/ee/api/entities/geo_node_status.rb' - - 'ee/lib/ee/api/entities/group.rb' + - 'ee/app/services/ee/issues/export_csv_service.rb' + - 'ee/lib/ee/api/entities/group_detail.rb' - 'ee/lib/ee/api/entities/group_push_rule.rb' - - 'ee/lib/ee/api/entities/project.rb' - - 'ee/lib/ee/api/entities/vulnerability_issue_link.rb' - - 'ee/lib/ee/gitlab/background_migration/populate_resolved_on_default_branch_column.rb' + - 'ee/lib/ee/banzai/filter/sanitization_filter.rb' + - 'ee/lib/ee/gitlab/checks/diff_check.rb' + - 'ee/lib/elastic/latest/application_class_proxy.rb' - 'ee/lib/gem_extensions/elasticsearch/model/adapter/active_record/importing.rb' - - 'ee/spec/migrations/backfill_delayed_group_deletion_spec.rb' - - 'ee/spec/migrations/remove_schedule_and_status_null_constraints_from_pending_escalations_alert_spec.rb' + - 'ee/spec/elastic_integration/global_search_spec.rb' + - 'ee/spec/lib/gitlab/geo/event_gap_tracking_spec.rb' - 'ee/spec/services/ee/groups/autocomplete_service_spec.rb' - - 'ee/spec/services/ee/notes/create_service_spec.rb' + - 'ee/spec/support/helpers/elasticsearch_helpers.rb' - 'ee/spec/support/shared_examples/lib/gitlab/middleware/maintenance_mode_gitlab_ee_instance_shared_examples.rb' - 'ee/spec/support/shared_examples/lib/gitlab/middleware/read_only_gitlab_ee_instance_shared_examples.rb' - - 'lib/api/ci/jobs.rb' - - 'lib/api/ci/pipelines.rb' - - 'lib/api/entities/group_detail.rb' - - 'lib/api/entities/issue.rb' - 'lib/api/entities/label.rb' - - 'lib/api/entities/merge_request.rb' - 'lib/api/entities/project.rb' - 'lib/api/entities/project_export_status.rb' - - 'lib/api/feature_flags_user_lists.rb' - - 'lib/container_registry/base_client.rb' - - 'lib/container_registry/client.rb' - - 'lib/csv_builder.rb' - - 'lib/event_filter.rb' - - 'lib/gitlab/background_migration/backfill_ci_namespace_mirrors.rb' - - 'lib/gitlab/background_migration/backfill_ci_project_mirrors.rb' - - 'lib/gitlab/background_migration/backfill_ci_queuing_tables.rb' - - 'lib/gitlab/background_migration/fix_projects_without_prometheus_service.rb' - - 'lib/gitlab/background_migration/populate_latest_pipeline_ids.rb' - - 'lib/gitlab/ci/config/entry/includes.rb' - - 'lib/gitlab/ci/config/entry/trigger.rb' - - 'lib/gitlab/config/entry/validatable.rb' - - 'lib/gitlab/database/background_migration/batched_migration.rb' - - 'lib/gitlab/database/background_migration_job.rb' - - 'lib/gitlab/database/postgres_foreign_key.rb' - - 'lib/gitlab/database/postgres_index.rb' - - 'lib/gitlab/database/postgres_partition.rb' - - 'lib/gitlab/database/postgres_partitioned_table.rb' - - 'lib/gitlab/gl_repository.rb' - - 'lib/gitlab/import_export/import_failure_service.rb' - - 'lib/gitlab/merge_requests/commit_message_generator.rb' - - 'lib/gitlab/seeder.rb' + - 'lib/api/validations/types/comma_separated_to_array.rb' + - 'lib/api/validations/types/comma_separated_to_integer_array.rb' + - 'lib/api/validations/types/hash_of_integer_values.rb' + - 'lib/api/validations/validators/check_assignees_count.rb' + - 'lib/banzai/filter/ascii_doc_sanitization_filter.rb' + - 'lib/banzai/filter/base_sanitization_filter.rb' + - 'lib/banzai/filter/sanitization_filter.rb' + - 'lib/gitlab/action_cable/request_store_callbacks.rb' + - 'lib/gitlab/checks/diff_check.rb' + - 'lib/gitlab/database/load_balancing/action_cable_callbacks.rb' + - 'lib/gitlab/middleware/rack_multipart_tempfile_factory.rb' + - 'lib/gitlab/omniauth_initializer.rb' + - 'lib/gitlab/prometheus/queries/query_additional_metrics.rb' + - 'lib/gitlab/rack_attack.rb' - 'lib/gitlab/sidekiq_config/worker_matcher.rb' - - 'lib/gitlab/sidekiq_signals.rb' - - 'lib/gitlab/utils/measuring.rb' - - 'lib/gitlab/visibility_level.rb' - - 'rubocop/cop/rspec/modify_sidekiq_middleware.rb' - - 'rubocop/cop/rspec/timecop_freeze.rb' - - 'rubocop/cop/rspec/timecop_travel.rb' + - 'lib/gitlab/sidekiq_middleware.rb' + - 'lib/gitlab/utils/usage_data.rb' + - 'qa/qa/page/base.rb' + - 'qa/qa/runtime/allure_report.rb' + - 'qa/qa/specs/features/api/1_manage/import/import_large_github_repo_spec.rb' + - 'qa/qa/support/api.rb' + - 'rubocop/cop/inject_enterprise_edition_module.rb' + - 'rubocop/cop/rspec/have_gitlab_http_status.rb' - 'spec/controllers/concerns/routable_actions_spec.rb' - - 'spec/deprecation_toolkit_env.rb' - - 'spec/factories/design_management/designs.rb' - - 'spec/features/projects/issues/design_management/user_views_designs_with_svg_xss_spec.rb' - - 'spec/graphql/resolvers/concerns/resolves_groups_spec.rb' + - 'spec/features/groups/dependency_proxy_for_containers_spec.rb' + - 'spec/graphql/types/base_object_spec.rb' + - 'spec/lib/gitlab/action_cable/request_store_callbacks_spec.rb' - 'spec/lib/gitlab/cross_project_access/class_methods_spec.rb' - - 'spec/lib/gitlab/database/consistency_spec.rb' - - 'spec/lib/gitlab/database/dynamic_model_helpers_spec.rb' - 'spec/lib/gitlab/database/load_balancing/action_cable_callbacks_spec.rb' - - 'spec/lib/gitlab/database/load_balancing_spec.rb' - - 'spec/lib/gitlab/database/migration_helpers/restrict_gitlab_schema_spec.rb' - - 'spec/lib/gitlab/database/migration_helpers_spec.rb' - - 'spec/lib/gitlab/database/query_analyzers/gitlab_schemas_metrics_spec.rb' + - 'spec/lib/gitlab/graphql/tracers/application_context_tracer_spec.rb' - 'spec/lib/gitlab/graphql/tracers/timer_tracer_spec.rb' - - 'spec/lib/gitlab/import_export/members_mapper_spec.rb' - - 'spec/lib/gitlab/sidekiq_middleware/size_limiter/validator_spec.rb' - - 'spec/migrations/20210722150102_operations_feature_flags_correct_flexible_rollout_values_spec.rb' - - 'spec/migrations/20210804150320_create_base_work_item_types_spec.rb' - - 'spec/migrations/20210819145000_drop_temporary_columns_and_triggers_for_ci_builds_runner_session_spec.rb' - - 'spec/migrations/20210831203408_upsert_base_work_item_types_spec.rb' - - 'spec/migrations/20210902144144_drop_temporary_columns_and_triggers_for_ci_build_needs_spec.rb' - - 'spec/migrations/20210906100316_drop_temporary_columns_and_triggers_for_ci_build_trace_chunks_spec.rb' - - 'spec/migrations/20210906130643_drop_temporary_columns_and_triggers_for_taggings_spec.rb' - - 'spec/migrations/20210907013944_cleanup_bigint_conversion_for_ci_builds_metadata_spec.rb' - - 'spec/migrations/20210915022415_cleanup_bigint_conversion_for_ci_builds_spec.rb' - - 'spec/migrations/20210922021816_drop_int4_columns_for_ci_job_artifacts_spec.rb' - - 'spec/migrations/20210922025631_drop_int4_column_for_ci_sources_pipelines_spec.rb' - - 'spec/migrations/20210922082019_drop_int4_column_for_events_spec.rb' - - 'spec/migrations/20210922091402_drop_int4_column_for_push_event_payloads_spec.rb' - - 'spec/migrations/20211126115449_encrypt_static_objects_external_storage_auth_token_spec.rb' - - 'spec/migrations/20211203091642_add_index_to_projects_on_marked_for_deletion_at_spec.rb' - - 'spec/migrations/20220120094340_drop_position_from_security_findings_spec.rb' - - 'spec/migrations/20220128155814_fix_approval_rules_code_owners_rule_type_index_spec.rb' - - 'spec/migrations/20220305223212_add_security_training_providers_spec.rb' - - 'spec/migrations/20220505174658_update_index_on_alerts_to_exclude_null_fingerprints_spec.rb' - - 'spec/migrations/generate_customers_dot_jwt_signing_key_spec.rb' - - 'spec/migrations/insert_ci_daily_pipeline_schedule_triggers_plan_limits_spec.rb' - - 'spec/migrations/recreate_index_security_ci_builds_on_name_and_id_parser_features_spec.rb' - - 'spec/migrations/recreate_index_security_ci_builds_on_name_and_id_parser_with_new_features_spec.rb' - - 'spec/migrations/remove_schedule_and_status_from_pending_alert_escalations_spec.rb' - - 'spec/models/ability_spec.rb' - - 'spec/models/broadcast_message_spec.rb' - - 'spec/models/concerns/participable_spec.rb' + - 'spec/lib/gitlab/middleware/rack_multipart_tempfile_factory_spec.rb' + - 'spec/lib/gitlab/path_regex_spec.rb' - 'spec/services/groups/autocomplete_service_spec.rb' - - 'spec/services/notes/create_service_spec.rb' + - 'spec/services/issues/referenced_merge_requests_service_spec.rb' - 'spec/services/projects/autocomplete_service_spec.rb' - 'spec/services/projects/lfs_pointers/lfs_download_link_list_service_spec.rb' - 'spec/support/helpers/email_helpers.rb' + - 'spec/support/helpers/reference_parser_helpers.rb' - 'spec/support/shared_examples/lib/gitlab/middleware/read_only_gitlab_instance_shared_examples.rb' - - 'spec/support/shared_examples/quick_actions/issuable/issuable_quick_actions_shared_examples.rb' - - 'spec/workers/process_commit_worker_spec.rb' diff --git a/app/assets/javascripts/lib/utils/datetime/date_calculation_utility.js b/app/assets/javascripts/lib/utils/datetime/date_calculation_utility.js index c11cf1a7882..4e0a59d0a38 100644 --- a/app/assets/javascripts/lib/utils/datetime/date_calculation_utility.js +++ b/app/assets/javascripts/lib/utils/datetime/date_calculation_utility.js @@ -270,6 +270,25 @@ export const secondsToMilliseconds = (seconds) => seconds * 1000; */ export const secondsToDays = (seconds) => Math.round(seconds / 86400); +/** + * Returns the date `n` seconds after the date provided + * + * @param {Date} date the initial date + * @param {Number} numberOfSeconds number of seconds after + * @return {Date} A `Date` object `n` seconds after the provided `Date` + */ +export const nSecondsAfter = (date, numberOfSeconds) => + new Date(date.getTime() + numberOfSeconds * 1000); + +/** + * Returns the date `n` seconds before the date provided + * + * @param {Date} date the initial date + * @param {Number} numberOfSeconds number of seconds before + * @return {Date} A `Date` object `n` seconds before the provided `Date` + */ +export const nSecondsBefore = (date, numberOfSeconds) => nSecondsAfter(date, -numberOfSeconds); + /** * Returns the date `n` days after the date provided * diff --git a/app/assets/javascripts/vue_merge_request_widget/components/extensions/container.js b/app/assets/javascripts/vue_merge_request_widget/components/extensions/container.js index 9887bda973c..5fbad124acb 100644 --- a/app/assets/javascripts/vue_merge_request_widget/components/extensions/container.js +++ b/app/assets/javascripts/vue_merge_request_widget/components/extensions/container.js @@ -11,13 +11,10 @@ export default { render(h) { const { extensions } = registeredExtensions; - if (extensions.length === 0) return null; - return h( 'section', { attrs: { - class: 'mr-section-container mr-widget-workflow', role: 'region', 'aria-label': __('Merge request reports'), }, diff --git a/app/assets/javascripts/vue_merge_request_widget/components/report_widget_container.vue b/app/assets/javascripts/vue_merge_request_widget/components/report_widget_container.vue new file mode 100644 index 00000000000..2683956e603 --- /dev/null +++ b/app/assets/javascripts/vue_merge_request_widget/components/report_widget_container.vue @@ -0,0 +1,18 @@ + + + diff --git a/app/assets/javascripts/vue_merge_request_widget/mr_widget_options.vue b/app/assets/javascripts/vue_merge_request_widget/mr_widget_options.vue index c658d3a38f4..9b64ba3f191 100644 --- a/app/assets/javascripts/vue_merge_request_widget/mr_widget_options.vue +++ b/app/assets/javascripts/vue_merge_request_widget/mr_widget_options.vue @@ -1,7 +1,10 @@