Skip to content

Commit

Permalink
Add ListContributorsStats and ListCommitActivity for RepositoriesService
Browse files Browse the repository at this point in the history
  • Loading branch information
ttacon authored and willnorris committed Apr 8, 2014
1 parent a4b0af1 commit f9fd615
Show file tree
Hide file tree
Showing 2 changed files with 185 additions and 0 deletions.
82 changes: 82 additions & 0 deletions github/repos_stats.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
// Copyright 2014 The go-github AUTHORS. All rights reserved.
//
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package github

import "fmt"

// ContributorStats represents a contributor to a repository and their
// weekly contributions to a given repo.
type ContributorStats struct {
Author *Contributor `json:"author,omitempty"`
Total *int `json:"total,omitempty"`
Weeks []WeeklyHash `json:"weeks,omitempty"`
}

// WeeklyHash represents the number of additions, deletions and commits
// a Contributor made in a given week.
type WeeklyHash struct {
Week *int `json:"w,omitempty"`
Additions *int `json:"a,omitempty"`
Deletions *int `json:"d,omitempty"`
Commits *int `json:"c,omitempty"`
}

// ListContributorsStats gets a repo's contributor list with additions, deletions and commit counts.
// If this is the first time these statistics are requested for the given repository, this will method
// will return a non-nil error and a status code of 202. This is because this is the status that github
// returns to signify that it is now computing the requested statistics. A follow up request, after
// a delay of a second or so, should result in a successful request.
//
// GitHub API docs: https://developer.github.com/v3/repos/statistics/#contributors
func (s *RepositoriesService) ListContributorsStats(owner, repo string) (*[]ContributorStats, *Response, error) {
u := fmt.Sprintf("repos/%v/%v/stats/contributors", owner, repo)
req, err := s.client.NewRequest("GET", u, nil)
if err != nil {
return nil, nil, err
}

contributorStats := new([]ContributorStats)
resp, err := s.client.Do(req, contributorStats)
if err != nil {
return nil, resp, err
}

return contributorStats, resp, err
}

// WeeklyCommitActivity represents the weekly commit activity for a repository.
// The days array is a group of commits per day, starting on Sunday.
type WeeklyCommitActivity struct {
Days []int `json:"days,omitempty"`
Total *int `json:"total,omitempty"`
Week *int `json:"week,omitempty"`
}

// ListLastYearCommitActivity returns the last year of commit activity
// grouped by week. The days array is a group of commits per day,
// starting on Sunday. If this is the first time these statistics are
// requested for the given repository, this will method will return a
// non-nil error and a status code of 202. This is because this is the
// status that github returns to signify that it is now computing the
// requested statistics. A follow up request, after a delay of a second
// or so, should result in a successful request.
//
// GitHub API docs: https://developer.github.com/v3/repos/statistics/#commit-activity
func (s *RepositoriesService) ListCommitActivity(owner, repo string) (*[]WeeklyCommitActivity, *Response, error) {
u := fmt.Sprintf("repos/%v/%v/stats/commit_activity", owner, repo)
req, err := s.client.NewRequest("GET", u, nil)
if err != nil {
return nil, nil, err
}

weeklyCommitActivity := new([]WeeklyCommitActivity)
resp, err := s.client.Do(req, weeklyCommitActivity)
if err != nil {
return nil, resp, err
}

return weeklyCommitActivity, resp, err
}
103 changes: 103 additions & 0 deletions github/repos_stats_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
// Copyright 2013 The go-github AUTHORS. All rights reserved.
//
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package github

import (
"fmt"
"net/http"
"reflect"
"testing"
)

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

mux.HandleFunc("/repos/o/r/stats/contributors", func(w http.ResponseWriter, r *http.Request) {
testMethod(t, r, "GET")

fmt.Fprint(w, `
[
{
"author": {
"id": 1
},
"total": 135,
"weeks": [
{
"w": 1367712000,
"a": 6898,
"d": 77,
"c": 10
}
]
}
]
`)
})

stats, _, err := client.Repositories.ListContributorsStats("o", "r")
if err != nil {
t.Errorf("RepositoriesService.ListContributorsStats returned error: %v", err)
}

want := &[]ContributorStats{
ContributorStats{
Author: &Contributor{
ID: Int(1),
},
Total: Int(135),
Weeks: []WeeklyHash{
WeeklyHash{
Week: Int(1367712000),
Additions: Int(6898),
Deletions: Int(77),
Commits: Int(10),
},
},
},
}

if !reflect.DeepEqual(stats, want) {
t.Errorf("RepositoriesService.ListContributorsStats returned %+v, want %+v", stats, want)
}
}

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

mux.HandleFunc("/repos/o/r/stats/commit_activity", func(w http.ResponseWriter, r *http.Request) {
testMethod(t, r, "GET")

fmt.Fprint(w, `
[
{
"days": [0, 3, 26, 20, 39, 1, 0],
"total": 89,
"week": 1336280400
}
]
`)
})

activity, _, err := client.Repositories.ListCommitActivity("o", "r")
if err != nil {
t.Errorf("RepositoriesService.ListCommitActivity returned error: %v", err)
}

want := &[]WeeklyCommitActivity{
WeeklyCommitActivity{
Days: []int{0, 3, 26, 20, 39, 1, 0},
Total: Int(89),
Week: Int(1336280400),
},
}

if !reflect.DeepEqual(activity, want) {
t.Errorf("RepositoriesService.ListCommitActivity returned %+v, want %+v", activity, want)
}
}

0 comments on commit f9fd615

Please sign in to comment.