codeclimate-services 0.4.1 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 09c50b131c87eef76cf123ce50096e9be93e38a0
4
- data.tar.gz: bd7f6de0a9958fa0b7cd0e391ba48e1bb9fea7b4
3
+ metadata.gz: fd43be14f3a358c801335f30ab99aa3e72e65362
4
+ data.tar.gz: fa21aa050c37330b29af67477d078f5b4aa262c9
5
5
  SHA512:
6
- metadata.gz: 52dd437c1e971a66cd1f4d2d68aa19e94c78d518bf72776d181eae8964103483ef1719859c91be038416291bc009a095dc3d55ee52cbc6f3c24dcbdf6504682d
7
- data.tar.gz: d30b3ded92c7ef1dce8f40d41dded29e5f14b3813164110ebdff15fb87a66e8044a47e1aa40cd46901937e4ac805a09a7124b02d120dddeddcd7e65b841062a7
6
+ metadata.gz: 48410aea9beb76e44066ed178a98a54f58d6cbe308d58fdbbf11b7d8aa4e5c5a1d0d0722661eac46bb7bcade9594f3ce840b3b4fb6341f68be419376182f010e
7
+ data.tar.gz: 281c5a7829bac3d55eff0c2884a6f9d31eaa801abde6f2fa4c8246277735cc884d89941a526e27debf3c82b4b72c853b34d131abeb8817743f911bc00c7c6720
@@ -1,6 +1,6 @@
1
1
  module CC
2
2
  class Service
3
- class GitHubPullRequestsPresenter
3
+ class PullRequestsPresenter
4
4
  include ActiveSupport::NumberHelper
5
5
 
6
6
  def initialize(payload)
@@ -12,6 +12,18 @@ module CC
12
12
  end
13
13
  end
14
14
 
15
+ def error_message
16
+ "Code Climate encountered an error attempting to analyze this pull request."
17
+ end
18
+
19
+ def pending_message
20
+ "Code Climate is analyzing this code."
21
+ end
22
+
23
+ def skipped_message
24
+ "Code Climate has skipped analysis of this commit."
25
+ end
26
+
15
27
  def success_message
16
28
  if both_issue_counts_zero?
17
29
  "Code Climate didn't find any new or fixed issues."
@@ -1,10 +1,10 @@
1
- require "cc/presenters/github_pull_requests_presenter"
1
+ require "cc/presenters/pull_requests_presenter"
2
2
 
3
3
  class CC::Service::GitHubPullRequests < CC::Service
4
4
  class Config < CC::Service::Config
5
5
  attribute :oauth_token, String,
6
6
  label: "OAuth Token",
7
- description: "A personal OAuth token with permissions for the repo. The owner of the token will be the author of the pull request comment."
7
+ description: "A personal OAuth token with permissions for the repo."
8
8
  attribute :update_status, Boolean,
9
9
  label: "Update status?",
10
10
  description: "Update the pull request status after analyzing?"
@@ -24,9 +24,6 @@ class CC::Service::GitHubPullRequests < CC::Service
24
24
 
25
25
  BODY_REGEX = %r{<b>Code Climate</b> has <a href=".*">analyzed this pull request</a>}
26
26
  COMMENT_BODY = '<img src="https://codeclimate.com/favicon.png" width="20" height="20" />&nbsp;<b>Code Climate</b> has <a href="%s">analyzed this pull request</a>.'
27
- MESSAGES = [
28
- DEFAULT_ERROR = "Code Climate encountered an error attempting to analyze this pull request",
29
- ]
30
27
 
31
28
  # Just make sure we can access GH using the configured token. Without
32
29
  # additional information (github-slug, PR number, etc) we can't test much
@@ -70,10 +67,7 @@ private
70
67
  end
71
68
 
72
69
  def update_status_skipped
73
- update_status(
74
- "success",
75
- "Code Climate has skipped analysis of this commit."
76
- )
70
+ update_status("success", presenter.skipped_message)
77
71
  end
78
72
 
79
73
  def update_status_success
@@ -87,18 +81,21 @@ private
87
81
  end
88
82
 
89
83
  def presenter
