GitHub

Build Status Coverage Status Latest Version

The simplest Elixir client for GitHub REST API v3.

Contents

Usage

With App JWT token

To authenticate with a GitHub App and make an API call by using a JWT token:

iex> jwt_token = Github.Client.generate_jwt_token(app_id: 12345, private_key_filepath: "app.pem")

iex> github_client = %Github.Client{jwt_token: "jwt_token"}

iex> github_client |> Github.Apps.Installations.find!(67890)
%Github.Client.Response{
  status: 200,
  headers: [...],
  body: %{"id" => 12345, ...},
  ...
}

With OAuth access token

To get an access token, redirect a user to an authorize url:

def github(conn, _params) do
  authorize_url = Github.Oauth2.Client.authorize_url!(
    config: [client_id: "client_id", client_secret: "client_secret"],
    scope: "user:email"
  )
  conn |> redirect(external: authorize_url)
end

If a user authorized a log in then GitHub will hit an application callback endpoint with a code:

def github_callback(conn, %{"code" => code}) do
  access_token = Github.Oauth2.Client.access_token!(
    config: [client_id: "client_id", client_secret: "client_secret"],
    params: [code: code]
  )

  github_client = %Github.Client{access_token: access_token}

  %{"login" => login} = github_client |> Github.Users.find!() |> Map.fetch!(:body)
  [%{"email" => email} | _] = github_client |> Github.Users.Emails.list!() |> Map.fetch!(:body)
  ...
end

Pagination

For pagination, the client has such functions as Github.Client.fetch_more! and Github.Client.fetch_all!. Here is an example:

iex> github_client = %Github.Client{access_token: "access_token"}

iex> first_page = github_client |> Github.Users.Emails.list!(page: 1, per_page: 1)
%Github.Client.Response{
  status: 200,
  headers: [...],
  body: [...],
  next_page: 2,
  last_page: 3,
  next_url: "https://api.github.com/user/emails?page=2&per_page=1",
  last_url: "https://api.github.com/user/emails?page=3&per_page=1",
  ...
}

iex> Github.Client.fetch_more!(first_page)
%Github.Client.Response{
  status: 200,
  headers: [...],
  body: [...],
  next_page: 3,
  last_page: 3,
  next_url: "https://api.github.com/user/emails?page=3&per_page=1",
  last_url: "https://api.github.com/user/emails?page=3&per_page=1",
  ...
}

Please visit hexdocs.pm/github to find more code examples.

API Resources

Installation

The package can be installed by adding github to your list of dependencies in mix.exs:

def deps do
  [
    {:github, "~> 0.11.0"}
  ]
end

Testing

mix deps.get
mix test