hubstats 0.4.4 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. checksums.yaml +5 -13
  2. data/.ruby-gemset +1 -0
  3. data/.ruby-version +1 -0
  4. data/CHANGELOG.markdown +5 -0
  5. data/README.md +64 -22
  6. data/app/assets/javascripts/hubstats/pull_requests.js +5 -0
  7. data/app/assets/javascripts/hubstats/select2.js +46 -3
  8. data/app/assets/javascripts/hubstats/users.js +8 -0
  9. data/app/assets/stylesheets/hubstats/application.css +5 -1
  10. data/app/controllers/hubstats/pull_requests_controller.rb +2 -3
  11. data/app/controllers/hubstats/repos_controller.rb +7 -12
  12. data/app/controllers/hubstats/teams_controller.rb +62 -0
  13. data/app/controllers/hubstats/users_controller.rb +9 -8
  14. data/app/models/hubstats/comment.rb +1 -0
  15. data/app/models/hubstats/pull_request.rb +40 -8
  16. data/app/models/hubstats/repo.rb +1 -1
  17. data/app/models/hubstats/team.rb +159 -0
  18. data/app/models/hubstats/user.rb +10 -1
  19. data/app/views/hubstats/deploys/show.html.erb +1 -4
  20. data/app/views/hubstats/partials/_comment-condensed.html.erb +1 -0
  21. data/app/views/hubstats/partials/_comment.html.erb +1 -0
  22. data/app/views/hubstats/partials/_footer.html.erb +3 -0
  23. data/app/views/hubstats/partials/_header.html.erb +5 -3
  24. data/app/views/hubstats/partials/_team.html.erb +40 -0
  25. data/app/views/hubstats/partials/_user-condensed.html.erb +6 -5
  26. data/app/views/hubstats/partials/_user.html.erb +2 -1
  27. data/app/views/hubstats/pull_requests/index.html.erb +4 -0
  28. data/app/views/hubstats/repos/dashboard.html.erb +0 -1
  29. data/app/views/hubstats/repos/show.html.erb +1 -1
  30. data/app/views/hubstats/tables/_comments-condensed.html.erb +1 -1
  31. data/app/views/hubstats/tables/_comments.html.erb +1 -1
  32. data/app/views/hubstats/tables/_deploys.html.erb +1 -1
  33. data/app/views/hubstats/tables/_grouped_deploys.html.erb +1 -1
  34. data/app/views/hubstats/tables/_grouped_pulls.html.erb +1 -1
  35. data/app/views/hubstats/tables/_pulls-condensed.html.erb +1 -1
  36. data/app/views/hubstats/tables/_pulls.html.erb +1 -1
  37. data/app/views/hubstats/tables/_repos-condensed.html.erb +1 -1
  38. data/app/views/hubstats/tables/_repos.html.erb +2 -2
  39. data/app/views/hubstats/tables/_teams.html.erb +28 -0
  40. data/app/views/hubstats/tables/_users-condensed.html.erb +1 -1
  41. data/app/views/hubstats/tables/_users.html.erb +2 -2
  42. data/app/views/hubstats/teams/index.html.erb +10 -0
  43. data/app/views/hubstats/teams/show.html.erb +28 -0
  44. data/app/views/hubstats/users/show.html.erb +2 -2
  45. data/config/routes.rb +4 -3
  46. data/db/migrate/20150706204910_create_hubstats_teams.rb +8 -0
  47. data/db/migrate/20150706205049_create_hubstats_teams_users.rb +8 -0
  48. data/db/migrate/20150713185013_add_team_id_to_prs.rb +5 -0
  49. data/hubstats.gemspec +2 -1
  50. data/lib/generators/hubstats/octokit.example.yml +3 -1
  51. data/lib/hubstats/events_handler.rb +20 -0
  52. data/lib/hubstats/github_api.rb +71 -15
  53. data/lib/hubstats/version.rb +1 -1
  54. data/lib/tasks/hubstats_tasks.rake +19 -0
  55. data/lib/tasks/populate_task.rake +35 -2
  56. data/spec/controllers/hubstats/repos_controller_spec.rb +1 -0
  57. data/spec/controllers/hubstats/teams_controller_spec.rb +39 -0
  58. data/spec/controllers/hubstats/users_controller_spec.rb +2 -0
  59. data/spec/factories/pull_requests.rb +1 -1
  60. data/spec/factories/teams.rb +24 -0
  61. data/spec/factories/users.rb +0 -1
  62. data/spec/lib/hubstats/events_handler_spec.rb +37 -7
  63. data/spec/lib/hubstats/github_api_spec.rb +55 -2
  64. data/spec/lib/hubstats_spec.rb +7 -1
  65. data/spec/models/hubstats/pull_request_spec.rb +34 -0
  66. data/spec/models/hubstats/team_spec.rb +23 -0
  67. data/spec/models/hubstats/user_spec.rb +26 -0
  68. data/test/dummy/config/initializers/octokit_patch.rb +3 -0
  69. data/test/dummy/db/schema.rb +51 -40
  70. metadata +62 -29