90
- CC::Service::GitHubPullRequestsPresenter.new(@payload)
84
+ CC::Service::PullRequestsPresenter.new(@payload)
91
85
  end
92
86
 
93
87
  def update_status_error
94
88
  update_status(
95
89
  "error",
96
- @payload["message"] || DEFAULT_ERROR
90
+ @payload["message"] || presenter.error_message
97
91
  )
98
92
  end
99
93
 
100
94
  def update_status_pending
101
- update_status("pending", "Code Climate is analyzing this code.")
95
+ update_status(
96
+ "pending",
97
+ @payload["message"] || presenter.pending_message
98
+ )
102
99
  end
103
100
 
104
101
  def update_status(state, description)
@@ -0,0 +1,98 @@
1
+ require "base64"
2
+ require "cc/presenters/pull_requests_presenter"
3
+
4
+ class CC::Service::StashPullRequests < CC::Service
5
+ class Config < CC::Service::Config
6
+ attribute :domain, String,
7
+ description: "Your Stash host domain (e.g. yourstash.com:PORT, please exclude https://)"
8
+ attribute :username, String
9
+ attribute :password, Password
10
+
11
+ validates :domain, presence: true
12
+ validates :username, presence: true
13
+ validates :password, presence: true
14
+ end
15
+
16
+ self.title = "Stash Pull Requests"
17
+ self.description = "Update pull requests on Stash"
18
+
19
+ STASH_STATES = {
20
+ "error" => "FAILED",
21
+ "failure" => "FAILED",
22
+ "pending" => "INPROGRESS",
23
+ "skipped" => "SUCCESSFUL",
24
+ "success" => "SUCCESSFUL",
25
+ }.freeze
26
+
27
+ def receive_test
28
+ setup_http
29
+
30
+ service_get(test_url)
31
+
32
+ { ok: true, message: "Test succeeded" }
33
+ rescue HTTPError => e
34
+ { ok: false, message: e.message }
35
+ end
36
+
37
+ def receive_pull_request
38
+ setup_http
39
+
40
+ params = {
41
+ description: description,
42
+ key: "Code Climate",
43
+ name: "Code Climate",
44
+ state: state,
45
+ url: @payload["details_url"],
46
+ }
47
+ service_post(url, params.to_json)
48
+ end
49
+
50
+ private
51
+
52
+ def test_url
53
+ "http://#{config.domain}/rest/api/1.0/users"
54
+ end
55
+
56
+ def url
57
+ "http://#{config.domain}/rest/build-status/1.0/commits/#{commit_sha}"
58
+ end
59
+
60
+ def commit_sha
61
+ @payload.fetch("commit_sha")
62
+ end
63
+
64
+ def description
65
+ return @payload["message"] if @payload["message"]
66
+
67
+ case @payload["state"]
68
+ when "pending"
69
+ presenter.pending_message
70
+ when "success", "failure"
71
+ presenter.success_message
72
+ when "skipped"
73
+ presenter.skipped_message
74
+ when "error"
75
+ presenter.error_message
76
+ end
77
+ end
78
+
79
+ def state
80
+ STASH_STATES[@payload["state"]]
81
+ end
82
+
83
+ def setup_http
84
+ http.headers["Content-Type"] = "application/json"
85
+ http.headers["Authorization"] = "Basic #{auth_token}"
86
+ http.headers["User-Agent"] = "Code Climate"
87
+ end
88
+
89
+ # Following Basic Auth headers here:
90
+ # https://developer.atlassian.com/stash/docs/latest/how-tos/example-basic-authentication.html
91
+ def auth_token
92
+ Base64.encode64("#{config.username}:#{config.password}")
93
+ end
94
+
95
+ def presenter
96
+ CC::Service::PullRequestsPresenter.new(@payload)
97
+ end
98
+ end
@@ -1,5 +1,5 @@
1
1
  module CC
2
2
  module Services
3
- VERSION = "0.4.1"
3
+ VERSION = "0.5.0"
4
4
  end
5
5
  end
@@ -62,7 +62,7 @@ class TestGitHubPullRequests < CC::Service::TestCase
62
62
  def test_pull_request_status_error
