Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Exposing a GitHub API to users of Danger #227

Merged
merged 7 commits into from
Apr 20, 2017
Merged

Conversation

orta
Copy link
Member

@orta orta commented Apr 17, 2017

Fixes #219

In #219 I wondered whether we should just expose an API instead of writing one-off APIs like write labels. I've decided that it makes sense to do the full API. I used this module for some scripting and it felt pretty good - well typed, and comprehensively put together. Will make life easier in Peril too.

That said, I have no idea why this is failing, but figured I'd ship it for now.


Also, as I now have a new dependency, I'll clean up the dependency checker in the current Dangerfile.

@DangerCI
Copy link

DangerCI commented Apr 17, 2017

Warnings
⚠️ New dependencies added: github.

github

Author: Mike de Boer
Description: NodeJS wrapper for the GitHub API
Repo: https://github.com/mikedeboer/node-github

Createdover 6 years ago
Last Updated1 day ago
LicenseMIT
Maintainers2
Releases81
Direct Dependenciesfollow-redirects, https-proxy-agent, mime and netrc
README

NOTE: The node-github npm package is deprecated. You want the github npm package (see Installation).

Node-github

npm
Gratipay donate button

A Node.js wrapper for GitHub API.

Installation

Install via npm.

$ npm install github

or

Install via git clone

$ git clone https://github.com/mikedeboer/node-github.git
$ cd node-github
$ npm install

Documentation

Client API: https://mikedeboer.github.io/node-github/
GitHub API: https://developer.github.com/v3/

Example

Get all followers for user "defunkt":

var GitHubApi = require("github");

var github = new GitHubApi({
    // optional
    debug: true,
    protocol: "https",
    host: "github.my-GHE-enabled-company.com", // should be api.github.com for GitHub
    pathPrefix: "/api/v3", // for some GHEs; none for GitHub
    headers: {
        "user-agent": "My-Cool-GitHub-App" // GitHub is happy with a unique user agent
    },
    Promise: require('bluebird'),
    followRedirects: false, // default: true; there's currently an issue with non-get redirects, so allow ability to disable follow-redirects
    timeout: 5000
});

// TODO: optional authentication here depending on desired endpoints. See below in README.

github.users.getFollowingForUser({
    // optional
    // headers: {
    //     "cookie": "blahblah"
    // },
    username: "defunkt"
}, function(err, res) {
    console.log(JSON.stringify(res));
});

Pagination

There are a few pagination-related methods:

hasNextPage(link)
hasPreviousPage(link)
hasFirstPage(link)
hasLastPage(link)

getNextPage(link, headers, callback)
getPreviousPage(link, headers, callback)
getFirstPage(link, headers, callback)
getLastPage(link, headers, callback)

NOTE: link is the response object or the contents of the Link header

See here and here for examples.

Authentication

Most GitHub API calls don't require authentication. As a rule of thumb: If you can see the information by visiting the site without being logged in, you don't have to be authenticated to retrieve the same information through the API. Of course calls, which change data or read sensitive information have to be authenticated.

You need the GitHub user name and the API key for authentication. The API key can be found in the user's Account Settings.

// basic
github.authenticate({
    type: "basic",
    username: USERNAME,
    password: PASSWORD
});

// oauth
github.authenticate({
    type: "oauth",
    token: AUTH_TOKEN
});

// oauth key/secret (to get a token)
github.authenticate({
    type: "oauth",
    key: CLIENT_ID,
    secret: CLIENT_SECRET
})

// user token
github.authenticate({
    type: "token",
    token: "userToken",
});

// integration (jwt)
github.authenticate({
    type: "integration",
    token: "jwt",
});

// ~/.netrc
github.authenticate({
    type: "netrc"
});

Note: authenticate is synchronous because it only stores the
credentials for the next request.

Creating a token for your application

Create a new authorization.

  1. Use github.authenticate() to authenticate with GitHub using your username / password.
  2. Create an application token programmatically with the scopes you need and, if you use two-factor authentication send the X-GitHub-OTP header with the one-time-password you get on your token device.
github.authorization.create({
    scopes: ["user", "public_repo", "repo", "repo:status", "gist"],
    note: "what this auth is for",
    note_url: "http://url-to-this-auth-app",
    headers: {
        "X-GitHub-OTP": "two-factor-code"
    }
}, function(err, res) {
    if (res.token) {
        //save and use res.token as in the Oauth process above from now on
    }
});