@@ -1,6 +1,6 @@
1
1
  <div class="row single-user">
2
2
 
3
- <!-- Show the avatar of the githuber user and the user's username -->
3
+ <!-- Show the avatar of the githuber user and the user's username with a link to their github page -->
4
4
  <div class="user-image col-lg-1 col-md-1 col-sm-1" >
5
5
  <img src= <%= user.avatar_url%> alt= <%= user.login %> >
6
6
  </div>
@@ -8,6 +8,7 @@
8
8
  <h4>
9
9
  <%= link_to user.login, user_path(user) %>
10
10
  </h4>
11
+ updated <%= distance_of_time_in_words(DateTime.now,user.updated_at) %> ago
11
12
  <br>
12
13
  <h4>
13
14
  <a class="subtle" href=<%= user.html_url %> >
@@ -11,6 +11,10 @@
11
11
  <input class="select2-control" id="users">
12
12
  </input>
13
13
  </div>
14
+ <div class="form-group">
15
+ <input class="select2-control" id="teams">
16
+ </input>
17
+ </div>
14
18
 
15
19
  <hr>
16
20
 
@@ -15,7 +15,6 @@
15
15
  <!-- Show all of the repositories with their individual stats -->
16
16
  <div class="row">
17
17
  <div class="col col-lg-12">
18
- <h3> Repositories </h3>
19
18
  <%= render 'hubstats/tables/repos' %>
20
19
  <div class="text-center">
21
20
  <%= will_paginate @repo, renderer: BootstrapPagination::Rails %>
@@ -19,7 +19,7 @@
19
19
 
20
20
  <!-- Show all of the merged pull requests in a "condensed" view -->
21
21
  <div class="col col-lg-6">
22
- <h3> Pull Requests</h3>
22
+ <h3> Merged Pull Requests</h3>
23
23
  <%= render 'hubstats/tables/pulls-condensed'%>
24
24
  <% if @pull_count > 20 %>
25
25
  <p class="pull-right"><%= link_to "View All", pulls_path(:repos => @repo.id) %></p>
@@ -4,5 +4,5 @@
4
4
  <%= render partial: 'hubstats/partials/comment-condensed', collection: @comments, as: :comment %>
5
5
  </div>
6
6
  <% else %>
7
- <p> No comments to show </p>
7
+ <p> No comment information available </p>
8
8
  <% end %>
@@ -4,5 +4,5 @@
4
4
  <%= render partial: 'hubstats/partials/comment', collection: @comments, as: :comment %>
5
5
  </div>
6
6
  <% else %>
7
- <p> No comments to show </p>
7
+ <p> No comment information available </p>
8
8
  <% end %>
