diff options
33 files changed, 358 insertions, 202 deletions
diff --git a/.rubocop.yml b/.rubocop.yml index 73743ebf9a2..693ee0ae847 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -275,8 +275,15 @@ RSpec/BeSuccessMatcher: - 'ee/spec/support/shared_examples/controllers/**/*' - 'spec/support/controllers/**/*' - 'ee/spec/support/controllers/**/*' + Scalability/FileUploads: Enabled: true Include: - 'lib/api/**/*.rb' - 'ee/lib/api/**/*.rb' + +Graphql/Descriptions: + Enabled: true + Include: + - 'app/graphql/**/*' + - 'ee/app/graphql/**/*' diff --git a/app/graphql/resolvers/echo_resolver.rb b/app/graphql/resolvers/echo_resolver.rb index 8076e1784ce..2ce55544254 100644 --- a/app/graphql/resolvers/echo_resolver.rb +++ b/app/graphql/resolvers/echo_resolver.rb @@ -2,7 +2,7 @@ module Resolvers class EchoResolver < BaseResolver - argument :text, GraphQL::STRING_TYPE, required: true + argument :text, GraphQL::STRING_TYPE, required: true # rubocop:disable Graphql/Descriptions description 'Testing endpoint to validate the API with' def resolve(**args) diff --git a/app/graphql/resolvers/issues_resolver.rb b/app/graphql/resolvers/issues_resolver.rb index dd104e83f43..b50186c5a82 100644 --- a/app/graphql/resolvers/issues_resolver.rb +++ b/app/graphql/resolvers/issues_resolver.rb @@ -33,9 +33,9 @@ module Resolvers argument :closed_after, Types::TimeType, required: false, description: "Issues closed after this date" - argument :search, GraphQL::STRING_TYPE, + argument :search, GraphQL::STRING_TYPE, # rubocop:disable Graphql/Descriptions required: false - argument :sort, Types::Sort, + argument :sort, Types::Sort, # rubocop:disable Graphql/Descriptions required: false, default_value: 'created_desc' diff --git a/app/graphql/types/ci/detailed_status_type.rb b/app/graphql/types/ci/detailed_status_type.rb index 5f7d7a934ce..d2847641d91 100644 --- a/app/graphql/types/ci/detailed_status_type.rb +++ b/app/graphql/types/ci/detailed_status_type.rb @@ -6,14 +6,14 @@ module Types class DetailedStatusType < BaseObject graphql_name 'DetailedStatus' - field :group, GraphQL::STRING_TYPE, null: false - field :icon, GraphQL::STRING_TYPE, null: false - field :favicon, GraphQL::STRING_TYPE, null: false - field :details_path, GraphQL::STRING_TYPE, null: false - field :has_details, GraphQL::BOOLEAN_TYPE, null: false, method: :has_details? - field :label, GraphQL::STRING_TYPE, null: false - field :text, GraphQL::STRING_TYPE, null: false - field :tooltip, GraphQL::STRING_TYPE, null: false, method: :status_tooltip + field :group, GraphQL::STRING_TYPE, null: false # rubocop:disable Graphql/Descriptions + field :icon, GraphQL::STRING_TYPE, null: false # rubocop:disable Graphql/Descriptions + field :favicon, GraphQL::STRING_TYPE, null: false # rubocop:disable Graphql/Descriptions + field :details_path, GraphQL::STRING_TYPE, null: false # rubocop:disable Graphql/Descriptions + field :has_details, GraphQL::BOOLEAN_TYPE, null: false, method: :has_details? # rubocop:disable Graphql/Descriptions + field :label, GraphQL::STRING_TYPE, null: false # rubocop:disable Graphql/Descriptions + field :text, GraphQL::STRING_TYPE, null: false # rubocop:disable Graphql/Descriptions + field :tooltip, GraphQL::STRING_TYPE, null: false, method: :status_tooltip # rubocop:disable Graphql/Descriptions end # rubocop: enable Graphql/AuthorizeTypes end diff --git a/app/graphql/types/ci/pipeline_type.rb b/app/graphql/types/ci/pipeline_type.rb index cff81e5670b..dfcfd6211bc 100644 --- a/app/graphql/types/ci/pipeline_type.rb +++ b/app/graphql/types/ci/pipeline_type.rb @@ -9,13 +9,13 @@ module Types expose_permissions Types::PermissionTypes::Ci::Pipeline - field :id, GraphQL::ID_TYPE, null: false - field :iid, GraphQL::STRING_TYPE, null: false + field :id, GraphQL::ID_TYPE, null: false # rubocop:disable Graphql/Descriptions + field :iid, GraphQL::STRING_TYPE, null: false # rubocop:disable Graphql/Descriptions - field :sha, GraphQL::STRING_TYPE, null: false - field :before_sha, GraphQL::STRING_TYPE, null: true - field :status, PipelineStatusEnum, null: false - field :detailed_status, + field :sha, GraphQL::STRING_TYPE, null: false # rubocop:disable Graphql/Descriptions + field :before_sha, GraphQL::STRING_TYPE, null: true # rubocop:disable Graphql/Descriptions + field :status, PipelineStatusEnum, null: false # rubocop:disable Graphql/Descriptions + field :detailed_status, # rubocop:disable Graphql/Descriptions Types::Ci::DetailedStatusType, null: false, resolve: -> (obj, _args, ctx) { obj.detailed_status(ctx[:current_user]) } @@ -27,11 +27,11 @@ module Types GraphQL::FLOAT_TYPE, null: true, description: "Coverage percentage" - field :created_at, Types::TimeType, null: false - field :updated_at, Types::TimeType, null: false - field :started_at, Types::TimeType, null: true - field :finished_at, Types::TimeType, null: true - field :committed_at, Types::TimeType, null: true + field :created_at, Types::TimeType, null: false # rubocop:disable Graphql/Descriptions + field :updated_at, Types::TimeType, null: false # rubocop:disable Graphql/Descriptions + field :started_at, Types::TimeType, null: true # rubocop:disable Graphql/Descriptions + field :finished_at, Types::TimeType, null: true # rubocop:disable Graphql/Descriptions + field :committed_at, Types::TimeType, null: true # rubocop:disable Graphql/Descriptions # TODO: Add triggering user as a type end diff --git a/app/graphql/types/commit_type.rb b/app/graphql/types/commit_type.rb index d73dd73affd..dd2d81adb8b 100644 --- a/app/graphql/types/commit_type.rb +++ b/app/graphql/types/commit_type.rb @@ -8,16 +8,16 @@ module Types present_using CommitPresenter - field :id, type: GraphQL::ID_TYPE, null: false - field :sha, type: GraphQL::STRING_TYPE, null: false - field :title, type: GraphQL::STRING_TYPE, null: true - field :description, type: GraphQL::STRING_TYPE, null: true - field :message, type: GraphQL::STRING_TYPE, null: true - field :authored_date, type: Types::TimeType, null: true - field :web_url, type: GraphQL::STRING_TYPE, null: false + field :id, type: GraphQL::ID_TYPE, null: false # rubocop:disable Graphql/Descriptions + field :sha, type: GraphQL::STRING_TYPE, null: false # rubocop:disable Graphql/Descriptions + field :title, type: GraphQL::STRING_TYPE, null: true # rubocop:disable Graphql/Descriptions + field :description, type: GraphQL::STRING_TYPE, null: true # rubocop:disable Graphql/Descriptions + field :message, type: GraphQL::STRING_TYPE, null: true # rubocop:disable Graphql/Descriptions + field :authored_date, type: Types::TimeType, null: true # rubocop:disable Graphql/Descriptions + field :web_url, type: GraphQL::STRING_TYPE, null: false # rubocop:disable Graphql/Descriptions # models/commit lazy loads the author by email - field :author, type: Types::UserType, null: true + field :author, type: Types::UserType, null: true # rubocop:disable Graphql/Descriptions field :latest_pipeline, type: Types::Ci::PipelineType, diff --git a/app/graphql/types/group_type.rb b/app/graphql/types/group_type.rb index 66b41919914..605c3079e63 100644 --- a/app/graphql/types/group_type.rb +++ b/app/graphql/types/group_type.rb @@ -8,13 +8,13 @@ module Types expose_permissions Types::PermissionTypes::Group - field :web_url, GraphQL::STRING_TYPE, null: false + field :web_url, GraphQL::STRING_TYPE, null: false # rubocop:disable Graphql/Descriptions - field :avatar_url, GraphQL::STRING_TYPE, null: true, resolve: -> (group, args, ctx) do + field :avatar_url, GraphQL::STRING_TYPE, null: true, resolve: -> (group, args, ctx) do # rubocop:disable Graphql/Descriptions group.avatar_url(only_path: false) end - field :parent, GroupType, + field :parent, GroupType, # rubocop:disable Graphql/Descriptions null: true, resolve: -> (obj, _args, _ctx) { Gitlab::Graphql::Loaders::BatchModelLoader.new(Group, obj.parent_id).find } end diff --git a/app/graphql/types/issue_type.rb b/app/graphql/types/issue_type.rb index 8b208cab1df..02842d06c34 100644 --- a/app/graphql/types/issue_type.rb +++ b/app/graphql/types/issue_type.rb @@ -12,48 +12,48 @@ module Types present_using IssuePresenter - field :iid, GraphQL::ID_TYPE, null: false - field :title, GraphQL::STRING_TYPE, null: false + field :iid, GraphQL::ID_TYPE, null: false # rubocop:disable Graphql/Descriptions + field :title, GraphQL::STRING_TYPE, null: false # rubocop:disable Graphql/Descriptions markdown_field :title_html, null: true - field :description, GraphQL::STRING_TYPE, null: true + field :description, GraphQL::STRING_TYPE, null: true # rubocop:disable Graphql/Descriptions markdown_field :description_html, null: true - field :state, IssueStateEnum, null: false + field :state, IssueStateEnum, null: false # rubocop:disable Graphql/Descriptions - field :reference, GraphQL::STRING_TYPE, null: false, method: :to_reference do - argument :full, GraphQL::BOOLEAN_TYPE, required: false, default_value: false + field :reference, GraphQL::STRING_TYPE, null: false, method: :to_reference do # rubocop:disable Graphql/Descriptions + argument :full, GraphQL::BOOLEAN_TYPE, required: false, default_value: false # rubocop:disable Graphql/Descriptions end - field :author, Types::UserType, + field :author, Types::UserType, # rubocop:disable Graphql/Descriptions null: false, resolve: -> (obj, _args, _ctx) { Gitlab::Graphql::Loaders::BatchModelLoader.new(User, obj.author_id).find } # Remove complexity when BatchLoader is used - field :assignees, Types::UserType.connection_type, null: true, complexity: 5 + field :assignees, Types::UserType.connection_type, null: true, complexity: 5 # rubocop:disable Graphql/Descriptions # Remove complexity when BatchLoader is used - field :labels, Types::LabelType.connection_type, null: true, complexity: 5 - field :milestone, Types::MilestoneType, + field :labels, Types::LabelType.connection_type, null: true, complexity: 5 # rubocop:disable Graphql/Descriptions + field :milestone, Types::MilestoneType, # rubocop:disable Graphql/Descriptions null: true, resolve: -> (obj, _args, _ctx) { Gitlab::Graphql::Loaders::BatchModelLoader.new(Milestone, obj.milestone_id).find } - field :due_date, Types::TimeType, null: true - field :confidential, GraphQL::BOOLEAN_TYPE, null: false - field :discussion_locked, GraphQL::BOOLEAN_TYPE, + field :due_date, Types::TimeType, null: true # rubocop:disable Graphql/Descriptions + field :confidential, GraphQL::BOOLEAN_TYPE, null: false # rubocop:disable Graphql/Descriptions + field :discussion_locked, GraphQL::BOOLEAN_TYPE, # rubocop:disable Graphql/Descriptions null: false, resolve: -> (obj, _args, _ctx) { !!obj.discussion_locked } - field :upvotes, GraphQL::INT_TYPE, null: false - field :downvotes, GraphQL::INT_TYPE, null: false - field :user_notes_count, GraphQL::INT_TYPE, null: false - field :web_path, GraphQL::STRING_TYPE, null: false, method: :issue_path - field :web_url, GraphQL::STRING_TYPE, null: false - field :relative_position, GraphQL::INT_TYPE, null: true + field :upvotes, GraphQL::INT_TYPE, null: false # rubocop:disable Graphql/Descriptions + field :downvotes, GraphQL::INT_TYPE, null: false # rubocop:disable Graphql/Descriptions + field :user_notes_count, GraphQL::INT_TYPE, null: false # rubocop:disable Graphql/Descriptions + field :web_path, GraphQL::STRING_TYPE, null: false, method: :issue_path # rubocop:disable Graphql/Descriptions + field :web_url, GraphQL::STRING_TYPE, null: false # rubocop:disable Graphql/Descriptions + field :relative_position, GraphQL::INT_TYPE, null: true # rubocop:disable Graphql/Descriptions - field :closed_at, Types::TimeType, null: true + field :closed_at, Types::TimeType, null: true # rubocop:disable Graphql/Descriptions - field :created_at, Types::TimeType, null: false - field :updated_at, Types::TimeType, null: false + field :created_at, Types::TimeType, null: false # rubocop:disable Graphql/Descriptions + field :updated_at, Types::TimeType, null: false # rubocop:disable Graphql/Descriptions - field :task_completion_status, Types::TaskCompletionStatus, null: false + field :task_completion_status, Types::TaskCompletionStatus, null: false # rubocop:disable Graphql/Descriptions end end diff --git a/app/graphql/types/label_type.rb b/app/graphql/types/label_type.rb index 3aeda2e7953..384a27df563 100644 --- a/app/graphql/types/label_type.rb +++ b/app/graphql/types/label_type.rb @@ -6,10 +6,10 @@ module Types authorize :read_label - field :description, GraphQL::STRING_TYPE, null: true + field :description, GraphQL::STRING_TYPE, null: true # rubocop:disable Graphql/Descriptions markdown_field :description_html, null: true - field :title, GraphQL::STRING_TYPE, null: false - field :color, GraphQL::STRING_TYPE, null: false - field :text_color, GraphQL::STRING_TYPE, null: false + field :title, GraphQL::STRING_TYPE, null: false # rubocop:disable Graphql/Descriptions + field :color, GraphQL::STRING_TYPE, null: false # rubocop:disable Graphql/Descriptions + field :text_color, GraphQL::STRING_TYPE, null: false # rubocop:disable Graphql/Descriptions end end diff --git a/app/graphql/types/merge_request_type.rb b/app/graphql/types/merge_request_type.rb index b8f63a750c5..1baaa33c819 100644 --- a/app/graphql/types/merge_request_type.rb +++ b/app/graphql/types/merge_request_type.rb @@ -12,53 +12,55 @@ module Types present_using MergeRequestPresenter - field :id, GraphQL::ID_TYPE, null: false - field :iid, GraphQL::STRING_TYPE, null: false - field :title, GraphQL::STRING_TYPE, null: false + field :id, GraphQL::ID_TYPE, null: false # rubocop:disable Graphql/Descriptions + field :iid, GraphQL::STRING_TYPE, null: false # rubocop:disable Graphql/Descriptions + field :title, GraphQL::STRING_TYPE, null: false # rubocop:disable Graphql/Descriptions markdown_field :title_html, null: true - field :description, GraphQL::STRING_TYPE, null: true + field :description, GraphQL::STRING_TYPE, null: true # rubocop:disable Graphql/Descriptions markdown_field :description_html, null: true - field :state, MergeRequestStateEnum, null: false - field :created_at, Types::TimeType, null: false - field :updated_at, Types::TimeType, null: false - field :source_project, Types::ProjectType, null: true - field :target_project, Types::ProjectType, null: false - field :diff_refs, Types::DiffRefsType, null: true + field :state, MergeRequestStateEnum, null: false # rubocop:disable Graphql/Descriptions + field :created_at, Types::TimeType, null: false # rubocop:disable Graphql/Descriptions + field :updated_at, Types::TimeType, null: false # rubocop:disable Graphql/Descriptions + field :source_project, Types::ProjectType, null: true # rubocop:disable Graphql/Descriptions + field :target_project, Types::ProjectType, null: false # rubocop:disable Graphql/Descriptions + field :diff_refs, Types::DiffRefsType, null: true # rubocop:disable Graphql/Descriptions # Alias for target_project - field :project, Types::ProjectType, null: false - field :project_id, GraphQL::INT_TYPE, null: false, method: :target_project_id - field :source_project_id, GraphQL::INT_TYPE, null: true - field :target_project_id, GraphQL::INT_TYPE, null: false - field :source_branch, GraphQL::STRING_TYPE, null: false - field :target_branch, GraphQL::STRING_TYPE, null: false - field :work_in_progress, GraphQL::BOOLEAN_TYPE, method: :work_in_progress?, null: false - field :merge_when_pipeline_succeeds, GraphQL::BOOLEAN_TYPE, null: true - field :diff_head_sha, GraphQL::STRING_TYPE, null: true - field :merge_commit_sha, GraphQL::STRING_TYPE, null: true - field :user_notes_count, GraphQL::INT_TYPE, null: true - field :should_remove_source_branch, GraphQL::BOOLEAN_TYPE, method: :should_remove_source_branch?, null: true - field :force_remove_source_branch, GraphQL::BOOLEAN_TYPE, method: :force_remove_source_branch?, null: true - field :merge_status, GraphQL::STRING_TYPE, null: true - field :in_progress_merge_commit_sha, GraphQL::STRING_TYPE, null: true - field :merge_error, GraphQL::STRING_TYPE, null: true - field :allow_collaboration, GraphQL::BOOLEAN_TYPE, null: true - field :should_be_rebased, GraphQL::BOOLEAN_TYPE, method: :should_be_rebased?, null: false - field :rebase_commit_sha, GraphQL::STRING_TYPE, null: true - field :rebase_in_progress, GraphQL::BOOLEAN_TYPE, method: :rebase_in_progress?, null: false, calls_gitaly: true + field :project, Types::ProjectType, null: false # rubocop:disable Graphql/Descriptions + field :project_id, GraphQL::INT_TYPE, null: false, method: :target_project_id # rubocop:disable Graphql/Descriptions + field :source_project_id, GraphQL::INT_TYPE, null: true # rubocop:disable Graphql/Descriptions + field :target_project_id, GraphQL::INT_TYPE, null: false # rubocop:disable Graphql/Descriptions + field :source_branch, GraphQL::STRING_TYPE, null: false # rubocop:disable Graphql/Descriptions + field :target_branch, GraphQL::STRING_TYPE, null: false # rubocop:disable Graphql/Descriptions + field :work_in_progress, GraphQL::BOOLEAN_TYPE, method: :work_in_progress?, null: false # rubocop:disable Graphql/Descriptions + field :merge_when_pipeline_succeeds, GraphQL::BOOLEAN_TYPE, null: true # rubocop:disable Graphql/Descriptions + field :diff_head_sha, GraphQL::STRING_TYPE, null: true # rubocop:disable Graphql/Descriptions + field :merge_commit_sha, GraphQL::STRING_TYPE, null: true # rubocop:disable Graphql/Descriptions + field :user_notes_count, GraphQL::INT_TYPE, null: true # rubocop:disable Graphql/Descriptions + field :should_remove_source_branch, GraphQL::BOOLEAN_TYPE, method: :should_remove_source_branch?, null: true # rubocop:disable Graphql/Descriptions + field :force_remove_source_branch, GraphQL::BOOLEAN_TYPE, method: :force_remove_source_branch?, null: true # rubocop:disable Graphql/Descriptions + field :merge_status, GraphQL::STRING_TYPE, null: true # rubocop:disable Graphql/Descriptions + field :in_progress_merge_commit_sha, GraphQL::STRING_TYPE, null: true # rubocop:disable Graphql/Descriptions + field :merge_error, GraphQL::STRING_TYPE, null: true # rubocop:disable Graphql/Descriptions + field :allow_collaboration, GraphQL::BOOLEAN_TYPE, null: true # rubocop:disable Graphql/Descriptions + field :should_be_rebased, GraphQL::BOOLEAN_TYPE, method: :should_be_rebased?, null: false # rubocop:disable Graphql/Descriptions + field :rebase_commit_sha, GraphQL::STRING_TYPE, null: true # rubocop:disable Graphql/Descriptions + field :rebase_in_progress, GraphQL::BOOLEAN_TYPE, method: :rebase_in_progress?, null: false, calls_gitaly: true # rubocop:disable Graphql/Descriptions + # rubocop:disable Graphql/Descriptions field :merge_commit_message, GraphQL::STRING_TYPE, method: :default_merge_commit_message, null: true, deprecation_reason: "Renamed to defaultMergeCommitMessage" - field :default_merge_commit_message, GraphQL::STRING_TYPE, null: true - field :merge_ongoing, GraphQL::BOOLEAN_TYPE, method: :merge_ongoing?, null: false - field :source_branch_exists, GraphQL::BOOLEAN_TYPE, method: :source_branch_exists?, null: false - field :mergeable_discussions_state, GraphQL::BOOLEAN_TYPE, null: true - field :web_url, GraphQL::STRING_TYPE, null: true - field :upvotes, GraphQL::INT_TYPE, null: false - field :downvotes, GraphQL::INT_TYPE, null: false - field :subscribed, GraphQL::BOOLEAN_TYPE, method: :subscribed?, null: false + # rubocop:enable Graphql/Descriptions + field :default_merge_commit_message, GraphQL::STRING_TYPE, null: true # rubocop:disable Graphql/Descriptions + field :merge_ongoing, GraphQL::BOOLEAN_TYPE, method: :merge_ongoing?, null: false # rubocop:disable Graphql/Descriptions + field :source_branch_exists, GraphQL::BOOLEAN_TYPE, method: :source_branch_exists?, null: false # rubocop:disable Graphql/Descriptions + field :mergeable_discussions_state, GraphQL::BOOLEAN_TYPE, null: true # rubocop:disable Graphql/Descriptions + field :web_url, GraphQL::STRING_TYPE, null: true # rubocop:disable Graphql/Descriptions + field :upvotes, GraphQL::INT_TYPE, null: false # rubocop:disable Graphql/Descriptions + field :downvotes, GraphQL::INT_TYPE, null: false # rubocop:disable Graphql/Descriptions + field :subscribed, GraphQL::BOOLEAN_TYPE, method: :subscribed?, null: false # rubocop:disable Graphql/Descriptions - field :head_pipeline, Types::Ci::PipelineType, null: true, method: :actual_head_pipeline - field :pipelines, Types::Ci::PipelineType.connection_type, + field :head_pipeline, Types::Ci::PipelineType, null: true, method: :actual_head_pipeline # rubocop:disable Graphql/Descriptions + field :pipelines, Types::Ci::PipelineType.connection_type, # rubocop:disable Graphql/Descriptions resolver: Resolvers::MergeRequestPipelinesResolver - field :task_completion_status, Types::TaskCompletionStatus, null: false + field :task_completion_status, Types::TaskCompletionStatus, null: false # rubocop:disable Graphql/Descriptions end end diff --git a/app/graphql/types/metadata_type.rb b/app/graphql/types/metadata_type.rb index 7d7813a7652..bfcb929f5ac 100644 --- a/app/graphql/types/metadata_type.rb +++ b/app/graphql/types/metadata_type.rb @@ -6,7 +6,7 @@ module Types authorize :read_instance_metadata - field :version, GraphQL::STRING_TYPE, null: false - field :revision, GraphQL::STRING_TYPE, null: false + field :version, GraphQL::STRING_TYPE, null: false # rubocop:disable Graphql/Descriptions + field :revision, GraphQL::STRING_TYPE, null: false # rubocop:disable Graphql/Descriptions end end diff --git a/app/graphql/types/milestone_type.rb b/app/graphql/types/milestone_type.rb index 2772fbec86f..78d0a8220ec 100644 --- a/app/graphql/types/milestone_type.rb +++ b/app/graphql/types/milestone_type.rb @@ -6,14 +6,14 @@ module Types authorize :read_milestone - field :description, GraphQL::STRING_TYPE, null: true - field :title, GraphQL::STRING_TYPE, null: false - field :state, GraphQL::STRING_TYPE, null: false + field :description, GraphQL::STRING_TYPE, null: true # rubocop:disable Graphql/Descriptions + field :title, GraphQL::STRING_TYPE, null: false # rubocop:disable Graphql/Descriptions + field :state, GraphQL::STRING_TYPE, null: false # rubocop:disable Graphql/Descriptions - field :due_date, Types::TimeType, null: true - field :start_date, Types::TimeType, null: true + field :due_date, Types::TimeType, null: true # rubocop:disable Graphql/Descriptions + field :start_date, Types::TimeType, null: true # rubocop:disable Graphql/Descriptions - field :created_at, Types::TimeType, null: false - field :updated_at, Types::TimeType, null: false + field :created_at, Types::TimeType, null: false # rubocop:disable Graphql/Descriptions + field :updated_at, Types::TimeType, null: false # rubocop:disable Graphql/Descriptions end end diff --git a/app/graphql/types/namespace_type.rb b/app/graphql/types/namespace_type.rb index 35a97b5ace0..cc1d06b19e1 100644 --- a/app/graphql/types/namespace_type.rb +++ b/app/graphql/types/namespace_type.rb @@ -6,25 +6,25 @@ module Types authorize :read_namespace - field :id, GraphQL::ID_TYPE, null: false + field :id, GraphQL::ID_TYPE, null: false # rubocop:disable Graphql/Descriptions - field :name, GraphQL::STRING_TYPE, null: false - field :path, GraphQL::STRING_TYPE, null: false - field :full_name, GraphQL::STRING_TYPE, null: false - field :full_path, GraphQL::ID_TYPE, null: false + field :name, GraphQL::STRING_TYPE, null: false # rubocop:disable Graphql/Descriptions + field :path, GraphQL::STRING_TYPE, null: false # rubocop:disable Graphql/Descriptions + field :full_name, GraphQL::STRING_TYPE, null: false # rubocop:disable Graphql/Descriptions + field :full_path, GraphQL::ID_TYPE, null: false # rubocop:disable Graphql/Descriptions - field :description, GraphQL::STRING_TYPE, null: true + field :description, GraphQL::STRING_TYPE, null: true # rubocop:disable Graphql/Descriptions markdown_field :description_html, null: true - field :visibility, GraphQL::STRING_TYPE, null: true - field :lfs_enabled, GraphQL::BOOLEAN_TYPE, null: true, method: :lfs_enabled? - field :request_access_enabled, GraphQL::BOOLEAN_TYPE, null: true + field :visibility, GraphQL::STRING_TYPE, null: true # rubocop:disable Graphql/Descriptions + field :lfs_enabled, GraphQL::BOOLEAN_TYPE, null: true, method: :lfs_enabled? # rubocop:disable Graphql/Descriptions + field :request_access_enabled, GraphQL::BOOLEAN_TYPE, null: true # rubocop:disable Graphql/Descriptions field :root_storage_statistics, Types::RootStorageStatisticsType, null: true, description: 'The aggregated storage statistics. Only available for root namespaces', resolve: -> (obj, _args, _ctx) { Gitlab::Graphql::Loaders::BatchRootStorageStatisticsLoader.new(obj.id).find } - field :projects, + field :projects, # rubocop:disable Graphql/Descriptions Types::ProjectType.connection_type, null: false, resolver: ::Resolvers::NamespaceProjectsResolver diff --git a/app/graphql/types/notes/diff_position_type.rb b/app/graphql/types/notes/diff_position_type.rb index 6a0377fbfdf..cab8c750dc0 100644 --- a/app/graphql/types/notes/diff_position_type.rb +++ b/app/graphql/types/notes/diff_position_type.rb @@ -7,7 +7,7 @@ module Types class DiffPositionType < BaseObject graphql_name 'DiffPosition' - field :diff_refs, Types::DiffRefsType, null: false + field :diff_refs, Types::DiffRefsType, null: false # rubocop:disable Graphql/Descriptions field :file_path, GraphQL::STRING_TYPE, null: false, description: "The path of the file that was changed" @@ -15,7 +15,7 @@ module Types description: "The path of the file on the start sha." field :new_path, GraphQL::STRING_TYPE, null: true, description: "The path of the file on the head sha." - field :position_type, Types::Notes::PositionTypeEnum, null: false + field :position_type, Types::Notes::PositionTypeEnum, null: false # rubocop:disable Graphql/Descriptions # Fields for text positions field :old_line, GraphQL::INT_TYPE, null: true, diff --git a/app/graphql/types/notes/discussion_type.rb b/app/graphql/types/notes/discussion_type.rb index a3fb28298f6..ab87f8280ac 100644 --- a/app/graphql/types/notes/discussion_type.rb +++ b/app/graphql/types/notes/discussion_type.rb @@ -7,9 +7,9 @@ module Types authorize :read_note - field :id, GraphQL::ID_TYPE, null: false + field :id, GraphQL::ID_TYPE, null: false # rubocop:disable Graphql/Descriptions field :reply_id, GraphQL::ID_TYPE, null: false, description: 'The ID used to reply to this discussion' - field :created_at, Types::TimeType, null: false + field :created_at, Types::TimeType, null: false # rubocop:disable Graphql/Descriptions field :notes, Types::Notes::NoteType.connection_type, null: false, description: "All notes in the discussion" # The gem we use to generate Global IDs is hard-coded to work with diff --git a/app/graphql/types/notes/note_type.rb b/app/graphql/types/notes/note_type.rb index fe54a45c7dc..4edf6ed90f7 100644 --- a/app/graphql/types/notes/note_type.rb +++ b/app/graphql/types/notes/note_type.rb @@ -9,7 +9,7 @@ module Types expose_permissions Types::PermissionTypes::Note - field :id, GraphQL::ID_TYPE, null: false + field :id, GraphQL::ID_TYPE, null: false # rubocop:disable Graphql/Descriptions field :project, Types::ProjectType, null: true, @@ -37,10 +37,10 @@ module Types markdown_field :body_html, null: true, method: :note - field :created_at, Types::TimeType, null: false - field :updated_at, Types::TimeType, null: false + field :created_at, Types::TimeType, null: false # rubocop:disable Graphql/Descriptions + field :updated_at, Types::TimeType, null: false # rubocop:disable Graphql/Descriptions field :discussion, Types::Notes::DiscussionType, null: true, description: "The discussion this note is a part of" - field :resolvable, GraphQL::BOOLEAN_TYPE, null: false, method: :resolvable? + field :resolvable, GraphQL::BOOLEAN_TYPE, null: false, method: :resolvable? # rubocop:disable Graphql/Descriptions field :resolved_at, Types::TimeType, null: true, description: "The time the discussion was resolved" field :position, Types::Notes::DiffPositionType, null: true, description: "The position of this note on a diff" end diff --git a/app/graphql/types/permission_types/base_permission_type.rb b/app/graphql/types/permission_types/base_permission_type.rb index 26a71e2bfbb..73049ebed7b 100644 --- a/app/graphql/types/permission_types/base_permission_type.rb +++ b/app/graphql/types/permission_types/base_permission_type.rb @@ -28,7 +28,7 @@ module Types description: "Whether or not a user can perform `#{name}` on this resource", null: false) - field(**kword_args) + field(**kword_args) # rubocop:disable Graphql/Descriptions end def self.resolving_keywords?(arguments) diff --git a/app/graphql/types/project_statistics_type.rb b/app/graphql/types/project_statistics_type.rb index 4000c6db280..5045471a75b 100644 --- a/app/graphql/types/project_statistics_type.rb +++ b/app/graphql/types/project_statistics_type.rb @@ -6,13 +6,13 @@ module Types authorize :read_statistics - field :commit_count, GraphQL::INT_TYPE, null: false + field :commit_count, GraphQL::INT_TYPE, null: false # rubocop:disable Graphql/Descriptions - field :storage_size, GraphQL::INT_TYPE, null: false - field :repository_size, GraphQL::INT_TYPE, null: false - field :lfs_objects_size, GraphQL::INT_TYPE, null: false - field :build_artifacts_size, GraphQL::INT_TYPE, null: false - field :packages_size, GraphQL::INT_TYPE, null: false - field :wiki_size, GraphQL::INT_TYPE, null: true + field :storage_size, GraphQL::INT_TYPE, null: false # rubocop:disable Graphql/Descriptions + field :repository_size, GraphQL::INT_TYPE, null: false # rubocop:disable Graphql/Descriptions + field :lfs_objects_size, GraphQL::INT_TYPE, null: false # rubocop:disable Graphql/Descriptions + field :build_artifacts_size, GraphQL::INT_TYPE, null: false # rubocop:disable Graphql/Descriptions + field :packages_size, GraphQL::INT_TYPE, null: false # rubocop:disable Graphql/Descriptions + field :wiki_size, GraphQL::INT_TYPE, null: true # rubocop:disable Graphql/Descriptions end end diff --git a/app/graphql/types/project_type.rb b/app/graphql/types/project_type.rb index 13be71c26ee..7184cf42284 100644 --- a/app/graphql/types/project_type.rb +++ b/app/graphql/types/project_type.rb @@ -8,95 +8,95 @@ module Types expose_permissions Types::PermissionTypes::Project - field :id, GraphQL::ID_TYPE, null: false + field :id, GraphQL::ID_TYPE, null: false # rubocop:disable Graphql/Descriptions - field :full_path, GraphQL::ID_TYPE, null: false - field :path, GraphQL::STRING_TYPE, null: false + field :full_path, GraphQL::ID_TYPE, null: false # rubocop:disable Graphql/Descriptions + field :path, GraphQL::STRING_TYPE, null: false # rubocop:disable Graphql/Descriptions - field :name_with_namespace, GraphQL::STRING_TYPE, null: false - field :name, GraphQL::STRING_TYPE, null: false + field :name_with_namespace, GraphQL::STRING_TYPE, null: false # rubocop:disable Graphql/Descriptions + field :name, GraphQL::STRING_TYPE, null: false # rubocop:disable Graphql/Descriptions - field :description, GraphQL::STRING_TYPE, null: true + field :description, GraphQL::STRING_TYPE, null: true # rubocop:disable Graphql/Descriptions markdown_field :description_html, null: true - field :tag_list, GraphQL::STRING_TYPE, null: true + field :tag_list, GraphQL::STRING_TYPE, null: true # rubocop:disable Graphql/Descriptions - field :ssh_url_to_repo, GraphQL::STRING_TYPE, null: true - field :http_url_to_repo, GraphQL::STRING_TYPE, null: true - field :web_url, GraphQL::STRING_TYPE, null: true + field :ssh_url_to_repo, GraphQL::STRING_TYPE, null: true # rubocop:disable Graphql/Descriptions + field :http_url_to_repo, GraphQL::STRING_TYPE, null: true # rubocop:disable Graphql/Descriptions + field :web_url, GraphQL::STRING_TYPE, null: true # rubocop:disable Graphql/Descriptions - field :star_count, GraphQL::INT_TYPE, null: false - field :forks_count, GraphQL::INT_TYPE, null: false, calls_gitaly: true # 4 times + field :star_count, GraphQL::INT_TYPE, null: false # rubocop:disable Graphql/Descriptions + field :forks_count, GraphQL::INT_TYPE, null: false, calls_gitaly: true # 4 times # rubocop:disable Graphql/Descriptions - field :created_at, Types::TimeType, null: true - field :last_activity_at, Types::TimeType, null: true + field :created_at, Types::TimeType, null: true # rubocop:disable Graphql/Descriptions + field :last_activity_at, Types::TimeType, null: true # rubocop:disable Graphql/Descriptions - field :archived, GraphQL::BOOLEAN_TYPE, null: true + field :archived, GraphQL::BOOLEAN_TYPE, null: true # rubocop:disable Graphql/Descriptions - field :visibility, GraphQL::STRING_TYPE, null: true + field :visibility, GraphQL::STRING_TYPE, null: true # rubocop:disable Graphql/Descriptions - field :container_registry_enabled, GraphQL::BOOLEAN_TYPE, null: true - field :shared_runners_enabled, GraphQL::BOOLEAN_TYPE, null: true - field :lfs_enabled, GraphQL::BOOLEAN_TYPE, null: true - field :merge_requests_ff_only_enabled, GraphQL::BOOLEAN_TYPE, null: true + field :container_registry_enabled, GraphQL::BOOLEAN_TYPE, null: true # rubocop:disable Graphql/Descriptions + field :shared_runners_enabled, GraphQL::BOOLEAN_TYPE, null: true # rubocop:disable Graphql/Descriptions + field :lfs_enabled, GraphQL::BOOLEAN_TYPE, null: true # rubocop:disable Graphql/Descriptions + field :merge_requests_ff_only_enabled, GraphQL::BOOLEAN_TYPE, null: true # rubocop:disable Graphql/Descriptions - field :avatar_url, GraphQL::STRING_TYPE, null: true, calls_gitaly: true, resolve: -> (project, args, ctx) do + field :avatar_url, GraphQL::STRING_TYPE, null: true, calls_gitaly: true, resolve: -> (project, args, ctx) do # rubocop:disable Graphql/Descriptions project.avatar_url(only_path: false) end %i[issues merge_requests wiki snippets].each do |feature| - field "#{feature}_enabled", GraphQL::BOOLEAN_TYPE, null: true, resolve: -> (project, args, ctx) do + field "#{feature}_enabled", GraphQL::BOOLEAN_TYPE, null: true, resolve: -> (project, args, ctx) do # rubocop:disable Graphql/Descriptions project.feature_available?(feature, ctx[:current_user]) end end - field :jobs_enabled, GraphQL::BOOLEAN_TYPE, null: true, resolve: -> (project, args, ctx) do + field :jobs_enabled, GraphQL::BOOLEAN_TYPE, null: true, resolve: -> (project, args, ctx) do # rubocop:disable Graphql/Descriptions project.feature_available?(:builds, ctx[:current_user]) end - field :public_jobs, GraphQL::BOOLEAN_TYPE, method: :public_builds, null: true + field :public_jobs, GraphQL::BOOLEAN_TYPE, method: :public_builds, null: true # rubocop:disable Graphql/Descriptions - field :open_issues_count, GraphQL::INT_TYPE, null: true, resolve: -> (project, args, ctx) do + field :open_issues_count, GraphQL::INT_TYPE, null: true, resolve: -> (project, args, ctx) do # rubocop:disable Graphql/Descriptions project.open_issues_count if project.feature_available?(:issues, ctx[:current_user]) end - field :import_status, GraphQL::STRING_TYPE, null: true + field :import_status, GraphQL::STRING_TYPE, null: true # rubocop:disable Graphql/Descriptions - field :only_allow_merge_if_pipeline_succeeds, GraphQL::BOOLEAN_TYPE, null: true - field :request_access_enabled, GraphQL::BOOLEAN_TYPE, null: true - field :only_allow_merge_if_all_discussions_are_resolved, GraphQL::BOOLEAN_TYPE, null: true - field :printing_merge_request_link_enabled, GraphQL::BOOLEAN_TYPE, null: true + field :only_allow_merge_if_pipeline_succeeds, GraphQL::BOOLEAN_TYPE, null: true # rubocop:disable Graphql/Descriptions + field :request_access_enabled, GraphQL::BOOLEAN_TYPE, null: true # rubocop:disable Graphql/Descriptions + field :only_allow_merge_if_all_discussions_are_resolved, GraphQL::BOOLEAN_TYPE, null: true # rubocop:disable Graphql/Descriptions + field :printing_merge_request_link_enabled, GraphQL::BOOLEAN_TYPE, null: true # rubocop:disable Graphql/Descriptions - field :namespace, Types::NamespaceType, null: true - field :group, Types::GroupType, null: true + field :namespace, Types::NamespaceType, null: true # rubocop:disable Graphql/Descriptions + field :group, Types::GroupType, null: true # rubocop:disable Graphql/Descriptions - field :statistics, Types::ProjectStatisticsType, + field :statistics, Types::ProjectStatisticsType, # rubocop:disable Graphql/Descriptions null: true, resolve: -> (obj, _args, _ctx) { Gitlab::Graphql::Loaders::BatchProjectStatisticsLoader.new(obj.id).find } - field :repository, Types::RepositoryType, null: true + field :repository, Types::RepositoryType, null: true # rubocop:disable Graphql/Descriptions - field :merge_requests, + field :merge_requests, # rubocop:disable Graphql/Descriptions Types::MergeRequestType.connection_type, null: true, resolver: Resolvers::MergeRequestsResolver - field :merge_request, + field :merge_request, # rubocop:disable Graphql/Descriptions Types::MergeRequestType, null: true, resolver: Resolvers::MergeRequestsResolver.single - field :issues, + field :issues, # rubocop:disable Graphql/Descriptions Types::IssueType.connection_type, null: true, resolver: Resolvers::IssuesResolver - field :issue, + field :issue, # rubocop:disable Graphql/Descriptions Types::IssueType, null: true, resolver: Resolvers::IssuesResolver.single - field :pipelines, + field :pipelines, # rubocop:disable Graphql/Descriptions Types::Ci::PipelineType.connection_type, null: true, resolver: Resolvers::ProjectPipelinesResolver diff --git a/app/graphql/types/query_type.rb b/app/graphql/types/query_type.rb index c686300b25d..bbf94fb92df 100644 --- a/app/graphql/types/query_type.rb +++ b/app/graphql/types/query_type.rb @@ -24,6 +24,6 @@ module Types resolver: Resolvers::MetadataResolver, description: 'Metadata about GitLab' - field :echo, GraphQL::STRING_TYPE, null: false, resolver: Resolvers::EchoResolver + field :echo, GraphQL::STRING_TYPE, null: false, resolver: Resolvers::EchoResolver # rubocop:disable Graphql/Descriptions end end diff --git a/app/graphql/types/repository_type.rb b/app/graphql/types/repository_type.rb index b024eca61fc..9ecd336b41d 100644 --- a/app/graphql/types/repository_type.rb +++ b/app/graphql/types/repository_type.rb @@ -6,9 +6,9 @@ module Types authorize :download_code - field :root_ref, GraphQL::STRING_TYPE, null: true, calls_gitaly: true - field :empty, GraphQL::BOOLEAN_TYPE, null: false, method: :empty?, calls_gitaly: true - field :exists, GraphQL::BOOLEAN_TYPE, null: false, method: :exists? - field :tree, Types::Tree::TreeType, null: true, resolver: Resolvers::TreeResolver, calls_gitaly: true + field :root_ref, GraphQL::STRING_TYPE, null: true, calls_gitaly: true # rubocop:disable Graphql/Descriptions + field :empty, GraphQL::BOOLEAN_TYPE, null: false, method: :empty?, calls_gitaly: true # rubocop:disable Graphql/Descriptions + field :exists, GraphQL::BOOLEAN_TYPE, null: false, method: :exists? # rubocop:disable Graphql/Descriptions + field :tree, Types::Tree::TreeType, null: true, resolver: Resolvers::TreeResolver, calls_gitaly: true # rubocop:disable Graphql/Descriptions end end diff --git a/app/graphql/types/task_completion_status.rb b/app/graphql/types/task_completion_status.rb index ac128481ac4..0aa8fc60a7c 100644 --- a/app/graphql/types/task_completion_status.rb +++ b/app/graphql/types/task_completion_status.rb @@ -8,8 +8,8 @@ module Types graphql_name 'TaskCompletionStatus' description 'Completion status of tasks' - field :count, GraphQL::INT_TYPE, null: false - field :completed_count, GraphQL::INT_TYPE, null: false + field :count, GraphQL::INT_TYPE, null: false # rubocop:disable Graphql/Descriptions + field :completed_count, GraphQL::INT_TYPE, null: false # rubocop:disable Graphql/Descriptions end # rubocop: enable Graphql/AuthorizeTypes end diff --git a/app/graphql/types/tree/blob_type.rb b/app/graphql/types/tree/blob_type.rb index 9497e378dc0..0886a0ba98e 100644 --- a/app/graphql/types/tree/blob_type.rb +++ b/app/graphql/types/tree/blob_type.rb @@ -10,8 +10,8 @@ module Types graphql_name 'Blob' - field :web_url, GraphQL::STRING_TYPE, null: true - field :lfs_oid, GraphQL::STRING_TYPE, null: true, resolve: -> (blob, args, ctx) do + field :web_url, GraphQL::STRING_TYPE, null: true # rubocop:disable Graphql/Descriptions + field :lfs_oid, GraphQL::STRING_TYPE, null: true, resolve: -> (blob, args, ctx) do # rubocop:disable Graphql/Descriptions Gitlab::Graphql::Loaders::BatchLfsOidLoader.new(blob.repository, blob.id).find end # rubocop: enable Graphql/AuthorizeTypes diff --git a/app/graphql/types/tree/entry_type.rb b/app/graphql/types/tree/entry_type.rb index d8e8642ddb8..10c2ad8815e 100644 --- a/app/graphql/types/tree/entry_type.rb +++ b/app/graphql/types/tree/entry_type.rb @@ -4,11 +4,11 @@ module Types module EntryType include Types::BaseInterface - field :id, GraphQL::ID_TYPE, null: false - field :name, GraphQL::STRING_TYPE, null: false - field :type, Tree::TypeEnum, null: false - field :path, GraphQL::STRING_TYPE, null: false - field :flat_path, GraphQL::STRING_TYPE, null: false + field :id, GraphQL::ID_TYPE, null: false # rubocop:disable Graphql/Descriptions + field :name, GraphQL::STRING_TYPE, null: false # rubocop:disable Graphql/Descriptions + field :type, Tree::TypeEnum, null: false # rubocop:disable Graphql/Descriptions + field :path, GraphQL::STRING_TYPE, null: false # rubocop:disable Graphql/Descriptions + field :flat_path, GraphQL::STRING_TYPE, null: false # rubocop:disable Graphql/Descriptions end end end diff --git a/app/graphql/types/tree/submodule_type.rb b/app/graphql/types/tree/submodule_type.rb index 2b47e5c0161..d8e2ab4dd68 100644 --- a/app/graphql/types/tree/submodule_type.rb +++ b/app/graphql/types/tree/submodule_type.rb @@ -8,8 +8,8 @@ module Types graphql_name 'Submodule' - field :web_url, type: GraphQL::STRING_TYPE, null: true - field :tree_url, type: GraphQL::STRING_TYPE, null: true + field :web_url, type: GraphQL::STRING_TYPE, null: true # rubocop:disable Graphql/Descriptions + field :tree_url, type: GraphQL::STRING_TYPE, null: true # rubocop:disable Graphql/Descriptions end # rubocop: enable Graphql/AuthorizeTypes end diff --git a/app/graphql/types/tree/tree_entry_type.rb b/app/graphql/types/tree/tree_entry_type.rb index d7faa633706..904c7dfb795 100644 --- a/app/graphql/types/tree/tree_entry_type.rb +++ b/app/graphql/types/tree/tree_entry_type.rb @@ -11,7 +11,7 @@ module Types graphql_name 'TreeEntry' description 'Represents a directory' - field :web_url, GraphQL::STRING_TYPE, null: true + field :web_url, GraphQL::STRING_TYPE, null: true # rubocop:disable Graphql/Descriptions end # rubocop: enable Graphql/AuthorizeTypes end diff --git a/app/graphql/types/tree/tree_type.rb b/app/graphql/types/tree/tree_type.rb index 99f2a6c0235..b967cf3a247 100644 --- a/app/graphql/types/tree/tree_type.rb +++ b/app/graphql/types/tree/tree_type.rb @@ -7,19 +7,21 @@ module Types graphql_name 'Tree' # Complexity 10 as it triggers a Gitaly call on each render - field :last_commit, Types::CommitType, null: true, complexity: 10, calls_gitaly: true, resolve: -> (tree, args, ctx) do + field :last_commit, Types::CommitType, null: true, complexity: 10, calls_gitaly: true, resolve: -> (tree, args, ctx) do # rubocop:disable Graphql/Descriptions tree.repository.last_commit_for_path(tree.sha, tree.path) end - field :trees, Types::Tree::TreeEntryType.connection_type, null: false, resolve: -> (obj, args, ctx) do + field :trees, Types::Tree::TreeEntryType.connection_type, null: false, resolve: -> (obj, args, ctx) do # rubocop:disable Graphql/Descriptions Gitlab::Graphql::Representation::TreeEntry.decorate(obj.trees, obj.repository) end + # rubocop:disable Graphql/Descriptions field :submodules, Types::Tree::SubmoduleType.connection_type, null: false, calls_gitaly: true, resolve: -> (obj, args, ctx) do Gitlab::Graphql::Representation::SubmoduleTreeEntry.decorate(obj.submodules, obj) end + # rubocop:enable Graphql/Descriptions - field :blobs, Types::Tree::BlobType.connection_type, null: false, calls_gitaly: true, resolve: -> (obj, args, ctx) do + field :blobs, Types::Tree::BlobType.connection_type, null: false, calls_gitaly: true, resolve: -> (obj, args, ctx) do # rubocop:disable Graphql/Descriptions Gitlab::Graphql::Representation::TreeEntry.decorate(obj.blobs, obj.repository) end # rubocop: enable Graphql/AuthorizeTypes diff --git a/app/graphql/types/user_type.rb b/app/graphql/types/user_type.rb index 6b53554314b..9f7d2a171d6 100644 --- a/app/graphql/types/user_type.rb +++ b/app/graphql/types/user_type.rb @@ -8,9 +8,9 @@ module Types present_using UserPresenter - field :name, GraphQL::STRING_TYPE, null: false - field :username, GraphQL::STRING_TYPE, null: false - field :avatar_url, GraphQL::STRING_TYPE, null: false - field :web_url, GraphQL::STRING_TYPE, null: false + field :name, GraphQL::STRING_TYPE, null: false # rubocop:disable Graphql/Descriptions + field :username, GraphQL::STRING_TYPE, null: false # rubocop:disable Graphql/Descriptions + field :avatar_url, GraphQL::STRING_TYPE, null: false # rubocop:disable Graphql/Descriptions + field :web_url, GraphQL::STRING_TYPE, null: false # rubocop:disable Graphql/Descriptions end end diff --git a/rubocop/cop/graphql/authorize_types.rb b/rubocop/cop/graphql/authorize_types.rb index cd8bdbaee59..69c23be0252 100644 --- a/rubocop/cop/graphql/authorize_types.rb +++ b/rubocop/cop/graphql/authorize_types.rb @@ -7,12 +7,12 @@ module RuboCop MSG = 'Add an `authorize :ability` call to the type: '\ 'https://docs.gitlab.com/ee/development/api_graphql_styleguide.html#type-authorization' - TYPES_DIR = 'app/graphql/types' - # We want to exclude our own basetypes and scalars WHITELISTED_TYPES = %w[BaseEnum BaseScalar BasePermissionType MutationType QueryType GraphQL::Schema BaseUnion].freeze + TYPES_DIR = 'app/graphql/types' + def_node_search :authorize?, <<~PATTERN (send nil? :authorize ...) PATTERN @@ -44,7 +44,7 @@ module RuboCop end def superclass_constant(class_node) - # First one is the class name itself, second is it's superclass + # First one is the class name itself, second is its superclass _class_constant, *others = class_node.descendants others.find { |node| node.const_type? && node&.const_name != 'Types' } diff --git a/rubocop/cop/graphql/descriptions.rb b/rubocop/cop/graphql/descriptions.rb new file mode 100644 index 00000000000..b4e00dfe336 --- /dev/null +++ b/rubocop/cop/graphql/descriptions.rb @@ -0,0 +1,56 @@ +# frozen_string_literal: true + +# This cop checks for missing GraphQL field descriptions. +# +# @example +# +# # bad +# class AwfulClass +# field :some_field, GraphQL::STRING_TYPE +# end +# +# class TerribleClass +# argument :some_argument, GraphQL::STRING_TYPE +# end +# +# # good +# class GreatClass +# argument :some_field, +# GraphQL::STRING_TYPE, +# description: "Well described - a superb description" +# +# field :some_field, +# GraphQL::STRING_TYPE, +# description: "A thorough and compelling description" +# end + +module RuboCop + module Cop + module Graphql + class Descriptions < RuboCop::Cop::Cop + MSG = 'Please add a `description` property.' + + # ability_field and permission_field set a default description. + def_node_matcher :fields, <<~PATTERN + (send nil? :field $...) + PATTERN + + def_node_matcher :arguments, <<~PATTERN + (send nil? :argument $...) + PATTERN + + def_node_matcher :has_description?, <<~PATTERN + (hash <(pair (sym :description) _) ...>) + PATTERN + + def on_send(node) + matches = fields(node) || arguments(node) + + return if matches.nil? + + add_offense(node, location: :expression) unless has_description?(matches.last) + end + end + end + end +end diff --git a/rubocop/graphql_helpers.rb b/rubocop/graphql_helpers.rb new file mode 100644 index 00000000000..eef83df0112 --- /dev/null +++ b/rubocop/graphql_helpers.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +module RuboCop + module GraphqlHelpers + TYPES_DIR = 'app/graphql/types' + + def in_type?(node) + path = node.location.expression.source_buffer.name + + path.include?(TYPES_DIR) + end + end +end diff --git a/rubocop/rubocop.rb b/rubocop/rubocop.rb index 9d97aa86bf6..29864777f59 100644 --- a/rubocop/rubocop.rb +++ b/rubocop/rubocop.rb @@ -49,3 +49,4 @@ require_relative 'cop/code_reuse/active_record' require_relative 'cop/group_public_or_visible_to_user' require_relative 'cop/inject_enterprise_edition_module' require_relative 'cop/graphql/authorize_types' +require_relative 'cop/graphql/descriptions' diff --git a/spec/rubocop/cop/graphql/descriptions_spec.rb b/spec/rubocop/cop/graphql/descriptions_spec.rb new file mode 100644 index 00000000000..8cfdc05172d --- /dev/null +++ b/spec/rubocop/cop/graphql/descriptions_spec.rb @@ -0,0 +1,75 @@ +# frozen_string_literal: true + +require 'fast_spec_helper' +require 'rubocop' +require 'rubocop/rspec/support' +require_relative '../../../../rubocop/cop/graphql/descriptions' + +describe RuboCop::Cop::Graphql::Descriptions do + include RuboCop::RSpec::ExpectOffense + include CopHelper + + subject(:cop) { described_class.new } + + context 'fields' do + it 'adds an offense when there is no field description' do + inspect_source(<<~TYPE) + module Types + class FakeType < BaseObject + field :a_thing, + GraphQL::STRING_TYPE, + null: false + end + end + TYPE + + expect(cop.offenses.size).to eq 1 + end + + it 'does not add an offense for fields with a description' do + expect_no_offenses(<<~TYPE.strip) + module Types + class FakeType < BaseObject + graphql_name 'FakeTypeName' + + argument :a_thing, + GraphQL::STRING_TYPE, + null: false, + description: 'A descriptive description' + end + end + TYPE + end + end + + context 'arguments' do + it 'adds an offense when there is no argument description' do + inspect_source(<<~TYPE) + module Types + class FakeType < BaseObject + argument :a_thing, + GraphQL::STRING_TYPE, + null: false + end + end + TYPE + + expect(cop.offenses.size).to eq 1 + end + + it 'does not add an offense for arguments with a description' do + expect_no_offenses(<<~TYPE.strip) + module Types + class FakeType < BaseObject + graphql_name 'FakeTypeName' + + argument :a_thing, + GraphQL::STRING_TYPE, + null: false, + description: 'Behold! A description' + end + end + TYPE + end + end +end |