Create test auth file

Create test auth file for running tests/examples.

$ > testAuth.json
{
    "token": "<TOKEN>"
}

Promises

For using bluebird, see here.
For using Q, see here.

Tests

Run all tests

$ npm test

Or run a specific test

$ npm test test/issuesTest.js

Preview APIs

Accept headers for the preview APIs should be taken care of behind the scenes, but in the event a preview endpoint isn't working, see here for an example on how to add the required custom accept header.

For updates on endpoints under preview, see https://developer.github.com/changes/.

Preview API Accept header val
Commit Search application/vnd.github.cloak-preview+json
Community application/vnd.github.black-panther-preview+json
Deployment application/vnd.github.ant-man-preview+json
Git signing application/vnd.github.cryptographer-preview
Imports application/vnd.github.barred-rock-preview
Integrations application/vnd.github.machine-man-preview
License application/vnd.github.drax-preview+json
Migrations application/vnd.github.wyandotte-preview+json
Organization Membership application/vnd.github.korra-preview+json
Pages application/vnd.github.mister-fantastic-preview
Pre-receive application/vnd.github.eye-scream-preview
Projects application/vnd.github.inertia-preview+json
Protected Branches application/vnd.github.loki-preview+json
Pull Request Squash application/vnd.github.polaris-preview
Reactions application/vnd.github.squirrel-girl-preview
Timeline application/vnd.github.mockingbird-preview
User Blocking application/vnd.github.giant-sentry-fist-preview+json

Dev notes

When updating routes.json, you'll want to update the generated docs/tests:

$ node lib/generate.js

To update the apidoc for github pages:

$ npm install apidoc -g
$ apidoc -i doc/ -o apidoc/

Just a reminder, since an ad-hoc filter was added to the apidoc, don't overwrite index.html, main.js.

LICENSE

MIT license. See the LICENSE file for details.

yarn why github output

  • Has been hoisted to "github"
  • This module exists because it's specified in "dependencies".
  • Disk size without dependencies: "2.08MB"
  • Disk size with unique dependencies: "2.27MB"
  • Disk size with transitive dependencies: "2.73MB"
  • Amount of shared dependencies: 8

Generated by 🚫 dangerJS

@orta orta force-pushed the github_api_consumers branch 8 times, most recently from a7dcb40 to fd8afaf Compare April 18, 2017 00:52
@orta orta mentioned this pull request Apr 18, 2017
@@ -34,6 +34,10 @@ jest.mock("../github/GitHubAPI", () => {
const fixtures = await requestWithFixturedJSON("requested_reviewers.json")
return await fixtures()
}

getExternalAPI() {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@orta since our tests mock the GitHubAPI file, we need to supply the getExternalAPI() function here for the tests to pass. 👍

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

:D

@macklinu
Copy link
Member

Pushed up a merge commit to resolve the conflict in the Changelog. @orta, this PR looks good to me - anything else to do before merging? Will squash and merge into one commit if that's cool.

image

@codecov-io
Copy link

codecov-io commented Apr 19, 2017

Codecov Report

Merging #227 into master will decrease coverage by 0.36%.
The diff coverage is 28.57%.

Impacted file tree graph

@@            Coverage Diff             @@
##           master     #227      +/-   ##
==========================================
- Coverage   68.62%   68.26%   -0.37%     
==========================================
  Files          34       34              
  Lines         765      772       +7     
  Branches      104      106       +2     
==========================================
+ Hits          525      527       +2     
- Misses        240      245       +5
Impacted Files Coverage Δ
source/platforms/GitHub.ts 62.79% <ø> (ø) ⬆️
source/platforms/github/GitHubAPI.ts 55.69% <28.57%> (-2.64%) ⬇️

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update d4ff1d5...9107e0f. Read the comment docs.

@orta
Copy link
Member Author

orta commented Apr 19, 2017

Nah - this was all. I'll do a docs run separately 👍

@orta
Copy link
Member Author

orta commented Apr 19, 2017

You're welcome to merge - thanks

@orta
Copy link
Member Author

orta commented Apr 19, 2017

Been focusing on the site

@macklinu macklinu merged commit d80b755 into master Apr 20, 2017
@macklinu macklinu deleted the github_api_consumers branch April 20, 2017 00:01
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants