codeclimate-services 1.9.3 → 1.9.4
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 +4 -4
- data/lib/cc/services/asana.rb +14 -3
- data/lib/cc/services/version.rb +1 -1
- data/spec/cc/service/asana_spec.rb +90 -46
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a5909cb3641c879372c0c98ea0e1535d948a1273
|
4
|
+
data.tar.gz: e89f483cd5935228006a8069ad637c363d04e654
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a08685ea16c0972db7bbf463e092fa4d7b92e17c9637c2a01261383932206d77de6801b393bb435ae6812bab37dd4e853cb6db5c71e5d1f4011dc00090b21f4d
|
7
|
+
data.tar.gz: 9981e7535f62faf0eb3e3bd5879e0242777cbaaed86e08151f5d8a820bd3009518927b4ded6990a6e5ab240f50b1a973414316fa0fef49ef0745930ceb564440
|
data/lib/cc/services/asana.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
class CC::Service::Asana < CC::Service
|
2
2
|
class Config < CC::Service::Config
|
3
|
-
attribute :
|
3
|
+
attribute :personal_access_token, Axiom::Types::String, label: "Personal Access Token"
|
4
|
+
attribute :api_key, Axiom::Types::String, label: "API key (Deprecated)"
|
4
5
|
|
5
6
|
attribute :workspace_id, Axiom::Types::String, label: "Workspace ID"
|
6
7
|
|
@@ -10,8 +11,14 @@ class CC::Service::Asana < CC::Service
|
|
10
11
|
attribute :assignee, Axiom::Types::String, label: "Assignee",
|
11
12
|
description: "Assignee email address (optional)"
|
12
13
|
|
13
|
-
|
14
|
+
validate :authorization_provided
|
14
15
|
validates :workspace_id, presence: true
|
16
|
+
|
17
|
+
def authorization_provided
|
18
|
+
if api_key.blank? && personal_access_token.blank?
|
19
|
+
errors.add(:personal_access_token, "can't be blank")
|
20
|
+
end
|
21
|
+
end
|
15
22
|
end
|
16
23
|
|
17
24
|
ENDPOINT = "https://app.asana.com/api/1.0/tasks".freeze
|
@@ -82,6 +89,10 @@ class CC::Service::Asana < CC::Service
|
|
82
89
|
end
|
83
90
|
|
84
91
|
def authenticate_http
|
85
|
-
|
92
|
+
if config.personal_access_token.present?
|
93
|
+
http.headers["Authorization"] = "Bearer #{config.personal_access_token}"
|
94
|
+
else
|
95
|
+
http.basic_auth(config.api_key, "")
|
96
|
+
end
|
86
97
|
end
|
87
98
|
end
|
data/lib/cc/services/version.rb
CHANGED
@@ -1,63 +1,96 @@
|
|
1
1
|
describe CC::Service::Asana, type: :service do
|
2
|
-
it "
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
)
|
7
|
-
end
|
2
|
+
it "requires an authorization key or token, and nudges users toward personal_access_token" do
|
3
|
+
config = CC::Service::Asana::Config.new(workspace_id: '1234')
|
4
|
+
expect(config).to_not be_valid
|
5
|
+
expect(config.errors[:personal_access_token]).to eq ["can't be blank"]
|
8
6
|
|
9
|
-
|
10
|
-
|
11
|
-
event(:vulnerability, vulnerabilities: [{
|
12
|
-
"warning_type" => "critical",
|
13
|
-
"location" => "app/user.rb line 120",
|
14
|
-
}]),
|
15
|
-
"New critical issue found in app/user.rb line 120 - https://codeclimate.com/repos/1/feed",
|
16
|
-
)
|
17
|
-
end
|
7
|
+
config.api_key = "foo"
|
8
|
+
expect(config).to be_valid
|
18
9
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
"check_name" => "Style/LongLine",
|
23
|
-
"description" => "Line is too long [1000/80]",
|
24
|
-
},
|
25
|
-
constant_name: "foo.rb",
|
26
|
-
details_url: "http://example.com/repos/id/foo.rb#issue_123",
|
27
|
-
}
|
28
|
-
|
29
|
-
assert_asana_receives(
|
30
|
-
event(:issue, payload),
|
31
|
-
"Fix \"Style/LongLine\" issue in foo.rb",
|
32
|
-
"Line is too long [1000/80]\n\nhttp://example.com/repos/id/foo.rb#issue_123",
|
33
|
-
)
|
10
|
+
config.api_key = nil
|
11
|
+
config.personal_access_token = "bar"
|
12
|
+
expect(config).to be_valid
|
34
13
|
end
|
35
14
|
|
36
|
-
|
37
|
-
|
38
|
-
|
15
|
+
shared_examples "Asana integration" do |authorization|
|
16
|
+
it "creates a ticket for quality changes" do
|
17
|
+
assert_asana_receives(
|
18
|
+
event(:quality, to: "D", from: "C"),
|
19
|
+
"Refactor User from a D on Code Climate - https://codeclimate.com/repos/1/feed",
|
20
|
+
authorization,
|
21
|
+
)
|
39
22
|
end
|
40
23
|
|
41
|
-
|
24
|
+
it "creates a ticket for vulnerability changes" do
|
25
|
+
assert_asana_receives(
|
26
|
+
event(:vulnerability, vulnerabilities: [{
|
27
|
+
"warning_type" => "critical",
|
28
|
+
"location" => "app/user.rb line 120",
|
29
|
+
}]),
|
30
|
+
"New critical issue found in app/user.rb line 120 - https://codeclimate.com/repos/1/feed",
|
31
|
+
authorization,
|
32
|
+
)
|
33
|
+
end
|
42
34
|
|
43
|
-
|
44
|
-
|
45
|
-
|
35
|
+
it "creates a ticket for a new issue" do
|
36
|
+
payload = {
|
37
|
+
issue: {
|
38
|
+
"check_name" => "Style/LongLine",
|
39
|
+
"description" => "Line is too long [1000/80]",
|
40
|
+
},
|
41
|
+
constant_name: "foo.rb",
|
42
|
+
details_url: "http://example.com/repos/id/foo.rb#issue_123",
|
43
|
+
}
|
46
44
|
|
47
|
-
|
48
|
-
|
49
|
-
|
45
|
+
assert_asana_receives(
|
46
|
+
event(:issue, payload),
|
47
|
+
"Fix \"Style/LongLine\" issue in foo.rb",
|
48
|
+
authorization,
|
49
|
+
"Line is too long [1000/80]\n\nhttp://example.com/repos/id/foo.rb#issue_123",
|
50
|
+
)
|
50
51
|
end
|
51
52
|
|
52
|
-
|
53
|
+
it "can make a successful POST request" do
|
54
|
+
http_stubs.post "/api/1.0/tasks" do |_env|
|
55
|
+
[200, {}, '{"data":{"id":"2"}}']
|
56
|
+
end
|
57
|
+
|
58
|
+
response = receive_event(authorization)
|
53
59
|
|
54
|
-
|
60
|
+
expect(response[:id]).to eq("2")
|
61
|
+
expect(response[:url]).to eq("https://app.asana.com/0/1/2")
|
62
|
+
end
|
63
|
+
|
64
|
+
it "can make a test request" do
|
65
|
+
http_stubs.post "/api/1.0/tasks" do |_env|
|
66
|
+
[200, {}, '{"data":{"id":"4"}}']
|
67
|
+
end
|
68
|
+
|
69
|
+
response = receive_event(authorization, name: "test")
|
70
|
+
|
71
|
+
expect(response[:message]).to eq("Ticket <a href='https://app.asana.com/0/1/4'>4</a> created.")
|
72
|
+
end
|
55
73
|
end
|
56
74
|
|
75
|
+
it_behaves_like "Asana integration", :api_key
|
76
|
+
it_behaves_like "Asana integration", :personal_access_token
|
77
|
+
it_behaves_like "Asana integration", :both
|
78
|
+
|
57
79
|
private
|
58
80
|
|
59
|
-
def assert_asana_receives(event_data, name, notes = "")
|
81
|
+
def assert_asana_receives(event_data, name, authorization, notes = "")
|
60
82
|
http_stubs.post "/api/1.0/tasks" do |env|
|
83
|
+
case authorization
|
84
|
+
when :api_key
|
85
|
+
expect(env[:request_headers]["Authorization"]).to include("Basic")
|
86
|
+
when :personal_access_token
|
87
|
+
expect(env[:request_headers]["Authorization"]).to eq("Bearer def456")
|
88
|
+
when :both
|
89
|
+
# prefer the personal access token
|
90
|
+
expect(env[:request_headers]["Authorization"]).to eq("Bearer def456")
|
91
|
+
else
|
92
|
+
raise ArgumentError
|
93
|
+
end
|
61
94
|
body = JSON.parse(env[:body])
|
62
95
|
data = body["data"]
|
63
96
|
|
@@ -70,13 +103,24 @@ describe CC::Service::Asana, type: :service do
|
|
70
103
|
[200, {}, '{"data":{"id":4}}']
|
71
104
|
end
|
72
105
|
|
73
|
-
receive_event(event_data)
|
106
|
+
receive_event(authorization, event_data)
|
74
107
|
end
|
75
108
|
|
76
|
-
def receive_event(event_data = nil)
|
109
|
+
def receive_event(authorization, event_data = nil)
|
110
|
+
service_configuration = { workspace_id: "1", project_id: "2", assignee: "jim@asana.com" }
|
111
|
+
case authorization
|
112
|
+
when :api_key
|
113
|
+
service_configuration[:api_key] = "abc123"
|
114
|
+
when :personal_access_token
|
115
|
+
service_configuration[:personal_access_token] = "def456"
|
116
|
+
when :both
|
117
|
+
service_configuration[:api_key] = "abc123"
|
118
|
+
service_configuration[:personal_access_token] = "def456"
|
119
|
+
else raise ArgumentError
|
120
|
+
end
|
77
121
|
service_receive(
|
78
122
|
CC::Service::Asana,
|
79
|
-
|
123
|
+
service_configuration,
|
80
124
|
event_data || event(:quality, to: "D", from: "C"),
|
81
125
|
)
|
82
126
|
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: 1.9.
|
4
|
+
version: 1.9.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bryan Helmkamp
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-12-
|
11
|
+
date: 2016-12-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: faraday
|