hubstats 1.0.0.beta2 → 1.2.1

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 802a99fc98c0f264072c31356e0ecfb571c2e01ef1563cba5325ce8111c95db8
4
- data.tar.gz: 0de3cc728105f34ff7ba2df58ebae2094f4a28566317ede5aeca35b84ffa82e5
3
+ metadata.gz: 9e5143e6456771677de3cc90bbe833374cf25fbf5ebb682e39e97ce7118c397e
4
+ data.tar.gz: a8af23b964e8455c73e9ab2459c8f60741fcc593e9982e399bf386d955febf68
5
5
  SHA512:
6
- metadata.gz: f52fd3881a286065fe4482934e6e61f397d9c5af62175b664c36992e6a9ea31d4047369b2466f328635487dcf01c36c6f878999bf22dc743f28569b2af9a327f
7
- data.tar.gz: 4b3dbe91fc2e48a6d94fa3cb8f2289ed028414bd9e6f4b44d6c13dc236b4e8c2004ee1743754a0e7ffaec3eb3eaf65988b8de44484961974e153111639e3dcc7
6
+ metadata.gz: 1d5fb94663467fd706e1d6c74afa91c61efb097607ad47e8bfe07d6789997dd1a5aa263fe49a3df6ac4c16eca9fa9eb738e3b812f4582f37a9407df0590fc41d
7
+ data.tar.gz: 89c01859c31a42c1caa47f820475cf83af7335d609ae9734eec9240a07cbc7cc8d027d120485db36320041816dc0186cae945ae03957db6936a2cc642fdcd07b
@@ -1 +1 @@
1
- ruby-2.3.0
1
+ 2.6.1
@@ -1,19 +1,24 @@
1
- sudo: false
1
+ os: linux
2
2
  dist: trusty
3
3
  language: ruby
4
4
  cache: bundler
5
+ install:
6
+ - gem install bundler -v 1.17.3
7
+ - bundle _1.17.3_ install --jobs=3 --retry=3
5
8
 
6
9
  branches:
7
10
  only:
8
11
  - master
12
+
9
13
  rvm:
10
14
  - 2.1
11
15
  - 2.2
12
16
  - 2.3.0
17
+ - 2.3.3
18
+ - 2.6.1
13
19
 
14
20
  script: bundle exec rspec
15
21
  before_script:
16
22
  - bundle exec rake app:db:create
17
23
  - bundle exec rake app:db:migrate
18
24
  - bundle exec rake app:db:test:prepare
19
-
@@ -1,19 +1,6 @@
1
- #### v0.12.2
2
- * Fix bug that results in comments never being saved
1
+ #### v1.2.1
2
+ * IS-12226 Update octokit
3
3
 
4
- > Emma Sax: production-status-check[bot]: https://github.com/sportngin/hubstats/pull/134
4
+ > Emma Sax: production-status-check[bot]: https://github.com/sportngin/hubstats/pull/143
5
5
 
6
- #### v0.12.1
7
- * Show 50 items in detailed show pages
8
-
9
- > Emma Sax: Unknown User: https://github.com/sportngin/hubstats/pull/133
10
-
11
- #### v0.12.0
12
- #### v0.11.5
13
- * Fix bug where adding repositories will break if there are no commits
14
-
15
- > Emma Sax: AJ Stuyvenberg, Unknown User: https://github.com/sportngin/hubstats/pull/131
16
-
17
- #### v0.11.4
18
- #### v0.11.3
19
- #### v0.11.2
6
+ #### v1.2.0
@@ -1,6 +1,6 @@
1
1
  The MIT License (MIT)
2
2
 
3
- Copyright 2015 Sport Ngin
3
+ Copyright 2019 Sport Ngin
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining
6
6
  a copy of this software and associated documentation files (the
@@ -10,24 +10,11 @@ module Hubstats
10
10
  #
11
11
  # Returns - nothing, but makes a new event
12
12
  def handler
13
- # verify_signature(request)
14
-
15
- Rails.logger.warn("Webhook received from Github.")
16
- puts "Webhook received from Github."
17
-
13
+ verify_signature(request)
18
14
  kind = request.headers['X-Github-Event']
19
- Rails.logger.warn("Kind of webhook: #{kind}")
20
- puts "Kind of webhook: #{kind}"
21
-
22
15
  event = event_params.with_indifferent_access
23
- Rails.logger.warn("Event: #{event}")
24
- puts "Event: #{event}"
25
-
26
16
  raw_parameters = request.request_parameters
27
17
  event[:github_action] = raw_parameters["action"]
28
- Rails.logger.warn("Github action: #{event[:github_action]}")
29
- puts "Github action: #{event[:github_action]}"
30
-
31
18
  eventsHandler = Hubstats::EventsHandler.new()
32
19
  eventsHandler.route(event, kind)
33
20
 
@@ -39,12 +26,12 @@ module Hubstats
39
26
  # request - the signature to be checked
40
27
  #
41
28
  # Returns - an error if the signatures don't match
42
- # private def verify_signature(request)
43
- # request.body.rewind
44
- # payload_body = request.body.read
45
- # signature = 'sha1=' + OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new('sha1'), Hubstats.config.webhook_endpoint, payload_body)
46
- # return 500, "Signatures didn't match!" unless Rack::Utils.secure_compare(signature, request.env['HTTP_X_HUB_SIGNATURE'])
47
- # end
29
+ private def verify_signature(request)
30
+ request.body.rewind
31
+ payload_body = request.body.read
32
+ signature = 'sha1=' + OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new('sha1'), Hubstats.config.webhook_endpoint, payload_body)
33
+ return 500, "Signatures didn't match!" unless Rack::Utils.secure_compare(signature, request.env['HTTP_X_HUB_SIGNATURE'])
34
+ end
48
35
 
