Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 34 additions & 8 deletions github/repos.go
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,34 @@ func (r Repository) String() string {
return Stringify(r)
}

// RepositorySpec specifies a repository.
type RepositorySpec interface {
Path() string
}

// RepositoryName identifies a repository by its owner and name.
type RepositoryName struct {
// Owner is the user login of the repository's owner.
Owner string

// Name is the repository's name (not including the owner).
Name string
}

// Path implements RepositorySpec.
func (r RepositoryName) Path() string {
return fmt.Sprintf("repos/%v/%v", r.Owner, r.Name)
}

// RepositoryID is a numeric ID for a repository. GitHub repository IDs remain
// unchanged even if the repository is renamed.
type RepositoryID int64

// Path implements RepositorySpec.
func (r RepositoryID) Path() string {
return fmt.Sprintf("repositories/%d", r)
}

// RepositoryListOptions specifies the optional parameters to the
// RepositoriesService.List method.
type RepositoryListOptions struct {
Expand Down Expand Up @@ -195,9 +223,8 @@ func (s *RepositoriesService) Create(org string, repo *Repository) (*Repository,
// Get fetches a repository.
//
// GitHub API docs: http://developer.github.com/v3/repos/#get
func (s *RepositoriesService) Get(owner, repo string) (*Repository, *Response, error) {
u := fmt.Sprintf("repos/%v/%v", owner, repo)
req, err := s.client.NewRequest("GET", u, nil)
func (s *RepositoriesService) Get(spec RepositorySpec) (*Repository, *Response, error) {
req, err := s.client.NewRequest("GET", spec.Path(), nil)
if err != nil {
return nil, nil, err
}
Expand All @@ -214,9 +241,8 @@ func (s *RepositoriesService) Get(owner, repo string) (*Repository, *Response, e
// Edit updates a repository.
//
// GitHub API docs: http://developer.github.com/v3/repos/#edit
func (s *RepositoriesService) Edit(owner, repo string, repository *Repository) (*Repository, *Response, error) {
u := fmt.Sprintf("repos/%v/%v", owner, repo)
req, err := s.client.NewRequest("PATCH", u, repository)
func (s *RepositoriesService) Edit(spec RepositorySpec, repository *Repository) (*Repository, *Response, error) {
req, err := s.client.NewRequest("PATCH", spec.Path(), repository)
if err != nil {
return nil, nil, err
}
Expand All @@ -240,8 +266,8 @@ func (s *RepositoriesService) Edit(owner, repo string, repository *Repository) (
// }
//
// GitHub API Docs: http://developer.github.com/v3/repos/#list-languages
func (s *RepositoriesService) ListLanguages(owner string, repository string) (map[string]int, *Response, error) {
u := fmt.Sprintf("/repos/%v/%v/languages", owner, repository)
func (s *RepositoriesService) ListLanguages(spec RepositorySpec) (map[string]int, *Response, error) {
u := spec.Path() + "/languages"
req, err := s.client.NewRequest("GET", u, nil)
if err != nil {
return nil, nil, err
Expand Down
54 changes: 42 additions & 12 deletions github/repos_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -189,12 +189,14 @@ func TestRepositoriesService_Get(t *testing.T) {
setup()
defer teardown()

mux.HandleFunc("/repos/o/r", func(w http.ResponseWriter, r *http.Request) {
h := func(w http.ResponseWriter, r *http.Request) {
testMethod(t, r, "GET")
fmt.Fprint(w, `{"id":1,"name":"n","description":"d","owner":{"login":"l"}}`)
})
}
mux.HandleFunc("/repos/o/r", h)
mux.HandleFunc("/repositories/1", h)

repo, _, err := client.Repositories.Get("o", "r")
repo, _, err := client.Repositories.Get(RepositoryName{"o", "r"})
if err != nil {
t.Errorf("Repositories.Get returned error: %v", err)
}
Expand All @@ -203,6 +205,14 @@ func TestRepositoriesService_Get(t *testing.T) {
if !reflect.DeepEqual(repo, want) {
t.Errorf("Repositories.Get returned %+v, want %+v", repo, want)
}

repo, _, err = client.Repositories.Get(RepositoryID(1))
if err != nil {
t.Errorf("Repositories.Get returned error: %v", err)
}
if !reflect.DeepEqual(repo, want) {
t.Errorf("Repositories.Get returned %+v, want %+v", repo, want)
}
}

func TestRepositoriesService_Edit(t *testing.T) {
Expand All @@ -212,7 +222,7 @@ func TestRepositoriesService_Edit(t *testing.T) {
i := true
input := &Repository{HasIssues: &i}

mux.HandleFunc("/repos/o/r", func(w http.ResponseWriter, r *http.Request) {
h := func(w http.ResponseWriter, r *http.Request) {
v := new(Repository)
json.NewDecoder(r.Body).Decode(v)

Expand All @@ -221,9 +231,11 @@ func TestRepositoriesService_Edit(t *testing.T) {
t.Errorf("Request body = %+v, want %+v", v, input)
}
fmt.Fprint(w, `{"id":1}`)
})
}
mux.HandleFunc("/repos/o/r", h)
mux.HandleFunc("/repositories/1", h)

repo, _, err := client.Repositories.Edit("o", "r", input)
repo, _, err := client.Repositories.Edit(RepositoryName{"o", "r"}, input)
if err != nil {
t.Errorf("Repositories.Edit returned error: %v", err)
}
Expand All @@ -232,28 +244,38 @@ func TestRepositoriesService_Edit(t *testing.T) {
if !reflect.DeepEqual(repo, want) {
t.Errorf("Repositories.Edit returned %+v, want %+v", repo, want)
}

repo, _, err = client.Repositories.Edit(RepositoryID(1), input)
if err != nil {
t.Errorf("Repositories.Edit returned error: %v", err)
}
if !reflect.DeepEqual(repo, want) {
t.Errorf("Repositories.Edit returned %+v, want %+v", repo, want)
}
}

func TestRepositoriesService_Get_invalidOwner(t *testing.T) {
_, _, err := client.Repositories.Get("%", "r")
_, _, err := client.Repositories.Get(RepositoryName{"%", "r"})
testURLParseError(t, err)
}

func TestRepositoriesService_Edit_invalidOwner(t *testing.T) {
_, _, err := client.Repositories.Edit("%", "r", nil)
_, _, err := client.Repositories.Edit(RepositoryName{"%", "r"}, nil)
testURLParseError(t, err)
}

func TestRepositoriesService_ListLanguages(t *testing.T) {
setup()
defer teardown()

mux.HandleFunc("/repos/o/r/languages", func(w http.ResponseWriter, r *http.Request) {
h := func(w http.ResponseWriter, r *http.Request) {
testMethod(t, r, "GET")
fmt.Fprint(w, `{"go":1}`)
})
}
mux.HandleFunc("/repos/o/r/languages", h)
mux.HandleFunc("/repositories/1/languages", h)

languages, _, err := client.Repositories.ListLanguages("o", "r")
languages, _, err := client.Repositories.ListLanguages(RepositoryName{"o", "r"})
if err != nil {
t.Errorf("Repositories.ListLanguages returned error: %v", err)
}
Expand All @@ -262,9 +284,17 @@ func TestRepositoriesService_ListLanguages(t *testing.T) {
if !reflect.DeepEqual(languages, want) {
t.Errorf("Repositories.ListLanguages returned %+v, want %+v", languages, want)
}

languages, _, err = client.Repositories.ListLanguages(RepositoryID(1))
if err != nil {
t.Errorf("Repositories.ListLanguages returned error: %v", err)
}
if !reflect.DeepEqual(languages, want) {
t.Errorf("Repositories.ListLanguages returned %+v, want %+v", languages, want)
}
}

func TestRepositoriesService_ListLanguages_invalidOwner(t *testing.T) {
_, _, err := client.Repositories.ListLanguages("%", "%")
_, _, err := client.Repositories.ListLanguages(RepositoryName{"%", "%"})
testURLParseError(t, err)
}