@@ -4,5 +4,5 @@
4
4
  <%= render partial: 'hubstats/partials/deploy', collection: @deploys, as: :deploy %>
5
5
  </div>
6
6
  <% else %>
7
- <p> No deployments to show </p>
7
+ <p> No deployment information available </p>
8
8
  <% end %>
@@ -13,5 +13,5 @@
13
13
  <%= render 'hubstats/tables/deploys' %>
14
14
  <% end %>
15
15
  <% else %>
16
- <p> No deployments to show </p>
16
+ <p> No deployment information available </p>
17
17
  <% end %>
@@ -13,6 +13,6 @@
13
13
  <%= render 'hubstats/tables/pulls' %>
14
14
  <% end %>
15
15
  <% else %>
16
- <p> No pull requests to show </p>
16
+ <p> No pull request information available </p>
17
17
  <% end %>
18
18
 
@@ -4,6 +4,6 @@
4
4
  <%= render partial: 'hubstats/partials/pull-condensed', collection: @pull_requests, as: :pull %>
5
5
  </div>
6
6
  <% else %>
7
- <p> No pull requests to show </p>
7
+ <p> No pull request information available </p>
8
8
  <% end %>
9
9
 
@@ -4,6 +4,6 @@
4
4
  <%= render partial: 'hubstats/partials/pull', collection: @pull_requests, as: :pull %>
5
5
  </div>
6
6
  <% else %>
7
- <p> No pull requests to show </p>
7
+ <p> No pull request information available </p>
8
8
  <% end %>
9
9
 
@@ -4,6 +4,6 @@
4
4
  <%= render partial: 'hubstats/partials/repo-condensed', collection: @repos, as: :repo %>
5
5
  </div>
6
6
  <% else %>
7
- <p> No repositories to show </p>
7
+ <p> No repository information available </p>
8
8
  <% end %>
9
9
 
@@ -9,7 +9,7 @@
9
9
  <a class="header desc" id="deploys"> Deployments <span class="octicon"></span> </a>
10
10
  </div>
11
11
  <div class="col-lg-2 col-md-2 col-sm-2">
12
- <a class="header desc" id="pulls"> Pull Requests <span class="octicon"></span> </a>
12
+ <a class="header desc" id="pulls"> Merged Pull Requests <span class="octicon"></span> </a>
13
13
  </div>
14
14
  <div class="col-lg-2 col-md-2 col-sm-2">
15
15
  <a class="header desc" id="comments"> Comments <span class="octicon"></span></a>
@@ -24,6 +24,6 @@
24
24
  <%= render partial: 'hubstats/partials/repo', collection: @repos, as: :repo %>
25
25
  </div>
26
26
  <% else %>
27
- <p> No repositories to show </p>
27
+ <p> No repository information available </p>
28
28
  <% end %>
29
29
 
@@ -0,0 +1,28 @@
1
+ <!-- Either say there are no teams to show, or show all of the stat titles along with the stats/teams -->
2
+ <% if @teams.length > 0 %>
3
+ <div class="teams">
4
+ <div class="row single-user header">
5
+ <div class="col-lg-2 col-md-2 col-sm-2">
6
+ <a class="header desc" id="name"> Team Name <span class="octicon"></span> </a>
7
+ </div>
8
+ <div class="col-lg-2 col-md-2 col-sm-2">
9
+ <a class="header desc" id="usercount"> Users <span class="octicon"></span> </a>
10
+ </div>
11
+ <div class="col-lg-2 col-md-2 col-sm-2">
12
+ <a class="header desc" id="pulls"> Merged Pull Requests <span class="octicon"></span> </a>
13
+ </div>
14
+ <div class="col-lg-2 col-md-2 col-sm-2">
15
+ <a class="header desc" id="comments"> Comments <span class="octicon"></span></a>
16
+ </div>
17
+ <div class="col-lg-2 col-md-2 col-sm-2">
18
+ <a class="header desc" id="repocount"> Repositories <span class="octicon"></span></a>
19
+ </div>
20
+ <div class="col-lg-2 col-md-2 col-sm-2">
21
+ <a class="header desc" id="netadditions"> Net Additions <span class="octicon"></span></a>
22
+ </div>
23
+ </div>
24
+ <%= render partial: 'hubstats/partials/team', collection: @teams, as: :team %>
25
+ </div>
26
+ <% else %>
27
+ <p> No team information available </p>
28
+ <% end %>
@@ -4,5 +4,5 @@
4
4
  <%= render partial: 'hubstats/partials/user-condensed', collection: @users, as: :user %>