49
36
  # Private - Allows only these parameters to be added when creating an event
50
37
  #
@@ -9,7 +9,7 @@ module Hubstats
9
9
  # Returns - the team data
10
10
  def index
11
11
  if params[:query] ## For select 2
12
- @teams = Hubstats::Team.where("name LIKE ?", "%#{params[:query]}%").order("name ASC")
12
+ @teams = Hubstats::Team.where(hubstats: true).where("name LIKE ?", "%#{params[:query]}%").order("name ASC")
13
13
  elsif params[:id]
14
14
  @teams = Hubstats::Team.where(id: params[:id].split(",")).order("name ASC")
15
15
  else
@@ -42,7 +42,7 @@ module Hubstats
42
42
  @net_additions = Hubstats::PullRequest.merged_in_date_range(@start_date, @end_date).belonging_to_team(@team.id).sum(:additions).to_i -
43
43
  Hubstats::PullRequest.merged_in_date_range(@start_date, @end_date).belonging_to_team(@team.id).sum(:deletions).to_i
44
44
  @additions = Hubstats::PullRequest.merged_in_date_range(@start_date, @end_date).belonging_to_team(@team.id).average(:additions)
45
- @deletions = Hubstats::PullRequest.merged_in_date_range(@start_date, @end_date).belonging_to_team(@team.id).average(:deletions)
45
+ @deletions = Hubstats::PullRequest.merged_in_date_range(@start_date, @end_date).belonging_to_team(@team.id).average(:deletions)
46
46
 
47
47
  stats
48
48
  end
@@ -47,6 +47,14 @@ module Hubstats
47
47
 
48
48
  has_and_belongs_to_many :users, :join_table => 'hubstats_teams_users', :uniq => true
49
49
 
50
+ # Public - Will change the team's hubstats column to false
51
+ #
52
+ # Returns - the team
53
+ def deprecate_team
54
+ self.update_column(:hubstats, false)
55
+ self.save!
56
+ end
57
+
50
58
  # Public - Checks if the team is currently existing, and if it isn't, then makes a new team with
51
59
  # the specifications that are passed in. We are assuming that if it is not already existent,
52
60
  # then we probably don't really care about the team, so our hubstats boolean will be set to false.
@@ -4,7 +4,7 @@
4
4
  <div class="col-lg-3 col-md-3 col-sm-3">
5
5
  <!-- Show the Sport Ngin copyright information, change if using a different copyright -->
6
6
  <div class="footer-text">
7
- © 2015 Sport Ngin
7
+ © 2019 Sport Ngin
8
8
  </div>
9
9
  </div>
10
10
  <div class="col-lg-6 col-md-6 col-sm-6">
@@ -17,11 +17,15 @@ 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", "~> 4.2.10"
20
- s.add_dependency "rake", "= 12.3.2"
21
- s.add_dependency "octokit", "~> 4.2"
20
+ s.add_dependency "rake", ">= 12.3.3"
21
+ s.add_dependency "octokit", "~> 4.18"
22
22
  s.add_dependency "will_paginate-bootstrap", "~> 1.0"
23
23
  s.add_dependency "select2-rails", "~> 3.0"
24
24
  s.add_dependency "sass-rails"
25
+ s.add_dependency "railties", "~> 4.2.11.1"
26
+ s.add_dependency "jquery-rails", "= 4.3.3"
27
+ s.add_dependency "sprockets", "~> 3.7.2"
28
+ s.add_dependency "sprockets-rails", "~> 2.3.3"
25
29
  s.add_dependency "bootstrap-datepicker-rails", "~> 1.5"
26
30
 
27
31
  s.add_development_dependency "mysql2",'~> 0.3.2'
@@ -1,6 +1,5 @@
1
1
  module Hubstats
2
2
  class EventsHandler
3
-
4
3
  # Public - Processes comments and PRs
5
4
  #
6
5
  # payload - the data that we will be processing
@@ -10,51 +9,46 @@ module Hubstats
10
9
  def route(payload, type)
