зеркало из https://github.com/mislav/hub.git
Move octokit to a separate project
This commit is contained in:
Родитель
2b29e18e5e
Коммит
b9ca73f67b
|
@ -1,7 +1,7 @@
|
||||||
package github
|
package github
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/jingweno/gh/octokit"
|
"github.com/jingweno/octokit"
|
||||||
"github.com/jingweno/gh/utils"
|
"github.com/jingweno/gh/utils"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -1,49 +0,0 @@
|
||||||
package octokit
|
|
||||||
|
|
||||||
type Authorization struct {
|
|
||||||
Scopes []string `json:"scopes"`
|
|
||||||
Url string `json:"url"`
|
|
||||||
App App `json:"app"`
|
|
||||||
Token string `json:"token"`
|
|
||||||
Note string `json:"note"`
|
|
||||||
NoteUrl string `json:"note_url"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type App struct {
|
|
||||||
Url string `json:"url"`
|
|
||||||
Name string `json:"name"`
|
|
||||||
ClientId string `json:"client_id"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type AuthorizationParams struct {
|
|
||||||
Scopes []string `json:"scopes"`
|
|
||||||
Note string `json:"note"`
|
|
||||||
NoteUrl string `json:"note_url"`
|
|
||||||
ClientId string `json:"client_id"`
|
|
||||||
ClientSecret string `json:"client_secret"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *Client) Authorizations() ([]Authorization, error) {
|
|
||||||
body, err := c.get("authorizations", nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var auths []Authorization
|
|
||||||
err = jsonUnmarshal(body, &auths)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return auths, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *Client) CreatedAuthorization(params AuthorizationParams) (*Authorization, error) {
|
|
||||||
var auth Authorization
|
|
||||||
err := c.jsonPost("authorizations", nil, params, &auth)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return &auth, nil
|
|
||||||
}
|
|
|
@ -1,15 +0,0 @@
|
||||||
package octokit
|
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/bmizerany/assert"
|
|
||||||
"os"
|
|
||||||
"testing"
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestAuthorizations(t *testing.T) {
|
|
||||||
c := NewClientWithPassword(os.Getenv("GITHUB_USER"), os.Getenv("GITHUB_PASSWORD"))
|
|
||||||
auths, err := c.Authorizations()
|
|
||||||
|
|
||||||
assert.Equal(t, nil, err)
|
|
||||||
assert.T(t, len(auths) > 0)
|
|
||||||
}
|
|
|
@ -1,95 +0,0 @@
|
||||||
package octokit
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"fmt"
|
|
||||||
"io"
|
|
||||||
"io/ioutil"
|
|
||||||
"net/http"
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
GitHubApiUrl string = "https://" + GitHubApiHost
|
|
||||||
GitHubApiHost string = "api.github.com"
|
|
||||||
)
|
|
||||||
|
|
||||||
type Client struct {
|
|
||||||
httpClient *http.Client
|
|
||||||
Login string
|
|
||||||
Password string
|
|
||||||
Token string
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *Client) get(path string, extraHeaders map[string]string) ([]byte, error) {
|
|
||||||
return c.request("GET", path, extraHeaders, nil)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *Client) post(path string, extraHeaders map[string]string, content io.Reader) ([]byte, error) {
|
|
||||||
return c.request("POST", path, extraHeaders, content)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *Client) jsonGet(path string, extraHeaders map[string]string, v interface{}) error {
|
|
||||||
body, err := c.get(path, extraHeaders)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return jsonUnmarshal(body, v)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *Client) jsonPost(path string, extraHeaders map[string]string, params interface{}, v interface{}) error {
|
|
||||||
b, err := jsonMarshal(params)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
buffer := bytes.NewBuffer(b)
|
|
||||||
body, err := c.post(path, extraHeaders, buffer)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return jsonUnmarshal(body, v)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *Client) request(method, path string, extraHeaders map[string]string, content io.Reader) ([]byte, error) {
|
|
||||||
url := fmt.Sprintf("%s/%s", GitHubApiUrl, path)
|
|
||||||
request, err := http.NewRequest(method, url, content)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
c.setDefaultHeaders(request)
|
|
||||||
|
|
||||||
if extraHeaders != nil {
|
|
||||||
for h, v := range extraHeaders {
|
|
||||||
request.Header.Set(h, v)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
response, err := c.httpClient.Do(request)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
body, err := ioutil.ReadAll(response.Body)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
if response.StatusCode >= 400 && response.StatusCode < 600 {
|
|
||||||
return nil, handleErrors(body)
|
|
||||||
}
|
|
||||||
|
|
||||||
return body, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *Client) setDefaultHeaders(request *http.Request) {
|
|
||||||
request.Header.Set("Accept", "application/vnd.github.beta+json")
|
|
||||||
if c.Token != "" {
|
|
||||||
request.Header.Set("Authorization", fmt.Sprintf("token %s", c.Token))
|
|
||||||
}
|
|
||||||
if c.Login != "" && c.Password != "" {
|
|
||||||
request.Header.Set("Authorization", fmt.Sprintf("Basic %s", hashAuth(c.Login, c.Password)))
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,29 +0,0 @@
|
||||||
package octokit
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"github.com/bmizerany/assert"
|
|
||||||
"net/http"
|
|
||||||
"testing"
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestGet(t *testing.T) {
|
|
||||||
c := &Client{&http.Client{}, "", "", ""}
|
|
||||||
body, err := c.get("repos/jingweno/gh/commits", nil)
|
|
||||||
|
|
||||||
assert.Equal(t, nil, err)
|
|
||||||
assert.T(t, len(body) > 0)
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestPost(t *testing.T) {
|
|
||||||
content := "# title"
|
|
||||||
c := &Client{&http.Client{}, "", "", ""}
|
|
||||||
|
|
||||||
headers := make(map[string]string)
|
|
||||||
headers["Content-Type"] = "text/plain"
|
|
||||||
body, err := c.post("markdown/raw", headers, bytes.NewBufferString(content))
|
|
||||||
|
|
||||||
assert.Equal(t, nil, err)
|
|
||||||
expectBody := "<h1>\n<a name=\"title\" class=\"anchor\" href=\"#title\"><span class=\"octicon octicon-link\"></span></a>title</h1>"
|
|
||||||
assert.Equal(t, expectBody, string(body))
|
|
||||||
}
|
|
|
@ -1,61 +0,0 @@
|
||||||
package octokit
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"errors"
|
|
||||||
"fmt"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
type gitHubError struct {
|
|
||||||
Resource string `json:"resource"`
|
|
||||||
Field string `json:"field"`
|
|
||||||
Value interface{} `json:"value"`
|
|
||||||
Code string `json:"code"`
|
|
||||||
Message string `json:"message"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type gitHubErrors struct {
|
|
||||||
Message string `json:"message"`
|
|
||||||
Errors []gitHubError `json:"errors"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func handleErrors(body []byte) error {
|
|
||||||
var githubErrors gitHubErrors
|
|
||||||
err := json.Unmarshal(body, &githubErrors)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
msg := buildErrorMessage(githubErrors)
|
|
||||||
|
|
||||||
return errors.New(msg)
|
|
||||||
}
|
|
||||||
|
|
||||||
func buildErrorMessage(githubErrors gitHubErrors) string {
|
|
||||||
errorMessages := make([]string, 0)
|
|
||||||
for _, e := range githubErrors.Errors {
|
|
||||||
var msg string
|
|
||||||
switch e.Code {
|
|
||||||
case "custom":
|
|
||||||
msg = e.Message
|
|
||||||
case "missing_field":
|
|
||||||
msg = fmt.Sprintf("Missing field: %s", e.Field)
|
|
||||||
case "invalid":
|
|
||||||
msg = fmt.Sprintf("Invalid value for %s: %v", e.Field, e.Value)
|
|
||||||
case "unauthorized":
|
|
||||||
msg = fmt.Sprintf("Not allow to change field %s", e.Field)
|
|
||||||
}
|
|
||||||
|
|
||||||
if msg != "" {
|
|
||||||
errorMessages = append(errorMessages, msg)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
msg := strings.Join(errorMessages, "\n")
|
|
||||||
if msg == "" {
|
|
||||||
msg = githubErrors.Message
|
|
||||||
}
|
|
||||||
|
|
||||||
return msg
|
|
||||||
}
|
|
|
@ -1,13 +0,0 @@
|
||||||
package octokit
|
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/bmizerany/assert"
|
|
||||||
"testing"
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestHandleErrors(t *testing.T) {
|
|
||||||
body := "{\"message\":\"Invalid request media type (expecting 'text/plain')\"}"
|
|
||||||
err := handleErrors([]byte(body))
|
|
||||||
|
|
||||||
assert.Equal(t, "Invalid request media type (expecting 'text/plain')", err.Error())
|
|
||||||
}
|
|
|
@ -1,17 +0,0 @@
|
||||||
package octokit
|
|
||||||
|
|
||||||
import (
|
|
||||||
"net/http"
|
|
||||||
)
|
|
||||||
|
|
||||||
func NewClientWithToken(token string) *Client {
|
|
||||||
return &Client{&http.Client{}, "", "", token}
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewClientWithPassword(login, password string) *Client {
|
|
||||||
return &Client{&http.Client{}, login, password, ""}
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewClient() *Client {
|
|
||||||
return &Client{&http.Client{}, "", "", ""}
|
|
||||||
}
|
|
|
@ -1,45 +0,0 @@
|
||||||
package octokit
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
)
|
|
||||||
|
|
||||||
type PullRequestParams struct {
|
|
||||||
Base string `json:"base"`
|
|
||||||
Head string `json:"head"`
|
|
||||||
Title string `json:"title"`
|
|
||||||
Body string `json:"body"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type PullRequestForIssueParams struct {
|
|
||||||
Base string `json:"base"`
|
|
||||||
Head string `json:"head"`
|
|
||||||
Issue string `json:"issue"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type PullRequest struct {
|
|
||||||
Url string `json:"url"`
|
|
||||||
HtmlUrl string `json:"html_url"`
|
|
||||||
DiffUrl string `json:"diff_url"`
|
|
||||||
PatchUrl string `json:"patch_url"`
|
|
||||||
IssueUrl string `json:"issue_url"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *Client) CreatePullRequest(repo Repository, params PullRequestParams) (*PullRequest, error) {
|
|
||||||
return c.createPullRequest(repo, params)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *Client) CreatePullRequestForIssue(repo Repository, params PullRequestForIssueParams) (*PullRequest, error) {
|
|
||||||
return c.createPullRequest(repo, params)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *Client) createPullRequest(repo Repository, params interface{}) (*PullRequest, error) {
|
|
||||||
path := fmt.Sprintf("repos/%s/pulls", repo)
|
|
||||||
var pr PullRequest
|
|
||||||
err := c.jsonPost(path, nil, params, &pr)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return &pr, nil
|
|
||||||
}
|
|
|
@ -1,14 +0,0 @@
|
||||||
package octokit
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
)
|
|
||||||
|
|
||||||
type Repository struct {
|
|
||||||
Name string
|
|
||||||
UserName string
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r Repository) String() string {
|
|
||||||
return fmt.Sprintf("%s/%s", r.UserName, r.Name)
|
|
||||||
}
|
|
|
@ -1,36 +0,0 @@
|
||||||
package octokit
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
type Status struct {
|
|
||||||
CreatedAt time.Time `json:"created_at"`
|
|
||||||
UpdatedAt time.Time `json:"updated_at"`
|
|
||||||
State string `json:"state"`
|
|
||||||
TargetUrl string `json:"target_url"`
|
|
||||||
Description string `json:"description"`
|
|
||||||
Id int `json:"id"`
|
|
||||||
Url string `json:"url"`
|
|
||||||
Creator StatusCreator `json:"creator"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type StatusCreator struct {
|
|
||||||
Login string `json:"login"`
|
|
||||||
Id int `json:"id"`
|
|
||||||
AvatarUrl string `json:"avatar_url"`
|
|
||||||
GravatarId string `json:"gravatar_id"`
|
|
||||||
Url string `json:"url"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *Client) Statuses(repo Repository, sha string) ([]Status, error) {
|
|
||||||
path := fmt.Sprintf("repos/%s/statuses/%s", repo, sha)
|
|
||||||
var statuses []Status
|
|
||||||
err := c.jsonGet(path, nil, &statuses)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return statuses, nil
|
|
||||||
}
|
|
|
@ -1,16 +0,0 @@
|
||||||
package octokit
|
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/bmizerany/assert"
|
|
||||||
"os"
|
|
||||||
"testing"
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestStatuses(t *testing.T) {
|
|
||||||
c := NewClientWithToken(os.Getenv("GITHUB_TOKEN"))
|
|
||||||
repo := Repository{"gh", "jingweno"}
|
|
||||||
|
|
||||||
statuses, err := c.Statuses(repo, "99b0f36b24e25a644ed70ace601da857eea4cf72")
|
|
||||||
assert.Equal(t, nil, err)
|
|
||||||
assert.T(t, len(statuses) == 0)
|
|
||||||
}
|
|
|
@ -1,39 +0,0 @@
|
||||||
package octokit
|
|
||||||
|
|
||||||
import (
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
type User struct {
|
|
||||||
Login string `json:"login"`
|
|
||||||
Id int `json:"id"`
|
|
||||||
AvatarUrl string `json:"avatar_url"`
|
|
||||||
GravatarId string `json:"gravatar_id"`
|
|
||||||
Url string `json:"url"`
|
|
||||||
Name string `json:"name"`
|
|
||||||
Company string `json:"company"`
|
|
||||||
Blog string `json:"blog"`
|
|
||||||
Location string `json:"location"`
|
|
||||||
Email string `json:"email"`
|
|
||||||
Hireable bool `json:"hireable"`
|
|
||||||
Bio string `json:"bio"`
|
|
||||||
PublicRepos int `json:"public_repos"`
|
|
||||||
PublicGists int `json:"jsonpublic_gists"`
|
|
||||||
Followers int `json:"followers"`
|
|
||||||
Following int `json:"following"`
|
|
||||||
HtmlUrl string `json:"html_url"`
|
|
||||||
CreatedAt time.Time `json:"created_at"`
|
|
||||||
Type string `json:"jsontype"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *Client) AuthenticatedUser() (*User, error) {
|
|
||||||
body, err := c.get("user", nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var authUser User
|
|
||||||
err = jsonUnmarshal(body, &authUser)
|
|
||||||
|
|
||||||
return &authUser, err
|
|
||||||
}
|
|
|
@ -1,15 +0,0 @@
|
||||||
package octokit
|
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/bmizerany/assert"
|
|
||||||
"os"
|
|
||||||
"testing"
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestAuthenticatedUser(t *testing.T) {
|
|
||||||
c := NewClientWithToken(os.Getenv("GITHUB_TOKEN"))
|
|
||||||
user, err := c.AuthenticatedUser()
|
|
||||||
|
|
||||||
assert.Equal(t, nil, err)
|
|
||||||
assert.NotEqual(t, "", user.Login)
|
|
||||||
}
|
|
|
@ -1,20 +0,0 @@
|
||||||
package octokit
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/base64"
|
|
||||||
"encoding/json"
|
|
||||||
"fmt"
|
|
||||||
)
|
|
||||||
|
|
||||||
func hashAuth(u, p string) string {
|
|
||||||
var a = fmt.Sprintf("%s:%s", u, p)
|
|
||||||
return base64.StdEncoding.EncodeToString([]byte(a))
|
|
||||||
}
|
|
||||||
|
|
||||||
func jsonMarshal(v interface{}) ([]byte, error) {
|
|
||||||
return json.Marshal(v)
|
|
||||||
}
|
|
||||||
|
|
||||||
func jsonUnmarshal(data []byte, v interface{}) error {
|
|
||||||
return json.Unmarshal(data, v)
|
|
||||||
}
|
|
Загрузка…
Ссылка в новой задаче