Skip to main content

lib/gh_ex.ex

defmodule GhEx do
  @moduledoc """
  A Req-based client for the GitHub REST and GraphQL APIs.

  A small generic core (`GhEx.REST` and `GhEx.GraphQL`) reaches every GitHub
  endpoint. Typed convenience modules are added as needed rather than for full
  endpoint coverage. See `SPEC.md` for the design rationale.

  ## Quick start

      client = GhEx.new(auth: {:token, System.fetch_env!("GITHUB_TOKEN")})

      # generic REST, full coverage
      {:ok, issues, meta} =
        GhEx.REST.get(client, "/repos/elixir-lang/elixir/issues", params: [state: "open"])

      # auto-paginated stream of every open issue
      client
      |> GhEx.REST.stream("/repos/elixir-lang/elixir/issues", params: [state: "open"])
      |> Enum.take(100)

  The public namespace is `GhEx`, matching the `gh_ex` package name.
  """

  alias GhEx.Client

  @doc """
  Builds a new `GhEx.Client`.

  ## Options

    * `:auth` - a `t:GhEx.Auth.t/0` value, e.g. `{:token, "ghp_..."}`. Defaults to `nil`.
    * `:rest_url` - REST base URL. Defaults to `"https://api.github.com"`.
    * `:graphql_url` - GraphQL endpoint. Defaults to `"https://api.github.com/graphql"`.
    * `:req_options` - extra options merged into every `Req` request. Useful for
      `Req.Test` plugs, custom Finch pools, retries, and base-URL overrides for
      GitHub Enterprise Server.

  ## Examples

      iex> client = GhEx.new(auth: {:token, "secret"})
      iex> client.rest_url
      "https://api.github.com"
  """
  @spec new(keyword()) :: Client.t()
  def new(opts \\ []), do: Client.new(opts)
end