5
5
  </div>
6
6
  <% else %>
7
- <p> No users to show </p>
7
+ <p> No user information available </p>
8
8
  <% end %>
@@ -9,7 +9,7 @@
9
9
  <a class="header desc" id="deploys"> Deployments <span class="octicon"></span> </a>
10
10
  </div>
11
11
  <div class="col-lg-2 col-md-2 col-sm-2">
12
- <a class="header desc" id="pulls"> Pull Requests <span class="octicon"></span> </a>
12
+ <a class="header desc" id="pulls"> Merged Pull Requests <span class="octicon"></span> </a>
13
13
  </div>
14
14
  <div class="col-lg-2 col-md-2 col-sm-2">
15
15
  <a class="header desc" id="comments"> Comments <span class="octicon"></span></a>
@@ -21,5 +21,5 @@
21
21
  <%= render partial: 'hubstats/partials/user', collection: @users, as: :user %>
22
22
  </div>
23
23
  <% else %>
24
- <p> No users to show </p>
24
+ <p> No user information available</p>
25
25
  <% end %>
@@ -0,0 +1,10 @@
1
+ <div class="container" id="team"%>
2
+ <div class="row">
3
+ <div class="col col-lg-12">
4
+ <%= render 'hubstats/tables/teams' %>
5
+ <div class="text-center">
6
+ <%= will_paginate @team, renderer: BootstrapPagination::Rails %>
7
+ </div>
8
+ </div>
9
+ </div>
10
+ </div>
@@ -0,0 +1,28 @@
1
+ <div class="container" id="team">
2
+ <div class="row">
3
+
4
+ <!-- Title with the team's name -->
5
+ <h1 class="title text-center"><%= @team.name %></a> </h1>
6
+
7
+ <!-- Show all of the stats about the team -->
8
+ <%= render 'hubstats/partials/quick_stats' %>
9
+ </div>
10
+
11
+ <div class="row">
12
+
13
+ <!-- Show all of this team's merged pull requests in a "condensed" view -->
14
+ <div class="col-lg-6 col-md-5 col-sm-5 col-xs-5">
15
+ <h3> Merged Pull Requests</h3>
16
+ <%= render 'hubstats/tables/pulls-condensed' %>
17
+ <% if @pull_count > 20 %>
18
+ <p class="pull-right"><%= link_to "View All", pulls_path(:teams => @team.id) %></p>
19
+ <% end %>
20
+ </div>
21
+
22
+ <!-- Show all of this team's users in a "condensed" view -->
23
+ <div class="col-lg-6 col-md-6 col-sm-6 col-xs-6">
24
+ <h3> Active Users </h3>
25
+ <%= render 'hubstats/tables/users-condensed' %>
26
+ </div>
27
+ </div>
28
+ </div>
@@ -1,4 +1,4 @@
1
- <div class="container" id="repo">
1
+ <div class="container" id="user">
2
2
  <div class="row">
3
3
 
4
4
  <!-- Title with the user's GitHub username -->
@@ -12,7 +12,7 @@
12
12
 
13
13
  <!-- Show all of this user's merged pull requests in a "condensed" view -->
14
14
  <div class="col-lg-6 col-md-5 col-sm-5 col-xs-5">
