defmodule GitHub.Checks do @moduledoc """ Provides API endpoints related to checks """ @default_client GitHub.Client @doc """ Create a check run ## Resources * [API method documentation](https://docs.github.com/rest/reference/checks#create-a-check-run) """ @spec create(String.t(), String.t(), map, keyword) :: {:ok, GitHub.Check.Run.t()} | {:error, GitHub.Error.t()} def create(owner, repo, body, opts \\ []) do client = opts[:client] || @default_client client.request(%{ args: [owner: owner, repo: repo], call: {GitHub.Checks, :create}, url: "/repos/#{owner}/#{repo}/check-runs", body: body, method: :post, request: [{"application/json", :map}], response: [{201, {GitHub.Check.Run, :t}}], opts: opts }) end @doc """ Create a check suite ## Resources * [API method documentation](https://docs.github.com/rest/reference/checks#create-a-check-suite) """ @spec create_suite(String.t(), String.t(), map, keyword) :: {:ok, GitHub.Check.Suite.t()} | {:error, GitHub.Error.t()} def create_suite(owner, repo, body, opts \\ []) do client = opts[:client] || @default_client client.request(%{ args: [owner: owner, repo: repo], call: {GitHub.Checks, :create_suite}, url: "/repos/#{owner}/#{repo}/check-suites", body: body, method: :post, request: [{"application/json", :map}], response: [{200, {GitHub.Check.Suite, :t}}, {201, {GitHub.Check.Suite, :t}}], opts: opts }) end @doc """ Get a check run ## Resources * [API method documentation](https://docs.github.com/rest/reference/checks#get-a-check-run) """ @spec get(String.t(), String.t(), integer, keyword) :: {:ok, GitHub.Check.Run.t()} | {:error, GitHub.Error.t()} def get(owner, repo, check_run_id, opts \\ []) do client = opts[:client] || @default_client client.request(%{ args: [owner: owner, repo: repo, check_run_id: check_run_id], call: {GitHub.Checks, :get}, url: "/repos/#{owner}/#{repo}/check-runs/#{check_run_id}", method: :get, response: [{200, {GitHub.Check.Run, :t}}], opts: opts }) end @doc """ Get a check suite ## Resources * [API method documentation](https://docs.github.com/rest/reference/checks#get-a-check-suite) """ @spec get_suite(String.t(), String.t(), integer, keyword) :: {:ok, GitHub.Check.Suite.t()} | {:error, GitHub.Error.t()} def get_suite(owner, repo, check_suite_id, opts \\ []) do client = opts[:client] || @default_client client.request(%{ args: [owner: owner, repo: repo, check_suite_id: check_suite_id], call: {GitHub.Checks, :get_suite}, url: "/repos/#{owner}/#{repo}/check-suites/#{check_suite_id}", method: :get, response: [{200, {GitHub.Check.Suite, :t}}], opts: opts }) end @doc """ List check run annotations ## Options * `per_page` (integer): The number of results per page (max 100). * `page` (integer): Page number of the results to fetch. ## Resources * [API method documentation](https://docs.github.com/rest/reference/checks#list-check-run-annotations) """ @spec list_annotations(String.t(), String.t(), integer, keyword) :: {:ok, [GitHub.Check.Annotation.t()]} | {:error, GitHub.Error.t()} def list_annotations(owner, repo, check_run_id, opts \\ []) do client = opts[:client] || @default_client query = Keyword.take(opts, [:page, :per_page]) client.request(%{ args: [owner: owner, repo: repo, check_run_id: check_run_id], call: {GitHub.Checks, :list_annotations}, url: "/repos/#{owner}/#{repo}/check-runs/#{check_run_id}/annotations", method: :get, query: query, response: [{200, {:array, {GitHub.Check.Annotation, :t}}}], opts: opts }) end @doc """ List check runs for a Git reference ## Options * `check_name` (String.t()): Returns check runs with the specified `name`. * `status` (String.t()): Returns check runs with the specified `status`. * `filter` (String.t()): Filters check runs by their `completed_at` timestamp. `latest` returns the most recent check runs. * `per_page` (integer): The number of results per page (max 100). * `page` (integer): Page number of the results to fetch. * `app_id` (integer): ## Resources * [API method documentation](https://docs.github.com/rest/reference/checks#list-check-runs-for-a-git-reference) """ @spec list_for_ref(String.t(), String.t(), String.t(), keyword) :: {:ok, map} | {:error, GitHub.Error.t()} def list_for_ref(owner, repo, ref, opts \\ []) do client = opts[:client] || @default_client query = Keyword.take(opts, [:app_id, :check_name, :filter, :page, :per_page, :status]) client.request(%{ args: [owner: owner, repo: repo, ref: ref], call: {GitHub.Checks, :list_for_ref}, url: "/repos/#{owner}/#{repo}/commits/#{ref}/check-runs", method: :get, query: query, response: [{200, :map}], opts: opts }) end @doc """ List check runs in a check suite ## Options * `check_name` (String.t()): Returns check runs with the specified `name`. * `status` (String.t()): Returns check runs with the specified `status`. * `filter` (String.t()): Filters check runs by their `completed_at` timestamp. `latest` returns the most recent check runs. * `per_page` (integer): The number of results per page (max 100). * `page` (integer): Page number of the results to fetch. ## Resources * [API method documentation](https://docs.github.com/rest/reference/checks#list-check-runs-in-a-check-suite) """ @spec list_for_suite(String.t(), String.t(), integer, keyword) :: {:ok, map} | {:error, GitHub.Error.t()} def list_for_suite(owner, repo, check_suite_id, opts \\ []) do client = opts[:client] || @default_client query = Keyword.take(opts, [:check_name, :filter, :page, :per_page, :status]) client.request(%{ args: [owner: owner, repo: repo, check_suite_id: check_suite_id], call: {GitHub.Checks, :list_for_suite}, url: "/repos/#{owner}/#{repo}/check-suites/#{check_suite_id}/check-runs", method: :get, query: query, response: [{200, :map}], opts: opts }) end @doc """ List check suites for a Git reference ## Options * `app_id` (integer): Filters check suites by GitHub App `id`. * `check_name` (String.t()): Returns check runs with the specified `name`. * `per_page` (integer): The number of results per page (max 100). * `page` (integer): Page number of the results to fetch. ## Resources * [API method documentation](https://docs.github.com/rest/reference/checks#list-check-suites-for-a-git-reference) """ @spec list_suites_for_ref(String.t(), String.t(), String.t(), keyword) :: {:ok, map} | {:error, GitHub.Error.t()} def list_suites_for_ref(owner, repo, ref, opts \\ []) do client = opts[:client] || @default_client query = Keyword.take(opts, [:app_id, :check_name, :page, :per_page]) client.request(%{ args: [owner: owner, repo: repo, ref: ref], call: {GitHub.Checks, :list_suites_for_ref}, url: "/repos/#{owner}/#{repo}/commits/#{ref}/check-suites", method: :get, query: query, response: [{200, :map}], opts: opts }) end @doc """ Rerequest a check run ## Resources * [API method documentation](https://docs.github.com/rest/reference/checks#rerequest-a-check-run) """ @spec rerequest_run(String.t(), String.t(), integer, keyword) :: {:ok, GitHub.EmptyObject.t()} | {:error, GitHub.Error.t()} def rerequest_run(owner, repo, check_run_id, opts \\ []) do client = opts[:client] || @default_client client.request(%{ args: [owner: owner, repo: repo, check_run_id: check_run_id], call: {GitHub.Checks, :rerequest_run}, url: "/repos/#{owner}/#{repo}/check-runs/#{check_run_id}/rerequest", method: :post, response: [ {201, {GitHub.EmptyObject, :t}}, {403, {GitHub.BasicError, :t}}, {404, {GitHub.BasicError, :t}}, {422, {GitHub.BasicError, :t}} ], opts: opts }) end @doc """ Rerequest a check suite ## Resources * [API method documentation](https://docs.github.com/rest/reference/checks#rerequest-a-check-suite) """ @spec rerequest_suite(String.t(), String.t(), integer, keyword) :: {:ok, GitHub.EmptyObject.t()} | {:error, GitHub.Error.t()} def rerequest_suite(owner, repo, check_suite_id, opts \\ []) do client = opts[:client] || @default_client client.request(%{ args: [owner: owner, repo: repo, check_suite_id: check_suite_id], call: {GitHub.Checks, :rerequest_suite}, url: "/repos/#{owner}/#{repo}/check-suites/#{check_suite_id}/rerequest", method: :post, response: [{201, {GitHub.EmptyObject, :t}}], opts: opts }) end @doc """ Update repository preferences for check suites ## Resources * [API method documentation](https://docs.github.com/rest/reference/checks#update-repository-preferences-for-check-suites) """ @spec set_suites_preferences(String.t(), String.t(), map, keyword) :: {:ok, GitHub.Check.SuitePreference.t()} | {:error, GitHub.Error.t()} def set_suites_preferences(owner, repo, body, opts \\ []) do client = opts[:client] || @default_client client.request(%{ args: [owner: owner, repo: repo], call: {GitHub.Checks, :set_suites_preferences}, url: "/repos/#{owner}/#{repo}/check-suites/preferences", body: body, method: :patch, request: [{"application/json", :map}], response: [{200, {GitHub.Check.SuitePreference, :t}}], opts: opts }) end @doc """ Update a check run ## Resources * [API method documentation](https://docs.github.com/rest/reference/checks#update-a-check-run) """ @spec update(String.t(), String.t(), integer, map, keyword) :: {:ok, GitHub.Check.Run.t()} | {:error, GitHub.Error.t()} def update(owner, repo, check_run_id, body, opts \\ []) do client = opts[:client] || @default_client client.request(%{ args: [owner: owner, repo: repo, check_run_id: check_run_id], call: {GitHub.Checks, :update}, url: "/repos/#{owner}/#{repo}/check-runs/#{check_run_id}", body: body, method: :patch, request: [{"application/json", :map}], response: [{200, {GitHub.Check.Run, :t}}], opts: opts }) end end