63
63
  expect_status_update("pbrisbin/foo", "abc123", {
64
64
  "state" => "error",
65
- "description" => CC::Service::GitHubPullRequests::DEFAULT_ERROR,
65
+ "description" => "Code Climate encountered an error attempting to analyze this pull request.",
66
66
  })
67
67
 
68
68
  receive_pull_request({ update_status: true }, {
@@ -1,7 +1,7 @@
1
1
  require "helper"
2
- require "cc/presenters/github_pull_requests_presenter"
2
+ require "cc/presenters/pull_requests_presenter"
3
3
 
4
- class TestGitHubPullRequestsPresenter < CC::Service::TestCase
4
+ class TestPullRequestsPresenter < CC::Service::TestCase
5
5
  def test_message_singular
6
6
  assert_equal(
7
7
  "Code Climate found 1 new issue and 1 fixed issue.",
@@ -44,6 +44,6 @@ private
44
44
  end
45
45
 
46
46
  def build_presenter(issue_counts)
47
- CC::Service::GitHubPullRequestsPresenter.new(build_payload(issue_counts))
47
+ CC::Service::PullRequestsPresenter.new(build_payload(issue_counts))
48
48
  end
49
49
  end
@@ -0,0 +1,146 @@
1
+ require File.expand_path('../helper', __FILE__)
2
+
3
+ class TestStashPullRequests < CC::Service::TestCase
4
+ def test_receive_test
5
+ @stubs.get "/rest/api/1.0/users" do
6
+ [200, {}, "{ 'values': [] }"]
7
+ end
8
+
9
+ response = receive_test
10
+
11
+ assert_equal({ ok: true, message: "Test succeeded" }, response)
12
+ end
13
+
14
+ def test_failed_receive_test
15
+ @stubs.get "/rest/api/1.0/users" do
16
+ [401, {}, ""]
17
+ end
18
+
19
+ response = receive_test
20
+
21
+ assert_equal({ ok: false, message: "API request unsuccessful (401)" }, response)
22
+ end
23
+
24
+ def test_pull_request_status_pending
25
+ expect_status_update("abc123", {
26
+ "state" => "INPROGRESS",
27
+ "description" => /is analyzing/,
28
+ })
29
+
30
+ receive_pull_request(
31
+ commit_sha: "abc123",
32
+ state: "pending",
33
+ )
34
+ end
35
+
36
+ def test_pull_request_status_success_detailed
37
+ expect_status_update("abc123", {
38
+ "state" => "SUCCESSFUL",
39
+ "description" => "Code Climate found 2 new issues and 1 fixed issue.",
40
+ })
41
+
42
+ receive_pull_request(
43
+ commit_sha: "abc123",
44
+ state: "success",
45
+ )
46
+ end
47
+
48
+ def test_pull_request_status_failure
49
+ expect_status_update("abc123", {
50
+ "state" => "FAILED",
51
+ "description" => "Code Climate found 2 new issues and 1 fixed issue.",
52
+ })
53
+
54
+ receive_pull_request(
55
+ commit_sha: "abc123",
56
+ state: "failure"
57
+ )
58
+ end
59
+
60
+ def test_pull_request_status_error
61
+ expect_status_update("abc123", {
62
+ "state" => "FAILED",
63
+ "description" => "Code Climate encountered an error attempting to analyze this pull request."
64
+ })
65
+
66
+ receive_pull_request(
67
+ commit_sha: "abc123",
68
+ state: "error"
69
+ )
70
+ end
71
+
72
+ def test_pull_request_status_error_message_provided
73
+ message = "Everything broke."
74
+
75
+ expect_status_update("abc123", {
76
+ "state" => "FAILED",
77
+ "description" => message
78
+ })
79
+
80
+ receive_pull_request(
81
+ commit_sha: "abc123",
82
+ message: message,
83
+ state: "error"
84
+ )
85
+ end
86
+
87
+ def test_pull_request_status_skipped
88
+ expect_status_update("abc123", {
89
+ "state" => "SUCCESSFUL",
90
+ "description" => "Code Climate has skipped analysis of this commit."
91
+ })
92
+
93
+ receive_pull_request(
94
+ commit_sha: "abc123",
95
+ state: "skipped",
96
+ )
97
+ end
98
+
99
+ def test_failed_receive_pull_request
100
+ commit_sha = "abc123"
101
+
102
+ @stubs.post("/rest/build-status/1.0/commits/#{commit_sha}") do
103
+ [401, {}, ""]
104
+ end
105
+
106
+ assert_raises(CC::Service::HTTPError) do
107
+ receive_pull_request(
108
+ commit_sha: "abc123",
109
+ state: "success",
110
+ )
111
+ end
112
+ end
113
+
114
+ private
115
+
116
+ def expect_status_update(commit_sha, params)
117
+ @stubs.post("/rest/build-status/1.0/commits/#{commit_sha}") do |env|
118
+ body = JSON.parse(env[:body])
119
+
120
+ params.each do |k, v|
121
+ assert v === body[k],
122
+ "Unexpected value for #{k}. #{v.inspect} !== #{body[k].inspect}"
123
+ end
124
+ end
125
+ end
126
+
127
+ def default_config
128
+ { domain: "example.com", username: "zaphod", password: "g4rgl3bl4st3r" }
129
+ end
130
+
131
+ def receive_pull_request(event_data, config = {})
132
+ receive(
133
+ CC::Service::StashPullRequests,
134
+ default_config.merge(config),
135
+ { name: "pull_request", issue_comparison_counts: {'fixed' => 1, 'new' => 2} }.merge(event_data)
136
+ )
137
+ end
138
+
139
+ def receive_test(config = {}, event_data = {})
140
+ receive(
141
+ CC::Service::StashPullRequests,
142
+ default_config.merge(config),
143
+ { name: "test" }.merge(event_data)
144
+ )
145
+ end
146
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: codeclimate-services
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bryan Helmkamp
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-09-15 00:00:00.000000000 Z
11
+ date: 2015-09-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
@@ -167,7 +167,7 @@ files:
167
167
  - lib/cc/helpers/issue_helper.rb
168
168
  - lib/cc/helpers/quality_helper.rb
169
169
  - lib/cc/helpers/vulnerability_helper.rb
170
- - lib/cc/presenters/github_pull_requests_presenter.rb
170
+ - lib/cc/presenters/pull_requests_presenter.rb
171
171
  - lib/cc/service.rb
172
172
  - lib/cc/service/config.rb
173
173
  - lib/cc/service/formatter.rb
@@ -191,6 +191,7 @@ files:
191
191
  - lib/cc/services/lighthouse.rb
192
192
  - lib/cc/services/pivotal_tracker.rb
193
193
  - lib/cc/services/slack.rb
194
+ - lib/cc/services/stash_pull_requests.rb
194
195
  - lib/cc/services/version.rb
195
196
  - pull_request_test.rb
196
197
  - service_test.rb
@@ -210,9 +211,10 @@ files:
210
211
  - test/jira_test.rb
211
212
  - test/lighthouse_test.rb
212
213
  - test/pivotal_tracker_test.rb
213
- - test/presenters/github_pull_requests_presenter_test.rb
214
+ - test/presenters/pull_requests_presenter_test.rb
214
215
  - test/service_test.rb
215
216
  - test/slack_test.rb
217
+ - test/stash_pull_requests_test.rb
216
218
  - test/support/fake_logger.rb
217
219
  - test/with_metrics_test.rb
218
220
  homepage: ''
@@ -235,7 +237,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
235
237
  version: '0'
236
238
  requirements: []
237
239
  rubyforge_project:
238
- rubygems_version: 2.0.14
240
+ rubygems_version: 2.4.7
239
241
  signing_key:
240
242
  specification_version: 4
241
243
  summary: Service classes for Code Climate
@@ -256,8 +258,9 @@ test_files:
256
258
  - test/jira_test.rb
257
259
  - test/lighthouse_test.rb
258
260
  - test/pivotal_tracker_test.rb
259
- - test/presenters/github_pull_requests_presenter_test.rb
261
+ - test/presenters/pull_requests_presenter_test.rb
260
262
  - test/service_test.rb
261
263
  - test/slack_test.rb
264
+ - test/stash_pull_requests_test.rb
262
265
  - test/support/fake_logger.rb
263
266
  - test/with_metrics_test.rb