11
10
  case type
12
11
  when "issue_comment", "IssueCommentEvent"
13
- comment_processor(payload, "Issue")
12
+ comment_processor(payload, "Issue") # comment on a pull request
14
13
  when "commit_comment", "CommitCommentEvent"
15
- comment_processor(payload, "Commit")
16
- when "pull_request", "PullRequestEvent"
17
- pull_processor(payload)
14
+ comment_processor(payload, "Commit") # comment on a pull request commit
18
15
  when "pull_request_review_comment", "PullRequestReviewCommentEvent"
19
- comment_processor(payload, "PullRequest")
16
+ comment_processor(payload, "PullRequest") # comment on a pull request review
17
+ when "pull_request", "PullRequestEvent"
18
+ pull_processor(payload) # new pull request
20
19
  when "membership", "MembershipEvent", "team", "TeamEvent"
21
- team_processor(payload)
20
+ team_processor(payload) # adding/editing/deleting/modifying teams
22
21
  when "repository", "RepositoryEvent"
23
- repository_processor(payload)
22
+ repository_processor(payload) # adding repositories
24
23
  end
25
24
  end
26
25
 
27
- # Public - Gets the information for the PR, creates/updates the new PR, grabs the labels, and makes new labels;
26
+ # Private - Gets the information for the PR, creates/updates the new PR, grabs the labels, and makes new labels;
28
27
  # if the label qa-approved is added or removed, a new QA Signoff record will be made
29
28
  #
30
29
  # payload - the information that we will use to get data off of
31
30
  #
32
31
  # Returns - nothing, but creates/updates the PR and adds appropriate labels
33
- def pull_processor(payload)
32
+ private def pull_processor(payload)
34
33
  pull_request = payload[:pull_request]
35
34
  pull_request[:repository] = payload[:repository]
36
35
  new_pull = Hubstats::PullRequest.create_or_update(pull_request.with_indifferent_access)
36
+
37
37
  if payload[:github_action].include?('labeled')
38
- if payload[:github_action].include?('unlabeled') && payload[:label][:name].include?('qa-approved')
39
- Hubstats::QaSignoff.remove_signoff(payload[:repository][:id], payload[:pull_request][:id])
40
- elsif payload[:label][:name].include?('qa-approved')
41
- Hubstats::QaSignoff.first_or_create(payload[:repository][:id], payload[:pull_request][:id], payload[:sender][:id])
42
- end
43
- new_pull.update_label(payload)
38
+ organize_qa_signoffs(payload, new_pull)
44
39
  else
45
- repo_name = Hubstats::Repo.where(id: new_pull.repo_id).first.full_name
46
- labels = Hubstats::GithubAPI.get_labels_for_pull(repo_name, new_pull.number)
47
- new_pull.add_labels(labels)
40
+ add_labels_to_pull(new_pull)
48
41
  end
42
+
49
43
  new_pull.save!
50
44
  end
51
45
 
52
- # Public - Gets the information for the new comment and updates it
46
+ # Private - Gets the information for the new comment and updates it
53
47
  #
54
48
  # payload - the information that we will use to get data off of
55
49
  #
56
50
  # Returns - nothing, but updates the comment
57
- def comment_processor(payload, kind)
51
+ private def comment_processor(payload, kind)
58
52
  comment = payload[:comment]
59
53
  comment[:kind] = kind
60
54
  comment[:repo_id] = payload[:repository][:id]
@@ -62,48 +56,45 @@ module Hubstats
62
56
  Hubstats::Comment.create_or_update(comment.with_indifferent_access)
63
57
  end
64
58
 
65
- # Public - Gets the information for the new team and updates it
59
+ # Private - Gets the information for the team in the payload and updates it appropriately
66
60
  #
67
61
  # payload - the information that we will use to get the data off of
68
62
  #
69
63
  # Returns - nothing, but updates or makes the team
70
- def team_processor(payload)
71
- team = payload[:team]
72
-
73
- if payload[:scope] == "team" && payload[:github_action] == "added"
74
- if Hubstats::Team.designed_for_hubstats?(team[:description])
75
- Hubstats::Team.create_or_update(team.with_indifferent_access)
76
- hubstats_team = Hubstats::Team.where(name: team[:name]).first
77
- hubstats_user = Hubstats::User.create_or_update(payload[:member])
78
- Hubstats::Team.update_users_in_team(hubstats_team, hubstats_user, payload[:github_action])
79
- end
64
+ private def team_processor(payload)
65
+ # Adding a new hubstats team, adding/removing a person to/from a team, or renaming a team
66
+ if (payload[:scope] == "team" || payload[:github_action] == "edited") &&
67
+ Hubstats::Team.designed_for_hubstats?(payload[:team][:description])
68
+ Hubstats::Team.create_or_update(payload[:team].with_indifferent_access)
69
+ hubstats_team = Hubstats::Team.where(name: payload[:team][:name]).first
70
+ hubstats_user = payload[:member] ? Hubstats::User.create_or_update(payload[:member]) : Hubstats::User.create_or_update(payload[:sender])
71
+ Hubstats::Team.update_users_in_team(hubstats_team, hubstats_user, payload[:github_action])
80
72
  end
