зеркало из 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
|
||||
|
||||
import (
|
||||
"github.com/jingweno/gh/octokit"
|
||||
"github.com/jingweno/octokit"
|
||||
"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)
|
||||
}
|
Загрузка…
Ссылка в новой задаче