diff --git a/.rubocop_todo/gitlab/json.yml b/.rubocop_todo/gitlab/json.yml index ec48c04f3edef98c0391dffef2bc83a4a404cd45..92f679bd11a29d51b03cb6f663df192b7f8f4ee8 100644 --- a/.rubocop_todo/gitlab/json.yml +++ b/.rubocop_todo/gitlab/json.yml @@ -18,31 +18,6 @@ Gitlab/Json: - 'app/controllers/projects/templates_controller.rb' - 'app/controllers/projects_controller.rb' - 'app/controllers/search_controller.rb' - - 'app/helpers/access_tokens_helper.rb' - - 'app/helpers/application_settings_helper.rb' - - 'app/helpers/breadcrumbs_helper.rb' - - 'app/helpers/ci/builds_helper.rb' - - 'app/helpers/ci/pipelines_helper.rb' - - 'app/helpers/compare_helper.rb' - - 'app/helpers/emails_helper.rb' - - 'app/helpers/environment_helper.rb' - - 'app/helpers/groups_helper.rb' - - 'app/helpers/ide_helper.rb' - - 'app/helpers/integrations_helper.rb' - - 'app/helpers/invite_members_helper.rb' - - 'app/helpers/issuables_description_templates_helper.rb' - - 'app/helpers/issuables_helper.rb' - - 'app/helpers/jira_connect_helper.rb' - - 'app/helpers/learn_gitlab_helper.rb' - - 'app/helpers/namespaces_helper.rb' - - 'app/helpers/notes_helper.rb' - - 'app/helpers/operations_helper.rb' - - 'app/helpers/packages_helper.rb' - - 'app/helpers/projects/project_members_helper.rb' - - 'app/helpers/projects_helper.rb' - - 'app/helpers/search_helper.rb' - - 'app/helpers/terms_helper.rb' - - 'app/helpers/users_helper.rb' - 'app/mailers/emails/members.rb' - 'app/models/concerns/redis_cacheable.rb' - 'app/models/diff_discussion.rb' diff --git a/app/helpers/access_tokens_helper.rb b/app/helpers/access_tokens_helper.rb index 44200e84afb091f55993b29f3651872bc1346854..07e61b7f552e7c00927c32c233a67e7189bfd791 100644 --- a/app/helpers/access_tokens_helper.rb +++ b/app/helpers/access_tokens_helper.rb @@ -9,7 +9,7 @@ def scope_description(prefix) end def tokens_app_data - { + data = { feed_token: { enabled: !Gitlab::CurrentSettings.disable_feed_token, token: current_user.feed_token, @@ -25,7 +25,9 @@ def tokens_app_data token: current_user.enabled_static_object_token, reset_path: reset_static_object_token_profile_path } - }.to_json + } + + Gitlab::Json.dump(data) end def expires_at_field_data diff --git a/app/helpers/application_settings_helper.rb b/app/helpers/application_settings_helper.rb index 3719676497445fca4ff29605bca344c77e156deb..ea07e3697a378b41cad8dbb648ba439c277e8847 100644 --- a/app/helpers/application_settings_helper.rb +++ b/app/helpers/application_settings_helper.rb @@ -137,7 +137,7 @@ def repository_storages_options_json } end - options.to_json + Gitlab::Json.dump(options) end def external_authorization_description diff --git a/app/helpers/breadcrumbs_helper.rb b/app/helpers/breadcrumbs_helper.rb index 38ed6e95a449a08ff5233fec4f1dcfbaa35bb8f2..a14bc8e00bf7a0f5a6495705ceade5a77ba318d7 100644 --- a/app/helpers/breadcrumbs_helper.rb +++ b/app/helpers/breadcrumbs_helper.rb @@ -40,11 +40,11 @@ def push_to_schema_breadcrumb(text, link) end def schema_breadcrumb_json - { + Gitlab::Json.dump({ '@context': 'https://schema.org', '@type': 'BreadcrumbList', 'itemListElement': build_item_list_elements - }.to_json + }) end private diff --git a/app/helpers/ci/builds_helper.rb b/app/helpers/ci/builds_helper.rb index afd0af18ba7f3b96684e750b2685ffd24a5cd83e..265969a6370cf039b75b102d4e3fde7dd78ecee0 100644 --- a/app/helpers/ci/builds_helper.rb +++ b/app/helpers/ci/builds_helper.rb @@ -38,13 +38,13 @@ def build_failed_issue_options end def prepare_failed_jobs_summary_data(failed_builds) - failed_builds.map do |build| + Gitlab::Json.dump(failed_builds.map do |build| { id: build.id, failure: build.present.callout_failure_message, failure_summary: build_summary(build) } - end.to_json + end) end end end diff --git a/app/helpers/ci/pipelines_helper.rb b/app/helpers/ci/pipelines_helper.rb index c93c8dd8d7659ca5d9a73110c4649a42d5bad692..80632f2ea10335d465d0de73e683b87854832842 100644 --- a/app/helpers/ci/pipelines_helper.rb +++ b/app/helpers/ci/pipelines_helper.rb @@ -87,7 +87,7 @@ def pipelines_list_data(project, list_url) endpoint: list_url, project_id: project.id, default_branch_name: project.default_branch, - params: params.to_json, + params: Gitlab::Json.dump(params), artifacts_endpoint: downloadable_artifacts_project_pipeline_path(project, artifacts_endpoint_placeholder, format: :json), artifacts_endpoint_placeholder: artifacts_endpoint_placeholder, pipeline_schedule_url: pipeline_schedules_path(project), @@ -100,7 +100,7 @@ def pipelines_list_data(project, list_url) reset_cache_path: can?(current_user, :admin_pipeline, project) && reset_cache_project_settings_ci_cd_path(project), has_gitlab_ci: has_gitlab_ci?(project).to_s, pipeline_editor_path: can?(current_user, :create_pipeline, project) && project_ci_pipeline_editor_path(project), - suggested_ci_templates: suggested_ci_templates.to_json, + suggested_ci_templates: Gitlab::Json.dump(suggested_ci_templates), ci_runner_settings_path: project_settings_ci_cd_path(project, ci_runner_templates: true, anchor: 'js-runners-settings') } diff --git a/app/helpers/compare_helper.rb b/app/helpers/compare_helper.rb index 9ecf780f55b094c6ebdf71cbe139ee395d3e6eea..91f8567aa2d8ee28c2625adf65b9f6820140b980 100644 --- a/app/helpers/compare_helper.rb +++ b/app/helpers/compare_helper.rb @@ -37,17 +37,17 @@ def target_projects(source_project) def project_compare_selector_data(project, merge_request, params) { project_compare_index_path: project_compare_index_path(project), - source_project: { id: project.id, name: project.full_path }.to_json, - target_project: { id: @target_project.id, name: @target_project.full_path }.to_json, + source_project: Gitlab::Json.dump({ id: project.id, name: project.full_path }), + target_project: Gitlab::Json.dump({ id: @target_project.id, name: @target_project.full_path }), source_project_refs_path: refs_project_path(project), target_project_refs_path: refs_project_path(@target_project), params_from: params[:from], params_to: params[:to], straight: params[:straight] }.tap do |data| - data[:projects_from] = target_projects(project).map do |target_project| + data[:projects_from] = Gitlab::Json.dump(target_projects(project).map do |target_project| { id: target_project.id, name: target_project.full_path } - end.to_json + end) data[:project_merge_request_path] = if merge_request.present? diff --git a/app/helpers/emails_helper.rb b/app/helpers/emails_helper.rb index 54733fa9101f659e373360eb1941fe6e40bbf0ab..fe3324120eb2b65f5118248775098c100f6986fb 100644 --- a/app/helpers/emails_helper.rb +++ b/app/helpers/emails_helper.rb @@ -36,7 +36,7 @@ def gmail_goto_action(name, url) } content_tag :script, type: 'application/ld+json' do - data.to_json.html_safe + Gitlab::Json.dump(data).html_safe end end diff --git a/app/helpers/environment_helper.rb b/app/helpers/environment_helper.rb index b6997b6fb70a45ebca455382cc9314f971441871..677892e7d327f90db30bc946d581219763da859f 100644 --- a/app/helpers/environment_helper.rb +++ b/app/helpers/environment_helper.rb @@ -91,6 +91,6 @@ def environments_detail_data(user, project, environment) end def environments_detail_data_json(user, project, environment) - environments_detail_data(user, project, environment).to_json + Gitlab::Json.dump(environments_detail_data(user, project, environment)) end end diff --git a/app/helpers/groups_helper.rb b/app/helpers/groups_helper.rb index 6b00c2138759cbb34dd567bd0348aa974efebab9..1612c161f01b548cdaff14cd41cff54bfb74199f 100644 --- a/app/helpers/groups_helper.rb +++ b/app/helpers/groups_helper.rb @@ -119,7 +119,7 @@ def parent_group_options(current_group) { id: group.id, text: group.human_name } end - groups.to_json + Gitlab::Json.dump(groups) end def render_setting_to_allow_project_access_token_creation?(group) diff --git a/app/helpers/ide_helper.rb b/app/helpers/ide_helper.rb index 5b3ca25b5afa82883ad2be2c83569d1e69bd2b0c..cdc3804d1927a6c1bbaa193339b384cd4b29137d 100644 --- a/app/helpers/ide_helper.rb +++ b/app/helpers/ide_helper.rb @@ -56,7 +56,7 @@ def legacy_ide_data def convert_to_project_entity_json(project) return unless project - API::Entities::Project.represent(project, current_user: current_user).to_json + Gitlab::Json.dump(API::Entities::Project.represent(project, current_user: current_user)) end def enable_environments_guidance? diff --git a/app/helpers/integrations_helper.rb b/app/helpers/integrations_helper.rb index abfa55cff24c0d6aa64b514d217055009a58d5d3..14eec407d15ca8fc1b830a1e8ea85c8b0d0e80b6 100644 --- a/app/helpers/integrations_helper.rb +++ b/app/helpers/integrations_helper.rb @@ -114,7 +114,7 @@ def integration_form_data(integration, project: nil, group: nil) learn_more_path: integrations_help_page_path, about_pricing_url: Gitlab::Saas.about_pricing_url, trigger_events: trigger_events_for_integration(integration), - sections: integration.sections.to_json, + sections: Gitlab::Json.dump(integration.sections), fields: fields_for_integration(integration), inherit_from_id: integration.inherit_from_id, integration_level: integration_level(integration), @@ -144,7 +144,7 @@ def integration_overrides_data(integration, project: nil, group: nil) def integration_list_data(integrations, group: nil, project: nil) { - integrations: integrations.map { |i| serialize_integration(i, group: group, project: project) }.to_json + integrations: Gitlab::Json.dump(integrations.map { |i| serialize_integration(i, group: group, project: project) }) } end @@ -237,11 +237,15 @@ def default_integration_event_description(event) end def trigger_events_for_integration(integration) - Integrations::EventSerializer.new(integration: integration).represent(integration.configurable_events).to_json + serializer = Integrations::EventSerializer.new(integration: integration).represent(integration.configurable_events) + + Gitlab::Json.dump(serializer) end def fields_for_integration(integration) - Integrations::FieldSerializer.new(integration: integration).represent(integration.form_fields).to_json + serializer = Integrations::FieldSerializer.new(integration: integration).represent(integration.form_fields) + + Gitlab::Json.dump(serializer) end def integration_level(integration) diff --git a/app/helpers/invite_members_helper.rb b/app/helpers/invite_members_helper.rb index 5d537767eaf394d21f95e4ef4337216d7700e4e1..8672dfb39dceecd86c144be57e9f0e269546b327 100644 --- a/app/helpers/invite_members_helper.rb +++ b/app/helpers/invite_members_helper.rb @@ -29,7 +29,7 @@ def common_invite_group_modal_data(source, member_class, is_project) invalid_groups: source.related_group_ids, help_link: help_page_url('user/permissions'), is_project: is_project, - access_levels: member_class.permissible_access_level_roles(current_user, source).to_json + access_levels: Gitlab::Json.dump(member_class.permissible_access_level_roles(current_user, source)) }.merge(group_select_data(source)) end @@ -44,8 +44,8 @@ def common_invite_modal_dataset(source) if show_invite_members_for_task?(source) dataset.merge!( - tasks_to_be_done_options: tasks_to_be_done_options.to_json, - projects: projects_for_source(source).to_json, + tasks_to_be_done_options: Gitlab::Json.dump(tasks_to_be_done_options), + projects: Gitlab::Json.dump(projects_for_source(source)), new_project_path: source.is_a?(Group) ? new_project_path(namespace_id: source.id) : '' ) end diff --git a/app/helpers/issuables_description_templates_helper.rb b/app/helpers/issuables_description_templates_helper.rb index 58b86dca1e0c3bd92ead4656c8fea1581f3f0004..075b2710722f47cd968558f1863368b5015f647c 100644 --- a/app/helpers/issuables_description_templates_helper.rb +++ b/app/helpers/issuables_description_templates_helper.rb @@ -53,7 +53,7 @@ def template_names(issuable) end def available_service_desk_templates_for(project) - issuable_templates(project, 'issue').flatten.to_json + Gitlab::Json.dump(issuable_templates(project, 'issue').flatten) end def template_names_path(parent, issuable) diff --git a/app/helpers/issuables_helper.rb b/app/helpers/issuables_helper.rb index e9e6241a6a7713ceaf6ed63bbaa6c13ddc9acca0..0a5d02cbcc7db2b44e023f0e29ff6ec9d794aa6a 100644 --- a/app/helpers/issuables_helper.rb +++ b/app/helpers/issuables_helper.rb @@ -73,10 +73,9 @@ def serialize_issuable(issuable, opts = {}) MergeRequestSerializer end - serializer_klass + Gitlab::Json.dump(serializer_klass .new(current_user: current_user, project: issuable.project) - .represent(issuable, opts) - .to_json + .represent(issuable, opts)) end def users_dropdown_label(selected_users) @@ -441,7 +440,7 @@ def sidebar_labels_data(issuable_sidebar, project) labels_manage_path: project_labels_path(project), project_issues_path: issuable_sidebar[:project_issuables_path], project_path: project.full_path, - selected_labels: issuable_sidebar[:labels].to_json + selected_labels: Gitlab::Json.dump(issuable_sidebar[:labels]) } end diff --git a/app/helpers/jira_connect_helper.rb b/app/helpers/jira_connect_helper.rb index 0971fdae8dd01e356ccdeefd208cccba44decab0..70e1f7ca4f602432e3b9f5dbc8520cc2d5afd41b 100644 --- a/app/helpers/jira_connect_helper.rb +++ b/app/helpers/jira_connect_helper.rb @@ -6,12 +6,12 @@ def jira_connect_app_data(subscriptions, installation) { groups_path: api_v4_groups_path(params: { min_access_level: Gitlab::Access::MAINTAINER, skip_groups: skip_groups }), - subscriptions: subscriptions.map { |s| serialize_subscription(s) }.to_json, + subscriptions: Gitlab::Json.dump(subscriptions.map { |s| serialize_subscription(s) }), add_subscriptions_path: jira_connect_subscriptions_path, subscriptions_path: jira_connect_subscriptions_path(format: :json), users_path: current_user ? nil : jira_connect_users_path, # users_path is used to determine if user is signed in gitlab_user_path: current_user ? user_path(current_user) : nil, - oauth_metadata: Feature.enabled?(:jira_connect_oauth, current_user) ? jira_connect_oauth_data(installation).to_json : nil + oauth_metadata: Feature.enabled?(:jira_connect_oauth, current_user) ? Gitlab::Json.dump(jira_connect_oauth_data(installation)) : nil } end diff --git a/app/helpers/learn_gitlab_helper.rb b/app/helpers/learn_gitlab_helper.rb index a07922e451aea80f256fe17bf4dda4f92cc6b695..485a85cc73f8047ad287dd8cace767925572666e 100644 --- a/app/helpers/learn_gitlab_helper.rb +++ b/app/helpers/learn_gitlab_helper.rb @@ -14,9 +14,9 @@ def learn_gitlab_enabled?(project) def learn_gitlab_data(project) { - actions: onboarding_actions_data(project).to_json, - sections: onboarding_sections_data.to_json, - project: onboarding_project_data(project).to_json + actions: Gitlab::Json.dump(onboarding_actions_data(project)), + sections: Gitlab::Json.dump(onboarding_sections_data), + project: Gitlab::Json.dump(onboarding_project_data(project)) } end diff --git a/app/helpers/namespaces_helper.rb b/app/helpers/namespaces_helper.rb index 60796e628a334169ba553882a925e5413449081d..3d4f7254c18450a8683e78e5decf36fe4dfb5dbe 100644 --- a/app/helpers/namespaces_helper.rb +++ b/app/helpers/namespaces_helper.rb @@ -67,7 +67,7 @@ def cascading_namespace_settings_popover_data(attribute, group, settings_path_he end { - popover_data: popover_data.to_json, + popover_data: Gitlab::Json.dump(popover_data), testid: 'cascading-settings-lock-icon' } end diff --git a/app/helpers/notes_helper.rb b/app/helpers/notes_helper.rb index b47f4633348e6796ca01716e4f1253c018a93643..c0d26d4759d947da5288f4d7acbed42ca83dcf3d 100644 --- a/app/helpers/notes_helper.rb +++ b/app/helpers/notes_helper.rb @@ -22,12 +22,14 @@ def note_supports_quick_actions?(note) end def noteable_json(noteable) - { + data = { id: noteable.id, class: noteable.class.name, resources: noteable.class.table_name, project_id: noteable.project.id - }.to_json + } + + Gitlab::Json.dump(data) end def diff_view_data diff --git a/app/helpers/operations_helper.rb b/app/helpers/operations_helper.rb index baeb9a477c3b5691562b628a1c24066069ac46c8..542b8260d204258fe9775593d1e23ee8a4fa902e 100644 --- a/app/helpers/operations_helper.rb +++ b/app/helpers/operations_helper.rb @@ -26,7 +26,7 @@ def alerts_settings_data(disabled: false) 'disabled' => disabled.to_s, 'project_path' => @project.full_path, 'multi_integrations' => 'false', - 'templates' => templates.to_json, + 'templates' => Gitlab::Json.dump(templates), 'create_issue' => setting.create_issue.to_s, 'issue_template_key' => setting.issue_template_key.to_s, 'send_email' => setting.send_email.to_s, diff --git a/app/helpers/packages_helper.rb b/app/helpers/packages_helper.rb index f9ec20bdd018338afe089836a6142c42ecdf8305..9f72acf40b52f35efec04ad29e2023734cf3d935 100644 --- a/app/helpers/packages_helper.rb +++ b/app/helpers/packages_helper.rb @@ -24,7 +24,7 @@ def package_registry_project_url(project_id, registry_type = :maven) def package_from_presenter(package) presenter = ::Packages::Detail::PackagePresenter.new(package) - presenter.detail_view.to_json + Gitlab::Json.dump(presenter.detail_view) end def pypi_registry_url(project_id) @@ -68,9 +68,9 @@ def cleanup_settings_data { project_id: @project.id, project_path: @project.full_path, - cadence_options: cadence_options.to_json, - keep_n_options: keep_n_options.to_json, - older_than_options: older_than_options.to_json, + cadence_options: Gitlab::Json.dump(cadence_options), + keep_n_options: Gitlab::Json.dump(keep_n_options), + older_than_options: Gitlab::Json.dump(older_than_options), is_admin: current_user&.admin.to_s, admin_settings_path: ci_cd_admin_application_settings_path(anchor: 'js-registry-settings'), project_settings_path: project_settings_packages_and_registries_path(@project), diff --git a/app/helpers/projects/project_members_helper.rb b/app/helpers/projects/project_members_helper.rb index 51a7d3e35d0fdd3fe3bc3495b9190fdc2b52dfdd..e35277eabaa834e6f075679754c1f7534bfc6c63 100644 --- a/app/helpers/projects/project_members_helper.rb +++ b/app/helpers/projects/project_members_helper.rb @@ -2,14 +2,14 @@ module Projects::ProjectMembersHelper def project_members_app_data_json(project, members:, invited:, access_requests:, include_relations:, search:) - { + Gitlab::Json.dump({ user: project_members_list_data(project, members, { param_name: :page, params: { search_groups: nil } }), group: project_group_links_list_data(project, include_relations, search), invite: project_members_list_data(project, invited.nil? ? [] : invited), access_request: project_members_list_data(project, access_requests.nil? ? [] : access_requests), source_id: project.id, can_manage_members: Ability.allowed?(current_user, :admin_project_member, project) - }.to_json + }) end def project_member_header_subtext(project) diff --git a/app/helpers/projects_helper.rb b/app/helpers/projects_helper.rb index 122a0ae5277b5ddac3078d5af7eeb73d0ebab0dd..53c29a3c8b443e1f7f7a69ac3b64af8d575bf93e 100644 --- a/app/helpers/projects_helper.rb +++ b/app/helpers/projects_helper.rb @@ -300,13 +300,15 @@ def error_tracking_setting_project_json return if setting.blank? || setting.project_slug.blank? || setting.organization_slug.blank? - { + data = { sentry_project_id: setting.sentry_project_id, name: setting.project_name, organization_name: setting.organization_name, organization_slug: setting.organization_slug, slug: setting.project_slug - }.to_json + } + + Gitlab::Json.dump(data) end def directory? diff --git a/app/helpers/search_helper.rb b/app/helpers/search_helper.rb index 7741f7141345d9c3ad54443f9bfea3df0778c77b..b3f82e89dfae5f387a249932cf6853a57b2c40f2 100644 --- a/app/helpers/search_helper.rb +++ b/app/helpers/search_helper.rb @@ -440,9 +440,9 @@ def search_navigation end def search_navigation_json - search_navigation.each_with_object({}) do |(key, value), hash| + Gitlab::Json.dump(search_navigation.each_with_object({}) do |(key, value), hash| hash[key] = search_filter_link_json(key, value[:label], value[:data], value[:search]) if value[:condition] - end.to_json + end) end def search_filter_input_options(type, placeholder = _('Search or filter results...')) diff --git a/app/helpers/terms_helper.rb b/app/helpers/terms_helper.rb index 5f321551413be92603708bb58cae4a490b48e7e6..1dc5e4f197477f90b0f64dc38b3d3f26d3c1e748 100644 --- a/app/helpers/terms_helper.rb +++ b/app/helpers/terms_helper.rb @@ -4,7 +4,7 @@ module TermsHelper def terms_data(terms, redirect) redirect_params = { redirect: redirect } if redirect - { + data = { terms: markdown_field(terms, :terms), permissions: { can_accept: can?(current_user, :accept_terms, terms), @@ -15,6 +15,8 @@ def terms_data(terms, redirect) decline: decline_term_path(terms, redirect_params), root: root_path } - }.to_json + } + + Gitlab::Json.dump(data) end end diff --git a/app/helpers/users_helper.rb b/app/helpers/users_helper.rb index 4f345fdeb9cd9cd443dc936464ce4c0bd9b9ba34..d66942c2884603665d8ff7738a88c7bfab2543fe 100644 --- a/app/helpers/users_helper.rb +++ b/app/helpers/users_helper.rb @@ -3,8 +3,8 @@ module UsersHelper def admin_users_data_attributes(users) { - users: Admin::UserSerializer.new.represent(users, { current_user: current_user }).to_json, - paths: admin_users_paths.to_json + users: Gitlab::Json.dump(Admin::UserSerializer.new.represent(users, { current_user: current_user })), + paths: Gitlab::Json.dump(admin_users_paths) } end @@ -163,8 +163,8 @@ def user_display_name(user) def admin_user_actions_data_attributes(user) { - user: Admin::UserEntity.represent(user, { current_user: current_user }).to_json, - paths: admin_users_paths.to_json + user: Gitlab::Json.dump(Admin::UserEntity.represent(user, { current_user: current_user })), + paths: Gitlab::Json.dump(admin_users_paths) } end diff --git a/spec/helpers/users_helper_spec.rb b/spec/helpers/users_helper_spec.rb index c2c78be6a0fba149a56e7fdbca41b42ab8867204..6971ec83ce2dfd92bf814f5cb44d37ca06974eba 100644 --- a/spec/helpers/users_helper_spec.rb +++ b/spec/helpers/users_helper_spec.rb @@ -391,7 +391,7 @@ def stub_profile_permission_allowed(allowed, current_user = nil) expect_next_instance_of(Admin::UserSerializer) do |instance| expect(instance).to receive(:represent).with([user], { current_user: user }).and_return(entity) end - expect(entity).to receive(:to_json).and_return("{\"username\":\"admin\"}") + expect(entity).to receive(:as_json).and_return({ "username" => "admin" }) expect(data[:users]).to eq "{\"username\":\"admin\"}" end