81
73
 
82
- if payload[:github_action] == "edited" && Hubstats::Team.designed_for_hubstats?(team[:description])
83
- Hubstats::Team.create_or_update(team.with_indifferent_access)
84
- hubstats_team = Hubstats::Team.where(name: team[:name]).first
85
- hubstats_user = Hubstats::User.create_or_update(payload[:member])
86
- Hubstats::Team.update_users_in_team(hubstats_team, hubstats_user, payload[:github_action])
74
+ # Deleting a hubstats team
75
+ if payload[:scope] == "organization" && payload[:github_action] == "removed"
76
+ deprecate_team(payload)
87
77
  end
88
78
  end
89
79
 
90
- def repository_processor(payload)
91
- repo = payload[:repository]
92
-
80
+ # Private - Gets the information for the repository in the payload and creates/updates it
81
+ #
82
+ # payload - the information that we will use to get the data off of
83
+ #
84
+ # Returns - nothing, but updates or makes the repository
85
+ private def repository_processor(payload)
93
86
  if payload[:github_action] == "created" # it's a new repository
94
- Hubstats::Repo.create_or_update
95
- Hubstats::GithubAPI.create_repo_hook(repo)
96
- # The hook was probably already made when we made the repository,
97
- # but we'll put this here just in case
87
+ Hubstats::Repo.create_or_update(payload[:repository].with_indifferent_access)
88
+ Hubstats::GithubAPI.create_repo_hook(payload[:repository].with_indifferent_access)
98
89
  end
99
90
  end
100
91
 
101
- # Public - Grabs the PR number off of any of the various places it can be
92
+ # Private - Grabs the PR number off of any of the various places it can be
102
93
  #
103
94
  # payload - the thing that we will use to try to attain the PR number
104
95
  #
105
96
  # Returns - the PR number
106
- def get_pull_number(payload)
97
+ private def get_pull_number(payload)
107
98
  if payload[:pull_request]
108
99
  return payload[:pull_request][:number]
109
100
  elsif payload[:issue]
@@ -114,5 +105,41 @@ module Hubstats
114
105
  return nil
115
106
  end
116
107
  end
108
+
109
+ # Private - Will add QA signoffs to a pull request if they're present
110
+ #
111
+ # payload - data that we can add signoffs to
112
+ # new_pull - the pull request we just made or updated
113
+ #
114
+ # Returns - nothing
115
+ private def organize_qa_signoffs(payload, new_pull)
116
+ if payload[:github_action].include?('unlabeled') && payload[:label][:name].include?('qa-approved')
117
+ Hubstats::QaSignoff.remove_signoff(payload[:repository][:id], payload[:pull_request][:id])
118
+ elsif payload[:label][:name].include?('qa-approved')
119
+ Hubstats::QaSignoff.first_or_create(payload[:repository][:id], payload[:pull_request][:id], payload[:sender][:id])
120
+ end
121
+ new_pull.update_label(payload)
122
+ end
123
+
124
+ # Private - Will add labels to pull requests
125
+ #
126
+ # new_pull - the pull request we just made or updated
127
+ #
128
+ # Returns - nothing
129
+ private def add_labels_to_pull(new_pull)
130
+ repo_name = Hubstats::Repo.where(id: new_pull.repo_id).first.full_name
131
+ labels = Hubstats::GithubAPI.get_labels_for_pull(repo_name, new_pull.number)
132
+ new_pull.add_labels(labels)
133
+ end
134
+
135
+ # Private - Will deprecate the team if it is in the DB and needs to be deprecated
136
+ #
137
+ # payload - data that we can add signoffs to
138
+ #
139
+ # Returns - nothing
140
+ private def deprecate_team(payload)
141
+ hubstats_team = Hubstats::Team.where(name: payload[:team][:name]).first
142
+ hubstats_team.deprecate_team if (hubstats_team && hubstats_team[:hubstats])
143
+ end
117
144
  end
118
145
  end
@@ -122,34 +122,17 @@ module Hubstats
122
122
  end
123
123
  end
124
124
 
125
- # Public - Goes through entire team database and updates the hubstats boolean based on the octokit.yml file
126
- #
127
- # Returns - nothing
128
- def self.deprecate_teams
129
- teams = Hubstats::Team.all
130
-
131
- teams.each do |team|
132
- desc = client.team(team.id)[:description]
133
- if Hubstats::Team.designed_for_hubstats?(desc) && (team[:hubstats] == true)
134
- team.update_column(:hubstats, false)
135
- team.save!
136
- puts "Changed #{team[:name]} from true to false"
137
- end
138
- end
139
-
140
- puts "All teams are up to date"
141
- puts "Run 'rake hubstats:update_teams' or 'rake hubstats:update_teams_in_pulls' to grab more teams from GitHub"
142
- end
143
-
144
125
  # Public - Makes a new webhook from a repository