15
- <h3> Pull Requests</h3>
15
+ <h3> Merged Pull Requests</h3>
16
16
  <%= render 'hubstats/tables/pulls-condensed' %>
17
17
  <% if @pull_count > 20 %>
18
18
  <p class="pull-right"><%= link_to "View All", pulls_path(:users => @user.id) %></p>
data/config/routes.rb CHANGED
@@ -1,12 +1,13 @@
1
1
  # Draw all of the routes that will be used in Hubstats
2
2
  Hubstats::Engine.routes.draw do
3
- root to: "pull_requests#index" # sets default root to be the pulls page
4
3
  post "/handler" => "events#handler", :as => :handler
5
- resources :deploys, :only => [:create, :index, :show] # routes to index, show, and to create method
6
- get "/metrics" => "repos#dashboard", :as => :metrics # routes to list of repos and stats
4
+ root to: "pull_requests#index" # sets default root to be the pulls page
7
5
  get "/pulls" => "pull_requests#index", :as => :pulls # routes to list of pulls
6
+ resources :deploys, :only => [:create, :index, :show] # routes to index, show, and to create method
7
+ resources :teams, :only => [:index, :show]
8
8
  get "/users" => "users#index", :as => :users # routes to list of users
9
9
  get "/user/:id" => "users#show", :as => :user # routes to specific user's contributions
10
+ get "/metrics" => "repos#dashboard", :as => :metrics # routes to list of repos and stats
10
11
  get "/repos" => "repos#index", :as => :repos # route is for the repo filter on the pull request and deploys page
11
12
  get "/:repo" => "repos#show", :as => :repo # routes to specific repo's stats
12
13
  scope "/:repo", :as => :repo do
@@ -0,0 +1,8 @@
1
+ class CreateHubstatsTeams < ActiveRecord::Migration
2
+ def change
3
+ create_table :hubstats_teams do |t|
4
+ t.string :name
5
+ t.boolean :hubstats
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,8 @@
1
+ class CreateHubstatsTeamsUsers < ActiveRecord::Migration
2
+ def change
3
+ create_table :hubstats_teams_users do |t|
4
+ t.integer :user_id
5
+ t.integer :team_id
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,5 @@
1
+ class AddTeamIdToPrs < ActiveRecord::Migration
2
+ def change
3
+ add_column :hubstats_pull_requests, :team_id, :integer
4
+ end
5
+ end
data/hubstats.gemspec CHANGED
@@ -17,7 +17,7 @@ Gem::Specification.new do |s|
17
17
  s.test_files = s.files.grep(%r{^(test|spec|features)/})
18
18
 
19
19
  s.add_dependency "rails", "~> 3.2.18"
20
- s.add_dependency "octokit", "~> 3.2"
20
+ s.add_dependency "octokit", "~> 4.0"
21
21
  s.add_dependency "will_paginate-bootstrap"
22
22
  s.add_dependency "select2-rails", "3.5.9"
23
23
  s.add_dependency "bootstrap-datepicker-rails", "~> 1.4.0"
@@ -26,4 +26,5 @@ Gem::Specification.new do |s|
26
26
  s.add_development_dependency "shoulda-matchers", "~> 2.6"
27
27
  s.add_development_dependency "factory_girl_rails", "~> 4.4"
28
28
  s.add_development_dependency "faker", "~> 1.3"
29
+ s.add_development_dependency "test-unit", "~> 3.0"
29
30
  end
@@ -3,9 +3,11 @@ github_auth: # Must include either access_token || (client_id && client_secret)
3
3
  # client_id: <CLIENT ID>
4
4
  # client_secret: <CLIENT SECRET>
5
5
 
6
- github_config: # Must include either org_name || repo_list
6
+ github_config: # Must include org_name. The repo_list, team_list, and ignore_users_list are optional.
7
7
  # org_name: <ORGANIZATION NAME>
8
+ # team_list: [<ARRAY OF TEAMS>]
8
9
  # repo_list: [<ARRAY OF REPOS>]