145
126
  #
146
127
  # repo - the repository that is attempting to have a hook made with
147
128
  #
148
129
  # Returns - the hook and a message (or just a message and no hook)
149
130
  def self.create_repo_hook(repo)
131
+ repo_name = repo[:full_name] ? repo[:full_name] : repo.full_name
132
+ puts "Repo that we're going to make a hook on: #{repo_name}"
150
133
  begin
151
134
  client.create_hook(
152
- repo.full_name,
135
+ repo_name,
153
136
  'web',
154
137
  {
155
138
  :url => Hubstats.config.webhook_endpoint,
@@ -161,11 +144,11 @@ module Hubstats
161
144
  :active => true
162
145
  }
163
146
  )
164
- puts "Hook on #{repo.full_name} successfully created"
147
+ puts "Hook on #{repo_name} successfully created"
165
148
  rescue Octokit::UnprocessableEntity
166
- puts "Hook on #{repo.full_name} already existed"
149
+ puts "Hook on #{repo_name} already existed"
167
150
  rescue Octokit::NotFound
168
- puts "You don't have sufficient privileges to add an event hook to #{repo.full_name}"
151
+ puts "You don't have sufficient privileges to add an event hook to #{repo_name}"
169
152
  end
170
153
  end
171
154
 
@@ -1,3 +1,3 @@
1
1
  module Hubstats
2
- VERSION = "1.0.0.beta2"
2
+ VERSION = "1.2.1"
3
3
  end
@@ -18,18 +18,18 @@ namespace :hubstats do
18
18
  Rake::Task['hubstats:setup'].invoke
19
19
  end
20
20
 
21
- desc "Updates changes to the config file"
22
- task :update => :environment do
23
- puts "Updating repos and teams"
24
- Rake::Task['hubstats:populate:update'].invoke
25
- end
26
-
27
21
  desc "Updates the seed"
28
22
  task :seed => :environment do
29
23
  puts "Updating seed"
30
24
  Rake::Task['db:seed'].invoke
31
25
  end
32
26
 
27
+ desc "Updates changes to the config file"
28
+ task :update => :environment do
29
+ puts "Updating repos and teams"
30
+ Rake::Task['hubstats:populate:update'].invoke
31
+ end
32
+
33
33
  desc "Updates the teams for past pull requests"
34
34
  task :update_teams_in_pulls => :environment do
35
35
  puts "Updating teams for past pull requests"
@@ -42,12 +42,6 @@ namespace :hubstats do
42
42
  Rake::Task['hubstats:populate:update_teams'].invoke
43
43
  end
44
44
 
45
- desc "Deprecates teams"
46
- task :deprecate_teams => :environment do
47
- puts "Deprecating teams"
48
- Rake::Task['hubstats:populate:deprecate_teams'].invoke
49
- end
50
-
51
45
  desc "Creates webhook from github for organization"
52
46
  task :make_org_webhook => :environment do
53
47
  puts "Making a webhook for an organization in octokit.yml"
@@ -33,7 +33,7 @@ namespace :hubstats do
33
33
 
34
34
  desc "Updates teams for past pull requests"
35
35
  task :update_teams_in_pulls => :environment do
36
- update_teams_in_prs
36
+ Hubstats::PullRequest.update_teams_in_pulls(365)
37
37
  end
38
38
 
39
39
  desc "Updates the teams"
@@ -41,21 +41,8 @@ namespace :hubstats do
41
41
  update_teams
42
42
  end
43
43
 
44
- desc "Deprecates teams"
45
- task :deprecate_teams => :environment do
46
- Hubstats::GithubAPI.deprecate_teams
47
- end
48
-
49
44
  desc "Creates the webhook for the current org"
50
45
  task :create_organization_hook => :environment do
51
- create_org_hook
52
- end
53
-
54
- task :create_org_hook => :environment do
55
- create_org_hook
56
- end
57
-
58
- private def create_org_hook
59
46
  Hubstats::GithubAPI.create_org_hook(Hubstats.config.github_config["org_name"])
60
47
  end
61
48
 
@@ -70,6 +57,14 @@ namespace :hubstats do
70
57
  # populate_labels(repo)
71
58
  end
72
59
 
60
+ private def update_pulls
61
+ Hubstats::GithubAPI.update_pulls
62
+ end
63
+
64
+ private def update_teams
65
+ Hubstats::GithubAPI.update_teams
66
+ end
67
+
73
68
  private def populate_users(repo)
74
69
  repo = repo_checker(repo)
75
70
  puts "Adding contributors to " + repo.full_name
@@ -102,18 +97,6 @@ namespace :hubstats do
102
97
  Hubstats::GithubAPI.add_labels(repo)
103
98
  end
104
99
 
105
- private def update_pulls
106
- Hubstats::GithubAPI.update_pulls
107
- end
108
-
109
- private def update_teams
110
- Hubstats::GithubAPI.update_teams
111
- end
112
-
113
- private def update_teams_in_prs
114
- Hubstats::PullRequest.update_teams_in_pulls(365)
115
- end
116
-
117
100
  private def repo_checker(args)
118
101
  raise ArgumentError, "Must be called with repo argument. [:org/:repo]" if args.nil?
119
102
  if args.is_a? String
@@ -11,6 +11,14 @@ FactoryGirl.define do
11
11
  id 101010
12
12
  name "Hubstats"
13
13
  full_name "hub/hubstats"
14
- initialize_with { attributes }
14
+ initialize_with { attributes }
15
+ end
16
+
17
+ factory :repo_payload_hash, class:Hash do
18
+ id {Faker::Number.number(6).to_i}
19
+ type "RepositoryEvent"
20
+ association :user, factory: :user_hash, strategy: :build
21
+ association :repo, factory: :repo_hash, strategy: :build
22
+ initialize_with { attributes }
15
23
  end
16
24
  end
@@ -136,7 +136,79 @@ module Hubstats
136
136
  expect(Hubstats::Team).to receive(:create_or_update).and_return(team)
137
137
  ehandler.route(payload, "MembershipEvent")
138
138
  end
139
+
140
+ it 'should successfully remove a member from a team' do
141
+ ehandler = Hubstats::EventsHandler.new()
142
+ payload = build(:team_payload_hash)
143
+ team = build(:team)
144
+ user = build(:user)
145
+ allow(Hubstats::User).to receive(:create_or_update).and_return(user)
146
+ allow(payload).to receive(:[]).with(:event).and_return(payload)
147
+ allow(payload).to receive(:[]).with(:team).and_return({:name => "Team One", :description => "Hubstats"})
148
+ allow(payload).to receive(:[]).with(:member).and_return(user)
149
+ allow(payload).to receive(:[]).with(:github_action).and_return("removed")
150
+ allow(payload).to receive(:[]).with(:scope).and_return("team")
151
+ allow(payload).to receive(:[]).with(:action).and_return("removed")
152
+ expect(Hubstats::Team).to receive(:update_users_in_team)
153
+ expect(Hubstats::Team).to receive(:create_or_update).and_return(team)
154
+ ehandler.route(payload, "MembershipEvent")
155
+ end
156
+
157
+ it 'should successfully delete a team' do
158
+ ehandler = Hubstats::EventsHandler.new()
159
+ payload = build(:team_payload_hash)
160
+ team = build(:team)
161
+ user = build(:user)
162
+ allow(Hubstats::User).to receive(:create_or_update).and_return(user)
163
+ allow(payload).to receive(:[]).with(:event).and_return(payload)
164
+ allow(payload).to receive(:[]).with(:team).and_return({:name => "Team One", :description => "Hubstats"})
165
+ allow(payload).to receive(:[]).with(:member).and_return(user)
166
+ allow(payload).to receive(:[]).with(:github_action).and_return("removed")
167
+ allow(payload).to receive(:[]).with(:scope).and_return("organization")
168
+ allow(payload).to receive(:[]).with(:action).and_return("removed")
169
+ expect(Hubstats::Team).not_to receive(:update_users_in_team)
170
+ expect(Hubstats::Team).not_to receive(:create_or_update)
171
+ ehandler.route(payload, "MembershipEvent")
172
+ end
173
+
174
+ it 'should successfully rename a team' do
175
+ ehandler = Hubstats::EventsHandler.new()
176
+ payload = build(:team_payload_hash)
177
+ team = build(:team)
178
+ user = build(:user)
179
+ allow(Hubstats::User).to receive(:create_or_update).and_return(user)
180
+ allow(payload).to receive(:[]).with(:event).and_return(payload)
181
+ allow(payload).to receive(:[]).with(:team).and_return({:name => "Team One", :description => "Hubstats"})
182
+ allow(payload).to receive(:[]).with(:sender).and_return(user)
183
+ allow(payload).to receive(:[]).with(:member).and_return(nil)
184
+ allow(payload).to receive(:[]).with(:scope).and_return(nil)
185
+ allow(payload).to receive(:[]).with(:github_action).and_return("edited")
186
+ allow(payload).to receive(:[]).with(:action).and_return("edited")
187
+ expect(Hubstats::Team).to receive(:update_users_in_team)
188
+ expect(Hubstats::Team).to receive(:create_or_update).and_return(team)
189
+ ehandler.route(payload, "MembershipEvent")
190
+ end
139
191
  end
140
192
 