10
+ # ignore_users_list: [<ARRAY OF USERS' LOGINS TO IGNORE>]
9
11
 
10
12
  webhook_secret: #<40 CHARACTER ACCESS TOKEN >
11
13
  webhook_endpoint: #<url of webhook endpoint>
@@ -17,6 +17,8 @@ module Hubstats
17
17
  pull_processor(payload)
18
18
  when "pull_request_review_comment", "PullRequestReviewCommentEvent"
19
19
  comment_processor(payload, "PullRequest")
20
+ when "membership", "MembershipEvent"
21
+ team_processor(payload)
20
22
  end
21
23
  end
22
24
 
@@ -47,6 +49,24 @@ module Hubstats
47
49
  Hubstats::Comment.create_or_update(comment.with_indifferent_access)
48
50
  end
49
51
 
52
+ # Public - Gets the information for the new team and updates it
53
+ #
54
+ # payload - the information that we will use to get the data off of
55
+ #
56
+ # Returns - nothing, but updates or makes the team
57
+ def team_processor(payload)
58
+ team = payload[:team]
59
+ team[:action] = payload[:action]
60
+ team[:current_user] = payload[:member]
61
+ team_list = Hubstats.config.github_config["team_list"] || []
62
+ if team_list.include? team[:name]
63
+ Hubstats::Team.create_or_update(team.with_indifferent_access)
64
+ hubstats_team = Hubstats::Team.where(name: team[:name]).first
65
+ hubstats_user = Hubstats::User.create_or_update(team[:current_user])
66
+ Hubstats::Team.update_users_in_team(hubstats_team, hubstats_user, team[:action])
67
+ end
68
+ end
69
+
50
70
  # Public - Grabs the PR number off of any of the various places it can be
51
71
  #
52
72
  # payload - the thing that we will use to try to attain the PR number
@@ -52,18 +52,22 @@ module Hubstats
52
52
  #
53
53
  # Returns - an array of github repo objects
54
54
  def self.get_repos
55
- if Hubstats.config.github_config.has_key?("org_name")
56
- repos = client.organization_repositories(Hubstats.config.github_config["org_name"])
57
- else
55
+ if Hubstats.config.github_config.has_key?("org_name") == false
56
+ raise RuntimeError, "COULD NOT COMPLETE RAKE TASK! Organization name in .octokit.yml is required, but was not found."
57
+ end
58
+
59
+ if Hubstats.config.github_config.has_key?("repo_list")
58
60
  repos = []
59
61
  Hubstats.config.github_config["repo_list"].each do |repo|
60
62
  repos << client.repository(repo)
61
63
  end
64
+ elsif Hubstats.config.github_config.has_key?("org_name")
65
+ repos = client.organization_repositories(Hubstats.config.github_config["org_name"])
62
66
  end
63
67
  repos
64
68
  end
65
69
 
66
- # Public - Gets extra information on pull requests, e.g size, additions ...
70
+ # Public - Gets extra information on pull requests, e.g. size, additions ...
67
71
  #
68
72
  # Returns - nothing
69
73
  def self.update_pulls
@@ -71,9 +75,9 @@ module Hubstats
71
75
  begin
72
76
  while Hubstats::PullRequest.where(deletions: nil).where(additions: nil).count > 0
73
77
  client = Hubstats::GithubAPI.client
74
- incomplete = Hubstats::PullRequest.where(deletions: nil).where(additions: nil).limit(grab_size)
78
+ pull_requests = Hubstats::PullRequest.where(deletions: nil).where(additions: nil).limit(grab_size)
75
79
 
76
- incomplete.each do |pull|
80
+ pull_requests.each do |pull|
77
81
  repo = Hubstats::Repo.where(id: pull.repo_id).first
78
82
  pr = client.pull_request(repo.full_name, pull.number)
79
83
  Hubstats::PullRequest.create_or_update(HubHelper.pull_setup(pr))