193
+ context "RepositoryEvent" do
194
+ it 'should successfully route the repository' do
195
+ ehandler = EventsHandler.new()
196
+ payload = build(:repo_payload_hash)
197
+ expect(ehandler).to receive(:repository_processor)
198
+ ehandler.route(payload, payload[:type])
199
+ end
200
+
201
+ it 'should successfully process the repository' do
202
+ ehandler = Hubstats::EventsHandler.new()
203
+ payload = build(:repo_payload_hash)
204
+ allow(payload).to receive(:[]).with(:event).and_return(payload)
205
+ allow(payload).to receive(:[]).with(:repository).and_return({:full_name => "sportngin/test"})
206
+ allow(payload).to receive(:[]).with(:github_action).and_return("created")
207
+ allow(payload).to receive(:[]).with(:action).and_return("created")
208
+ expect(Hubstats::Repo).to receive(:create_or_update)
209
+ expect(Hubstats::GithubAPI).to receive(:create_repo_hook).and_return(true)
210
+ ehandler.route(payload, "RepositoryEvent")
211
+ end
212
+ end
141
213
  end
142
214
  end
@@ -103,29 +103,6 @@ module Hubstats
103
103
  end
104
104
  end
105
105
 
106
- context '.deprecate_teams' do
107
- subject {Hubstats::GithubAPI}
108
- let(:team1) {create(:team, :name => "Team One")}
109
- let(:team2) {create(:team, :name => "Team Two")}
110
- let(:team3) {create(:team, :name => "Team Three")}
111
- let(:team4) {create(:team, :name => "Team Four")}
112
- let(:team5) {create(:team, :name => "Team Five")}
113
- let(:octokit_team) {double(:octokit_team, description: "Description for Hubstats")}
114
- let(:client) {double(:octokit_client, team: octokit_team)}
115
-
116
- before do
117
- allow(octokit_team).to receive(:[]).with(:description).and_return("Description for Hubstats")
118
- end
119
-
120
- it 'should update the teams in the database based on a given whitelist' do
121
- allow(Hubstats::Team).to receive(:all).and_return( [team1, team2, team3, team4, team5] )
122
- allow(client).to receive(:team).and_return(octokit_team)
123
- allow(subject).to receive(:client).and_return(client)
124
- expect(team5).to receive(:update_column).with(:hubstats, false)
125
- subject.deprecate_teams
126
- end
127
- end
128
-
129
106
  context ".create_repo_hook" do
130
107
  subject {Hubstats::GithubAPI}
131
108
  let(:config) {double(:webhook_secret => 'a1b2c3d4', :webhook_endpoint => "hubstats.com")}
@@ -134,6 +111,7 @@ module Hubstats
134
111
  before do
135
112
  allow(Hubstats).to receive(:config) {config}
136
113
  allow(subject).to receive(:client) {client}
114
+ allow(repo).to receive(:[]).with(:full_name)
137
115
  end
138
116
 
139
117
  it "should call octokit create_hook for repositories" do
@@ -167,6 +145,5 @@ module Hubstats
167
145
  subject.create_org_hook(org)
168
146
  end
169
147
  end
170
-
171
148
  end
172
149
  end
@@ -4,6 +4,8 @@ require File.expand_path("../../test/dummy/config/environment", __FILE__)
4
4
  require 'rspec/rails'
5
5
  require 'factory_girl_rails'
6
6
  require 'faker'
7
+ require 'test_response_patch'
8
+
7
9
  # Requires supporting ruby files with custom matchers and macros, etc, in
8
10
  # spec/support/ and its subdirectories. Files matching `spec/**/*_spec.rb` are
9
11
  # run as spec files by default. This means that files in spec/support that end
@@ -23,7 +25,7 @@ RSpec.configure do |config|
23
25
  # config.mock_with :rr
24
26
 
25
27
  config.include FactoryGirl::Syntax::Methods
26
-
28
+
27
29
  # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
28
30
  # config.fixture_path = "#{::Rails.root}/spec/fixtures"
29
31
 
@@ -0,0 +1,14 @@
1
+ # The suggestion for this file is from: https://github.com/rails/rails/issues/34790
2
+ if RUBY_VERSION >= '2.6.0'
3
+ if Rails.version < '5'
4
+ class ActionController::TestResponse < ActionDispatch::TestResponse
5
+ def recycle!
6
+ @mon_mutex_owner_object_id = nil
7
+ @mon_mutex = nil
8
+ initialize
9
+ end
10
+ end
11
+ else
12
+ raise 'This monkey patch is no longer needed. Please remove this.'
13
+ end
14
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hubstats
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0.beta2
4
+ version: 1.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Elliot Hursh
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2019-01-18 00:00:00.000000000 Z
12
+ date: 2020-06-12 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails
@@ -29,30 +29,30 @@ dependencies:
29
29
  name: rake
30
30
  requirement: !ruby/object:Gem::Requirement