@@ -87,6 +91,37 @@ module Hubstats
87
91
  end
88
92
  end
89
93
 
94
+ # Public - Gets information on teams, e.g. name
95
+ #
96
+ # Returns - nothing
97
+ def self.update_teams
98
+ grab_size = 250
99
+ begin
100
+ client = Hubstats::GithubAPI.client
101
+ all_teams_in_org = client.organization_teams(Hubstats.config.github_config["org_name"])
102
+ team_list = Hubstats.config.github_config["team_list"] || []
103
+
104
+ all_teams_in_org.each do |team|
105
+ if team_list.include? team[:name]
106
+ puts "Making a team"
107
+ Hubstats::Team.create_or_update(team)
108
+ users = client.team_members(team[:id])
109
+ users.each do |user|
110
+ hubstats_team = Hubstats::Team.where(name: team[:name]).first
111
+ hubstats_user = Hubstats::User.create_or_update(user)
112
+ puts "Adding a user to a team"
113
+ Hubstats::Team.update_users_in_team(hubstats_team, hubstats_user, "added")
114
+ end
115
+ end
116
+ end
117
+ wait_limit(grab_size,client.rate_limit)
118
+ puts "All teams are up to date"
119
+ rescue Faraday::ConnectionFailed
120
+ puts "Connection Timeout, restarting team updating"
121
+ update_teams
122
+ end
123
+ end
124
+
90
125
  # Public - Makes a new webhook from a repository
91
126
  #
92
127
  # repo - the repository that is attempting to have a hook made with
@@ -103,14 +138,7 @@ module Hubstats
103
138
  :secret => Hubstats.config.webhook_secret
104
139
  },
105
140
  {
106
- :events => [
107
- 'pull_request',
108
- 'pull_request_review_comment',
109
- 'commit_comment',
110
- 'issues',
111
- 'issue_comment',
112
- 'member'
113
- ],
141
+ :events => ['pull_request', 'pull_request_review_comment', 'commit_comment', 'issues', 'issue_comment'],
114
142
  :active => true
115
143
  }
116
144
  )
@@ -122,6 +150,34 @@ module Hubstats
122
150
  end
123
151
  end
124
152
 
153
+ # Public - Makes a new webhook from an organization
154
+ #
155
+ # org_name - the name of the organization that is attempting to have a hook made with
156
+ #
157
+ # Returns - the hook and a message (or just a message and no hook)
158
+ def self.create_org_hook(org_name)
159
+ begin
160
+ client.create_hook(
161
+ org_name,
162
+ 'web',
163
+ {
164
+ :url => Hubstats.config.webhook_endpoint,
165
+ :content_type => 'json',
166
+ :secret => Hubstats.config.webhook_secret
167
+ },
168
+ {
169
+ :events => ['membership'],
170
+ :active => true
171
+ }
172
+ )
173
+ puts "Hook on #{org_name} successfully created"
174
+ rescue Octokit::UnprocessableEntity
175
+ puts "Hook on #{org_name} already existed"
176
+ rescue Octokit::NotFound
177
+ puts "You don't have sufficient privileges to add an event hook to #{org_name}"
178
+ end
179
+ end
180
+
125
181
  # Public - Delete webhook from github repository
126
182
  #
127
183
  # repo - a repo github object
@@ -133,7 +189,7 @@ module Hubstats
133
189
  client.hooks(repo.full_name).each do |hook|
134
190
  if hook[:config][:url] == old_endpoint
135
191
  Hubstats::GithubAPI.client.remove_hook(repo.full_name, hook[:id])
136
- puts "successfully deleted hook with id #{hook[:id]} and url #{hook[:config][:url]} from #{repo.full_name}"
192
+ puts "Successfully deleted hook with id #{hook[:id]} and url #{hook[:config][:url]} from #{repo.full_name}"
137
193
  end
138
194
  end
139
195
  rescue Octokit::NotFound