31
31
  requirements:
32
- - - '='
32
+ - - ">="
33
33
  - !ruby/object:Gem::Version
34
- version: 12.3.2
34
+ version: 12.3.3
35
35
  type: :runtime
36
36
  prerelease: false
37
37
  version_requirements: !ruby/object:Gem::Requirement
38
38
  requirements:
39
- - - '='
39
+ - - ">="
40
40
  - !ruby/object:Gem::Version
41
- version: 12.3.2
41
+ version: 12.3.3
42
42
  - !ruby/object:Gem::Dependency
43
43
  name: octokit
44
44
  requirement: !ruby/object:Gem::Requirement
45
45
  requirements:
46
46
  - - "~>"
47
47
  - !ruby/object:Gem::Version
48
- version: '4.2'
48
+ version: '4.18'
49
49
  type: :runtime
50
50
  prerelease: false
51
51
  version_requirements: !ruby/object:Gem::Requirement
52
52
  requirements:
53
53
  - - "~>"
54
54
  - !ruby/object:Gem::Version
55
- version: '4.2'
55
+ version: '4.18'
56
56
  - !ruby/object:Gem::Dependency
57
57
  name: will_paginate-bootstrap
58
58
  requirement: !ruby/object:Gem::Requirement
@@ -95,6 +95,62 @@ dependencies:
95
95
  - - ">="
96
96
  - !ruby/object:Gem::Version
97
97
  version: '0'
98
+ - !ruby/object:Gem::Dependency
99
+ name: railties
100
+ requirement: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - "~>"
103
+ - !ruby/object:Gem::Version
104
+ version: 4.2.11.1
105
+ type: :runtime
106
+ prerelease: false
107
+ version_requirements: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - "~>"
110
+ - !ruby/object:Gem::Version
111
+ version: 4.2.11.1
112
+ - !ruby/object:Gem::Dependency
113
+ name: jquery-rails
114
+ requirement: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - '='
117
+ - !ruby/object:Gem::Version
118
+ version: 4.3.3
119
+ type: :runtime
120
+ prerelease: false
121
+ version_requirements: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - '='
124
+ - !ruby/object:Gem::Version
125
+ version: 4.3.3
126
+ - !ruby/object:Gem::Dependency
127
+ name: sprockets
128
+ requirement: !ruby/object:Gem::Requirement
129
+ requirements:
130
+ - - "~>"
131
+ - !ruby/object:Gem::Version
132
+ version: 3.7.2
133
+ type: :runtime
134
+ prerelease: false
135
+ version_requirements: !ruby/object:Gem::Requirement
136
+ requirements:
137
+ - - "~>"
138
+ - !ruby/object:Gem::Version
139
+ version: 3.7.2
140
+ - !ruby/object:Gem::Dependency
141
+ name: sprockets-rails
142
+ requirement: !ruby/object:Gem::Requirement
143
+ requirements:
144
+ - - "~>"
145
+ - !ruby/object:Gem::Version
146
+ version: 2.3.3
147
+ type: :runtime
148
+ prerelease: false
149
+ version_requirements: !ruby/object:Gem::Requirement
150
+ requirements:
151
+ - - "~>"
152
+ - !ruby/object:Gem::Version
153
+ version: 2.3.3
98
154
  - !ruby/object:Gem::Dependency
99
155
  name: bootstrap-datepicker-rails
100
156
  requirement: !ruby/object:Gem::Requirement
@@ -365,6 +421,7 @@ files:
365
421
  - spec/models/hubstats/team_spec.rb
366
422
  - spec/models/hubstats/user_spec.rb
367
423
  - spec/spec_helper.rb
424
+ - spec/test_response_patch.rb
368
425
  - test/dummy/README.rdoc
369
426
  - test/dummy/Rakefile
370
427
  - test/dummy/app/assets/javascripts/application.js
@@ -416,12 +473,11 @@ required_ruby_version: !ruby/object:Gem::Requirement
416
473
  version: '0'
417
474
  required_rubygems_version: !ruby/object:Gem::Requirement
418
475
  requirements:
419
- - - ">"
476
+ - - ">="
420
477
  - !ruby/object:Gem::Version
421
- version: 1.3.1
478
+ version: '0'
422
479
  requirements: []
423
- rubyforge_project:
424
- rubygems_version: 2.7.8
480
+ rubygems_version: 3.0.1
425
481
  signing_key:
426
482
  specification_version: 4
427
483
  summary: Github Statistics
@@ -454,6 +510,7 @@ test_files:
454
510
  - spec/models/hubstats/team_spec.rb
455
511
  - spec/models/hubstats/user_spec.rb
456
512
  - spec/spec_helper.rb
513
+ - spec/test_response_patch.rb
457
514
  - test/dummy/README.rdoc
458
515
  - test/dummy/Rakefile
459
516
  - test/dummy/app/assets/javascripts/application.js