vx-service_connector 0.0.4 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/vx/service_connector.rb +16 -9
- data/lib/vx/service_connector/gitlab_v4.rb +49 -0
- data/lib/vx/service_connector/{gitlab_v41 → gitlab_v4}/commits.rb +1 -1
- data/lib/vx/service_connector/{gitlab_v41 → gitlab_v4}/deploy_keys.rb +1 -1
- data/lib/vx/service_connector/{gitlab_v41 → gitlab_v4}/files.rb +1 -1
- data/lib/vx/service_connector/{gitlab_v41 → gitlab_v4}/hooks.rb +7 -2
- data/lib/vx/service_connector/{gitlab_v41 → gitlab_v4}/notices.rb +1 -1
- data/lib/vx/service_connector/gitlab_v4/payload.rb +126 -0
- data/lib/vx/service_connector/gitlab_v4/repos.rb +73 -0
- data/lib/vx/service_connector/{gitlab_v41 → gitlab_v4}/session.rb +2 -2
- data/lib/vx/service_connector/gitlab_v5.rb +21 -0
- data/lib/vx/service_connector/gitlab_v5/deploy_keys.rb +26 -0
- data/lib/vx/service_connector/version.rb +1 -1
- data/spec/fixtures/{gitlab_v41 → gitlab_v4}/commits.json +0 -0
- data/spec/fixtures/{gitlab_v41 → gitlab_v4}/hooks.json +0 -0
- data/spec/fixtures/gitlab_v4/payload/merge_request1_unchecked.json +47 -0
- data/spec/fixtures/gitlab_v4/payload/merge_request2_can_be_merge.json +47 -0
- data/spec/fixtures/{gitlab_v41 → gitlab_v4}/payload/push.json +0 -0
- data/spec/fixtures/{gitlab_v41 → gitlab_v4}/projects.json +0 -0
- data/spec/fixtures/{gitlab_v41 → gitlab_v4}/user_keys.json +0 -0
- data/spec/fixtures/gitlab_v5/deploy_keys.json +14 -0
- data/spec/lib/{gitlab_v41_payload_spec.rb → gitlab_v4_payload_spec.rb} +11 -2
- data/spec/lib/{gitlab_v41_spec.rb → gitlab_v4_spec.rb} +3 -3
- data/spec/lib/gitlab_v5_spec.rb +43 -0
- data/spec/lib/service_connector_spec.rb +27 -3
- data/spec/support/{gitlab_v41_web_mocks.rb → gitlab_v4_web_mocks.rb} +5 -5
- data/spec/support/gitlab_v5_web_mocks.rb +34 -0
- metadata +38 -26
- data/lib/vx/service_connector/gitlab_v41.rb +0 -49
- data/lib/vx/service_connector/gitlab_v41/payload.rb +0 -93
- data/lib/vx/service_connector/gitlab_v41/repos.rb +0 -40
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 506631ac3d925645c77d80c04a25f9a0ee56b870
|
4
|
+
data.tar.gz: 45f29455185ae52784716d02936edad184355a60
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: df26dd771eaa60bec62f5849bbb8e09ece06e69e79223b5cdcb34153ef78ffc43c4b7e90e0704eddfeeb161173841d1aad2f602a668795c55caa44d0177d0782
|
7
|
+
data.tar.gz: 9103c4e08c2293b9274ed3c1c4860958f173e4b1181a0716d6cda0387ee83b6743092134e90ce8c10c5ea73d532d37021cc9a177e3cfbbc3e4fa96e1ff4dfa90
|
data/lib/vx/service_connector.rb
CHANGED
@@ -6,7 +6,8 @@ module Vx
|
|
6
6
|
|
7
7
|
autoload :Base, File.expand_path("../service_connector/base", __FILE__)
|
8
8
|
autoload :Github, File.expand_path("../service_connector/github", __FILE__)
|
9
|
-
autoload :
|
9
|
+
autoload :GitlabV4, File.expand_path("../service_connector/gitlab_v4", __FILE__)
|
10
|
+
autoload :GitlabV5, File.expand_path("../service_connector/gitlab_v5", __FILE__)
|
10
11
|
autoload :Model, File.expand_path("../service_connector/model", __FILE__)
|
11
12
|
|
12
13
|
extend self
|
@@ -18,20 +19,26 @@ module Vx
|
|
18
19
|
case name.to_sym
|
19
20
|
when :github
|
20
21
|
Github
|
21
|
-
when :
|
22
|
-
|
22
|
+
when :gitlab_v4
|
23
|
+
GitlabV4
|
24
|
+
when :gitlab_v5
|
25
|
+
GitlabV5
|
23
26
|
else
|
24
27
|
raise ArgumentError, "Serivice for #{name.inspect} is not defined"
|
25
28
|
end
|
26
29
|
end
|
27
30
|
|
28
31
|
def payload(name, params)
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
32
|
+
klass =
|
33
|
+
case name.to_sym
|
34
|
+
when :github
|
35
|
+
Github::Payload
|
36
|
+
when :gitlab_v4, :gitlab_v5
|
37
|
+
GitlabV4::Payload
|
38
|
+
else
|
39
|
+
raise ArgumentError, "Payload for #{name.inspect} is not defined"
|
40
|
+
end
|
41
|
+
klass.new(params).to_model
|
35
42
|
end
|
36
43
|
|
37
44
|
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'gitlab'
|
2
|
+
|
3
|
+
module Vx
|
4
|
+
module ServiceConnector
|
5
|
+
GitlabV4 = Struct.new(:endpoint, :private_token) do
|
6
|
+
|
7
|
+
include ServiceConnector::Base
|
8
|
+
|
9
|
+
def repos
|
10
|
+
@repos ||= GitlabV4::Repos.new(session).to_a
|
11
|
+
end
|
12
|
+
|
13
|
+
def organizations
|
14
|
+
[]
|
15
|
+
end
|
16
|
+
|
17
|
+
def hooks(repo)
|
18
|
+
GitlabV4::Hooks.new(session, repo)
|
19
|
+
end
|
20
|
+
|
21
|
+
def deploy_keys(repo)
|
22
|
+
GitlabV4::DeployKeys.new(session, repo)
|
23
|
+
end
|
24
|
+
|
25
|
+
def notices(repo)
|
26
|
+
GitlabV4::Notices.new(session, repo)
|
27
|
+
end
|
28
|
+
|
29
|
+
def files(repo)
|
30
|
+
GitlabV4::Files.new(session, repo)
|
31
|
+
end
|
32
|
+
|
33
|
+
def commits(repo)
|
34
|
+
GitlabV4::Commits.new(session, repo)
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
def create_session
|
40
|
+
GitlabV4::Session.new(endpoint, private_token)
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
Dir[File.expand_path("../gitlab_v4/*.rb", __FILE__)].each do |f|
|
48
|
+
require f
|
49
|
+
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
module Vx
|
2
2
|
module ServiceConnector
|
3
|
-
class
|
3
|
+
class GitlabV4
|
4
4
|
Hooks = Struct.new(:session, :repo) do
|
5
5
|
|
6
6
|
def all
|
@@ -8,7 +8,12 @@ module Vx
|
|
8
8
|
end
|
9
9
|
|
10
10
|
def create(url, token)
|
11
|
-
session.post
|
11
|
+
session.post(
|
12
|
+
hooks_url,
|
13
|
+
url: url,
|
14
|
+
push_events: true,
|
15
|
+
merge_requests_events: true
|
16
|
+
)
|
12
17
|
end
|
13
18
|
|
14
19
|
def destroy(url_mask)
|
@@ -0,0 +1,126 @@
|
|
1
|
+
module Vx
|
2
|
+
module ServiceConnector
|
3
|
+
class GitlabV4
|
4
|
+
class Payload
|
5
|
+
|
6
|
+
def initialize(params)
|
7
|
+
@params = params || {}
|
8
|
+
end
|
9
|
+
|
10
|
+
def pull_request?
|
11
|
+
self["object_kind"] == 'merge_request'
|
12
|
+
end
|
13
|
+
|
14
|
+
def tag?
|
15
|
+
false
|
16
|
+
end
|
17
|
+
|
18
|
+
def pull_request_number
|
19
|
+
if pull_request?
|
20
|
+
pull_request["id"]
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def head
|
25
|
+
if pull_request?
|
26
|
+
cid = (pull_request["st_commits"] || []).first
|
27
|
+
cid && cid["id"]
|
28
|
+
else
|
29
|
+
self["after"]
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def base
|
34
|
+
if pull_request?
|
35
|
+
cid = (pull_request["st_commits"] || []).first
|
36
|
+
cid && cid["parent_ids"] && cid["parent_ids"].first
|
37
|
+
else
|
38
|
+
self["before"]
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def branch
|
43
|
+
if pull_request?
|
44
|
+
pull_request["source_branch"]
|
45
|
+
else
|
46
|
+
self["ref"].to_s.split("refs/heads/").last
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def branch_label
|
51
|
+
branch
|
52
|
+
end
|
53
|
+
|
54
|
+
def url
|
55
|
+
self["commits"] && self["commits"].first && self["commits"].first["url"]
|
56
|
+
end
|
57
|
+
|
58
|
+
def pull_request_head_repo_id
|
59
|
+
if pull_request?
|
60
|
+
pull_request["target_project_id"]
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def pull_request_base_repo_id
|
65
|
+
if pull_request?
|
66
|
+
pull_request["source_project_id"]
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def closed_pull_request?
|
71
|
+
false
|
72
|
+
end
|
73
|
+
|
74
|
+
def foreign_pull_request?
|
75
|
+
pull_request_base_repo_id != pull_request_head_repo_id
|
76
|
+
end
|
77
|
+
|
78
|
+
def pull_request_status
|
79
|
+
if pull_request?
|
80
|
+
pull_request["merge_status"]
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
def ignore_pull_request?
|
85
|
+
if pull_request?
|
86
|
+
pull_request_status != 'unchecked'
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
def ignore?
|
91
|
+
head == '0000000000000000000000000000000000000000' ||
|
92
|
+
ignore_pull_request?
|
93
|
+
end
|
94
|
+
|
95
|
+
def to_model
|
96
|
+
ServiceConnector::Model::Payload.new(
|
97
|
+
!!pull_request?,
|
98
|
+
pull_request_number,
|
99
|
+
head,
|
100
|
+
base,
|
101
|
+
branch,
|
102
|
+
branch_label,
|
103
|
+
url,
|
104
|
+
!!ignore?
|
105
|
+
)
|
106
|
+
end
|
107
|
+
|
108
|
+
private
|
109
|
+
|
110
|
+
def pull_request
|
111
|
+
self["object_attributes"] || {}
|
112
|
+
end
|
113
|
+
|
114
|
+
def key?(name)
|
115
|
+
@params.key? name
|
116
|
+
end
|
117
|
+
|
118
|
+
def [](val)
|
119
|
+
@params[val]
|
120
|
+
end
|
121
|
+
|
122
|
+
end
|
123
|
+
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
module Vx
|
2
|
+
module ServiceConnector
|
3
|
+
class GitlabV4
|
4
|
+
Repos = Struct.new(:session) do
|
5
|
+
|
6
|
+
def to_a
|
7
|
+
session.get("/projects").map do |proj|
|
8
|
+
proj_to_model proj
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
private
|
13
|
+
|
14
|
+
def proj_to_model(repo)
|
15
|
+
Model::Repo.new(
|
16
|
+
repo.id,
|
17
|
+
compute_name_with_namespace(repo),
|
18
|
+
compute_is_private(repo),
|
19
|
+
compute_ssh_url(repo),
|
20
|
+
compute_web_url(repo),
|
21
|
+
repo.description
|
22
|
+
)
|
23
|
+
end
|
24
|
+
|
25
|
+
def compute_name_with_namespace(repo)
|
26
|
+
if repo.path_with_namespace
|
27
|
+
# for version 5.x
|
28
|
+
repo.path_with_namespace
|
29
|
+
else
|
30
|
+
# for version 4.x
|
31
|
+
hn = session.uri.hostname.to_s.split(".")[-2]
|
32
|
+
hm ||= session.uri.hostname
|
33
|
+
[hn, repo.name.downcase].join("/").downcase
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def compute_ssh_url(repo)
|
38
|
+
if repo.ssh_url
|
39
|
+
# for version 6.x
|
40
|
+
repo.ssh_url
|
41
|
+
else
|
42
|
+
# for version 5.x or 4.x
|
43
|
+
name = repo.path_with_namespace || repo.name
|
44
|
+
"git@#{session.uri.hostname}:#{name.downcase}.git"
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def compute_web_url(repo)
|
49
|
+
if repo.web_url
|
50
|
+
# for version 6.x
|
51
|
+
repo.web_url
|
52
|
+
else
|
53
|
+
# for version 5.x or 4.x
|
54
|
+
name = repo.path_with_namespace || repo.name
|
55
|
+
"#{session.uri.scheme}://#{session.uri.hostname}:#{session.uri.port}/#{name.downcase}"
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def compute_is_private(repo)
|
60
|
+
case
|
61
|
+
# for version before 6.x
|
62
|
+
when repo.private != nil
|
63
|
+
repo.private
|
64
|
+
# for version 6.x
|
65
|
+
when repo.public != nil
|
66
|
+
!repo.public
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
@@ -3,7 +3,7 @@ require 'uri'
|
|
3
3
|
|
4
4
|
module Vx
|
5
5
|
module ServiceConnector
|
6
|
-
class
|
6
|
+
class GitlabV4
|
7
7
|
|
8
8
|
Session = Struct.new(:endpoint, :private_token) do
|
9
9
|
|
@@ -18,7 +18,7 @@ module Vx
|
|
18
18
|
end
|
19
19
|
|
20
20
|
def delete(url, options = {})
|
21
|
-
res = agent.call :delete, request_url(url), options
|
21
|
+
res = agent.call :delete, request_url(url), nil, query: options
|
22
22
|
response! res
|
23
23
|
end
|
24
24
|
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'gitlab'
|
2
|
+
|
3
|
+
module Vx
|
4
|
+
module ServiceConnector
|
5
|
+
class GitlabV5 < GitlabV4
|
6
|
+
|
7
|
+
def repos
|
8
|
+
@repos ||= GitlabV4::Repos.new(session).to_a
|
9
|
+
end
|
10
|
+
|
11
|
+
def deploy_keys(repo)
|
12
|
+
GitlabV5::DeployKeys.new(session, repo)
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
Dir[File.expand_path("../gitlab_v5/*.rb", __FILE__)].each do |f|
|
20
|
+
require f
|
21
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Vx
|
2
|
+
module ServiceConnector
|
3
|
+
class GitlabV5
|
4
|
+
DeployKeys = Struct.new(:session, :repo) do
|
5
|
+
|
6
|
+
def all
|
7
|
+
session.get "/projects/#{repo.id}/keys"
|
8
|
+
end
|
9
|
+
|
10
|
+
def create(key_name, public_key)
|
11
|
+
session.post "/projects/#{repo.id}/keys", title: key_name, key: public_key
|
12
|
+
end
|
13
|
+
|
14
|
+
def destroy(key_name)
|
15
|
+
all.select do |key|
|
16
|
+
key.title == key_name
|
17
|
+
end.map do |key|
|
18
|
+
session.delete "/projects/#{repo.id}/keys/#{key.id}"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
File without changes
|
File without changes
|
@@ -0,0 +1,47 @@
|
|
1
|
+
{
|
2
|
+
"object_kind": "merge_request",
|
3
|
+
"object_attributes": {
|
4
|
+
"id": 1,
|
5
|
+
"target_branch": "master",
|
6
|
+
"source_branch": "one",
|
7
|
+
"source_project_id": 1,
|
8
|
+
"author_id": 1,
|
9
|
+
"assignee_id": null,
|
10
|
+
"title": "One",
|
11
|
+
"created_at": "2014-01-29T16:14:38.113Z",
|
12
|
+
"updated_at": "2014-01-29T16:14:45.845Z",
|
13
|
+
"st_commits": [
|
14
|
+
{
|
15
|
+
"id": "d0862adb2c46aecb3db4cb4a50867599e4015cf9",
|
16
|
+
"message": "one",
|
17
|
+
"parent_ids": [
|
18
|
+
"f1f92a4ef47a4257973282718449154938c3684d"
|
19
|
+
],
|
20
|
+
"authored_date": "2014-01-29T16:13:20+00:00",
|
21
|
+
"author_name": "Dmitry Galinsky",
|
22
|
+
"author_email": "dima.exe@gmail.com",
|
23
|
+
"committed_date": "2014-01-29T16:13:20+00:00",
|
24
|
+
"committer_name": "Dmitry Galinsky",
|
25
|
+
"committer_email": "dima.exe@gmail.com"
|
26
|
+
}
|
27
|
+
],
|
28
|
+
"st_diffs": [
|
29
|
+
{
|
30
|
+
"diff": "--- a/README\n+++ b/README\n@@ -1 +1,2 @@\n 1\n+2",
|
31
|
+
"new_path": "README",
|
32
|
+
"old_path": "README",
|
33
|
+
"a_mode": null,
|
34
|
+
"b_mode": "100644",
|
35
|
+
"new_file": false,
|
36
|
+
"renamed_file": false,
|
37
|
+
"deleted_file": false
|
38
|
+
}
|
39
|
+
],
|
40
|
+
"milestone_id": null,
|
41
|
+
"state": "opened",
|
42
|
+
"merge_status": "unchecked",
|
43
|
+
"target_project_id": 1,
|
44
|
+
"iid": 1,
|
45
|
+
"description": "."
|
46
|
+
}
|
47
|
+
}
|
@@ -0,0 +1,47 @@
|
|
1
|
+
{
|
2
|
+
"object_kind": "merge_request",
|
3
|
+
"object_attributes": {
|
4
|
+
"id": 1,
|
5
|
+
"target_branch": "master",
|
6
|
+
"source_branch": "one",
|
7
|
+
"source_project_id": 1,
|
8
|
+
"author_id": 1,
|
9
|
+
"assignee_id": null,
|
10
|
+
"title": "One",
|
11
|
+
"created_at": "2014-01-29T16:14:38.000Z",
|
12
|
+
"updated_at": "2014-01-29T16:14:49.246Z",
|
13
|
+
"st_commits": [
|
14
|
+
{
|
15
|
+
"id": "d0862adb2c46aecb3db4cb4a50867599e4015cf9",
|
16
|
+
"message": "one",
|
17
|
+
"parent_ids": [
|
18
|
+
"f1f92a4ef47a4257973282718449154938c3684d"
|
19
|
+
],
|
20
|
+
"authored_date": "2014-01-29T16:13:20+00:00",
|
21
|
+
"author_name": "Dmitry Galinsky",
|
22
|
+
"author_email": "dima.exe@gmail.com",
|
23
|
+
"committed_date": "2014-01-29T16:13:20+00:00",
|
24
|
+
"committer_name": "Dmitry Galinsky",
|
25
|
+
"committer_email": "dima.exe@gmail.com"
|
26
|
+
}
|
27
|
+
],
|
28
|
+
"st_diffs": [
|
29
|
+
{
|
30
|
+
"diff": "--- a/README\n+++ b/README\n@@ -1 +1,2 @@\n 1\n+2",
|
31
|
+
"new_path": "README",
|
32
|
+
"old_path": "README",
|
33
|
+
"a_mode": null,
|
34
|
+
"b_mode": "100644",
|
35
|
+
"new_file": false,
|
36
|
+
"renamed_file": false,
|
37
|
+
"deleted_file": false
|
38
|
+
}
|
39
|
+
],
|
40
|
+
"milestone_id": null,
|
41
|
+
"state": "opened",
|
42
|
+
"merge_status": "can_be_merged",
|
43
|
+
"target_project_id": 1,
|
44
|
+
"iid": 1,
|
45
|
+
"description": "."
|
46
|
+
}
|
47
|
+
}
|
File without changes
|
File without changes
|
File without changes
|
@@ -0,0 +1,14 @@
|
|
1
|
+
[
|
2
|
+
{
|
3
|
+
"id": 1,
|
4
|
+
"title" : "Public key",
|
5
|
+
"key": "ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAIEAiPWx6WM4lhHNedGfBpPJNPpZ7yKu+dnn1SJejgt4 596k6YjzGGphH2TUxwKzxcKDKKezwkpfnxPkSMkuEspGRt/aZZ9wa++Oi7Qkr8prgHc4 soW6NUlfDzpvZK2H5E7eQaSeP3SAwGmQKUFHCddNaP0L+hM7zhFNzjFvpaMgJw0=",
|
6
|
+
"created_at":"2013-10-02T10:12:29Z"
|
7
|
+
},
|
8
|
+
{
|
9
|
+
"id": 3,
|
10
|
+
"title" : "me@example.com",
|
11
|
+
"key": "ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAIEAiPWx6WM4lhHNedGfBpPJNPpZ7yKu+dnn1SJejgt4 596k6YjzGGphH2TUxwKzxcKDKKezwkpfnxPkSMkuEspGRt/aZZ9wa++Oi7Qkr8prgHc4 soW6NUlfDzpvZK2H5E7eQaSeP3SAwGmQKUFHCddNaP0L+hM7zhFNzjFvpaMgJw0=",
|
12
|
+
"created_at":"2013-10-02T11:12:29Z"
|
13
|
+
}
|
14
|
+
]
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
describe Vx::ServiceConnector::
|
4
|
-
let(:content) { read_json_fixture("
|
3
|
+
describe Vx::ServiceConnector::GitlabV4::Payload do
|
4
|
+
let(:content) { read_json_fixture("gitlab_v4/payload/push") }
|
5
5
|
let(:payload) { described_class.new content }
|
6
6
|
subject { payload }
|
7
7
|
|
@@ -21,6 +21,15 @@ describe Vx::ServiceConnector::GitlabV41::Payload do
|
|
21
21
|
end
|
22
22
|
|
23
23
|
context "pull_request" do
|
24
|
+
let(:content) { read_json_fixture("gitlab_v4/payload/merge_request1_unchecked") }
|
25
|
+
|
26
|
+
its(:pull_request?) { should be_true }
|
27
|
+
its(:pull_request_number) { should eq 1 }
|
28
|
+
its(:ignore?) { should be_false }
|
29
|
+
its(:head) { should eq 'd0862adb2c46aecb3db4cb4a50867599e4015cf9' }
|
30
|
+
its(:base) { should eq 'f1f92a4ef47a4257973282718449154938c3684d' }
|
31
|
+
its(:branch) { should eq 'one' }
|
32
|
+
its(:url) { should be_nil }
|
24
33
|
end
|
25
34
|
|
26
35
|
context "tag?" do
|
@@ -1,8 +1,8 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
describe Vx::ServiceConnector::
|
3
|
+
describe Vx::ServiceConnector::GitlabV4 do
|
4
4
|
|
5
|
-
include
|
5
|
+
include GitlabV4WebMocks
|
6
6
|
|
7
7
|
let(:endpoint) { 'http://example.com' }
|
8
8
|
let(:token) { 'token' }
|
@@ -34,7 +34,7 @@ describe Vx::ServiceConnector::GitlabV41 do
|
|
34
34
|
context "values" do
|
35
35
|
subject { gitlab.repos.map(&:values) }
|
36
36
|
it { should eq(
|
37
|
-
[[9, "example
|
37
|
+
[[9, "example/sqerp", true, "git@example.com:sqerp.git", "http://example.com:80/sqerp", nil]]
|
38
38
|
) }
|
39
39
|
end
|
40
40
|
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Vx::ServiceConnector::GitlabV5 do
|
4
|
+
|
5
|
+
include GitlabV5WebMocks
|
6
|
+
|
7
|
+
let(:endpoint) { 'http://example.com' }
|
8
|
+
let(:token) { 'token' }
|
9
|
+
let(:repo) { create :repo }
|
10
|
+
let(:gitlab) { described_class.new endpoint, token }
|
11
|
+
|
12
|
+
subject { gitlab }
|
13
|
+
|
14
|
+
it { should be }
|
15
|
+
|
16
|
+
context "(deploy_keys)" do
|
17
|
+
let(:key_name) { 'me@example.com' }
|
18
|
+
let(:public_key) { 'public key' }
|
19
|
+
let(:deploy_keys) { gitlab.deploy_keys(repo) }
|
20
|
+
|
21
|
+
context "all" do
|
22
|
+
subject { deploy_keys.all }
|
23
|
+
before { mock_deploy_keys }
|
24
|
+
it { should have(2).items }
|
25
|
+
end
|
26
|
+
|
27
|
+
context "create" do
|
28
|
+
subject { deploy_keys.create key_name, public_key }
|
29
|
+
before { mock_add_deploy_key }
|
30
|
+
it { should be }
|
31
|
+
end
|
32
|
+
|
33
|
+
context "destroy" do
|
34
|
+
subject { deploy_keys.destroy key_name }
|
35
|
+
before do
|
36
|
+
mock_deploy_keys
|
37
|
+
mock_delete_deploy_key
|
38
|
+
end
|
39
|
+
|
40
|
+
it { should have(1).item }
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -14,15 +14,39 @@ describe Vx::ServiceConnector do
|
|
14
14
|
end
|
15
15
|
|
16
16
|
context "to" do
|
17
|
-
subject { described_class.to
|
17
|
+
subject { described_class.to(name).to_s }
|
18
18
|
|
19
19
|
context ":github" do
|
20
20
|
let(:name) { :github }
|
21
|
+
it { should be_include("Github") }
|
22
|
+
end
|
23
|
+
|
24
|
+
context ":gitlab_v4" do
|
25
|
+
let(:name) { :gitlab_v4 }
|
26
|
+
it { should be_include("GitlabV4") }
|
27
|
+
end
|
28
|
+
|
29
|
+
context ":gitlab_v5" do
|
30
|
+
let(:name) { :gitlab_v5 }
|
31
|
+
it { should be_include("GitlabV5") }
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
context "payload" do
|
36
|
+
subject { described_class.payload(name, {}) }
|
37
|
+
|
38
|
+
context ":github" do
|
39
|
+
let(:name) { :github }
|
40
|
+
it { should be }
|
41
|
+
end
|
42
|
+
|
43
|
+
context ":gitlab_v4" do
|
44
|
+
let(:name) { :gitlab_v4 }
|
21
45
|
it { should be }
|
22
46
|
end
|
23
47
|
|
24
|
-
context ":
|
25
|
-
let(:name) { :
|
48
|
+
context ":gitlab_v5" do
|
49
|
+
let(:name) { :gitlab_v5 }
|
26
50
|
it { should be }
|
27
51
|
end
|
28
52
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
module
|
1
|
+
module GitlabV4WebMocks
|
2
2
|
|
3
3
|
def mock_repos
|
4
4
|
mock_get "projects", 'projects'
|
@@ -13,15 +13,15 @@ module GitlabV41WebMocks
|
|
13
13
|
end
|
14
14
|
|
15
15
|
def mock_delete_user_key
|
16
|
-
mock_delete "user/keys/589",
|
16
|
+
mock_delete "user/keys/589", nil
|
17
17
|
end
|
18
18
|
|
19
19
|
def mock_add_hook
|
20
|
-
mock_post "projects/1/hooks", "{\"url\":\"url\"}"
|
20
|
+
mock_post "projects/1/hooks", "{\"url\":\"url\",\"push_events\":true,\"merge_requests_events\":true}"
|
21
21
|
end
|
22
22
|
|
23
23
|
def mock_remove_hook
|
24
|
-
mock_delete "projects/1/hooks", "
|
24
|
+
mock_delete "projects/1/hooks?hook_id=57", ""
|
25
25
|
end
|
26
26
|
|
27
27
|
def mock_hooks
|
@@ -55,7 +55,7 @@ module GitlabV41WebMocks
|
|
55
55
|
with(:headers => {'Accept'=>'application/json', 'PRIVATE-TOKEN' => "token"}).
|
56
56
|
to_return(
|
57
57
|
:status => 200,
|
58
|
-
:body => read_fixture("
|
58
|
+
:body => read_fixture("gitlab_v4/#{fixture}.json"),
|
59
59
|
:headers => {'Content-Type' => 'application/json'})
|
60
60
|
end
|
61
61
|
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module GitlabV5WebMocks
|
2
|
+
def mock_deploy_keys
|
3
|
+
mock_get "projects/1/keys", "deploy_keys"
|
4
|
+
end
|
5
|
+
|
6
|
+
def mock_add_deploy_key
|
7
|
+
mock_post "projects/1/keys", "{\"title\":\"me@example.com\",\"key\":\"public key\"}"
|
8
|
+
end
|
9
|
+
|
10
|
+
def mock_delete_deploy_key
|
11
|
+
mock_delete "projects/1/keys/3", nil
|
12
|
+
end
|
13
|
+
|
14
|
+
def mock_get(url, fixture)
|
15
|
+
stub_request(:get, "http://example.com/api/v3/#{url}").
|
16
|
+
with(:headers => {'Accept'=>'application/json', 'PRIVATE-TOKEN' => "token"}).
|
17
|
+
to_return(
|
18
|
+
:status => 200,
|
19
|
+
:body => read_fixture("gitlab_v5/#{fixture}.json"),
|
20
|
+
:headers => {'Content-Type' => 'application/json'})
|
21
|
+
end
|
22
|
+
|
23
|
+
def mock_post(url, body)
|
24
|
+
stub_request(:post, "http://example.com/api/v3/#{url}").
|
25
|
+
with(:headers => {'Accept'=>'application/json', }, body: body).
|
26
|
+
to_return(:status => 200, :body => "{}", :headers => {'Content-Type' => 'application/json'})
|
27
|
+
end
|
28
|
+
|
29
|
+
def mock_delete(url, body)
|
30
|
+
stub_request(:delete, "http://example.com/api/v3/#{url}").
|
31
|
+
with(:headers => {'Accept'=>'application/json', }, body: body).
|
32
|
+
to_return(:status => 200, :body => "{}", :headers => {'Content-Type' => 'application/json'})
|
33
|
+
end
|
34
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vx-service_connector
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dmitry Galinsky
|
@@ -119,15 +119,17 @@ files:
|
|
119
119
|
- lib/vx/service_connector/github/notices.rb
|
120
120
|
- lib/vx/service_connector/github/payload.rb
|
121
121
|
- lib/vx/service_connector/github/repos.rb
|
122
|
-
- lib/vx/service_connector/
|
123
|
-
- lib/vx/service_connector/
|
124
|
-
- lib/vx/service_connector/
|
125
|
-
- lib/vx/service_connector/
|
126
|
-
- lib/vx/service_connector/
|
127
|
-
- lib/vx/service_connector/
|
128
|
-
- lib/vx/service_connector/
|
129
|
-
- lib/vx/service_connector/
|
130
|
-
- lib/vx/service_connector/
|
122
|
+
- lib/vx/service_connector/gitlab_v4.rb
|
123
|
+
- lib/vx/service_connector/gitlab_v4/commits.rb
|
124
|
+
- lib/vx/service_connector/gitlab_v4/deploy_keys.rb
|
125
|
+
- lib/vx/service_connector/gitlab_v4/files.rb
|
126
|
+
- lib/vx/service_connector/gitlab_v4/hooks.rb
|
127
|
+
- lib/vx/service_connector/gitlab_v4/notices.rb
|
128
|
+
- lib/vx/service_connector/gitlab_v4/payload.rb
|
129
|
+
- lib/vx/service_connector/gitlab_v4/repos.rb
|
130
|
+
- lib/vx/service_connector/gitlab_v4/session.rb
|
131
|
+
- lib/vx/service_connector/gitlab_v5.rb
|
132
|
+
- lib/vx/service_connector/gitlab_v5/deploy_keys.rb
|
131
133
|
- lib/vx/service_connector/model.rb
|
132
134
|
- lib/vx/service_connector/version.rb
|
133
135
|
- spec/fixtures/github/add_deploy_key.json
|
@@ -144,21 +146,26 @@ files:
|
|
144
146
|
- spec/fixtures/github/payload/push.json
|
145
147
|
- spec/fixtures/github/payload/push_tag.json
|
146
148
|
- spec/fixtures/github/user_repos.json
|
147
|
-
- spec/fixtures/
|
148
|
-
- spec/fixtures/
|
149
|
-
- spec/fixtures/
|
150
|
-
- spec/fixtures/
|
151
|
-
- spec/fixtures/
|
149
|
+
- spec/fixtures/gitlab_v4/commits.json
|
150
|
+
- spec/fixtures/gitlab_v4/hooks.json
|
151
|
+
- spec/fixtures/gitlab_v4/payload/merge_request1_unchecked.json
|
152
|
+
- spec/fixtures/gitlab_v4/payload/merge_request2_can_be_merge.json
|
153
|
+
- spec/fixtures/gitlab_v4/payload/push.json
|
154
|
+
- spec/fixtures/gitlab_v4/projects.json
|
155
|
+
- spec/fixtures/gitlab_v4/user_keys.json
|
156
|
+
- spec/fixtures/gitlab_v5/deploy_keys.json
|
152
157
|
- spec/lib/github_payload_spec.rb
|
153
158
|
- spec/lib/github_spec.rb
|
154
|
-
- spec/lib/
|
155
|
-
- spec/lib/
|
159
|
+
- spec/lib/gitlab_v4_payload_spec.rb
|
160
|
+
- spec/lib/gitlab_v4_spec.rb
|
161
|
+
- spec/lib/gitlab_v5_spec.rb
|
156
162
|
- spec/lib/model_spec.rb
|
157
163
|
- spec/lib/service_connector_spec.rb
|
158
164
|
- spec/spec_helper.rb
|
159
165
|
- spec/support/create.rb
|
160
166
|
- spec/support/github_web_mocks.rb
|
161
|
-
- spec/support/
|
167
|
+
- spec/support/gitlab_v4_web_mocks.rb
|
168
|
+
- spec/support/gitlab_v5_web_mocks.rb
|
162
169
|
- spec/support/read_fixture.rb
|
163
170
|
- vx-service_connector.gemspec
|
164
171
|
homepage: ''
|
@@ -200,19 +207,24 @@ test_files:
|
|
200
207
|
- spec/fixtures/github/payload/push.json
|
201
208
|
- spec/fixtures/github/payload/push_tag.json
|
202
209
|
- spec/fixtures/github/user_repos.json
|
203
|
-
- spec/fixtures/
|
204
|
-
- spec/fixtures/
|
205
|
-
- spec/fixtures/
|
206
|
-
- spec/fixtures/
|
207
|
-
- spec/fixtures/
|
210
|
+
- spec/fixtures/gitlab_v4/commits.json
|
211
|
+
- spec/fixtures/gitlab_v4/hooks.json
|
212
|
+
- spec/fixtures/gitlab_v4/payload/merge_request1_unchecked.json
|
213
|
+
- spec/fixtures/gitlab_v4/payload/merge_request2_can_be_merge.json
|
214
|
+
- spec/fixtures/gitlab_v4/payload/push.json
|
215
|
+
- spec/fixtures/gitlab_v4/projects.json
|
216
|
+
- spec/fixtures/gitlab_v4/user_keys.json
|
217
|
+
- spec/fixtures/gitlab_v5/deploy_keys.json
|
208
218
|
- spec/lib/github_payload_spec.rb
|
209
219
|
- spec/lib/github_spec.rb
|
210
|
-
- spec/lib/
|
211
|
-
- spec/lib/
|
220
|
+
- spec/lib/gitlab_v4_payload_spec.rb
|
221
|
+
- spec/lib/gitlab_v4_spec.rb
|
222
|
+
- spec/lib/gitlab_v5_spec.rb
|
212
223
|
- spec/lib/model_spec.rb
|
213
224
|
- spec/lib/service_connector_spec.rb
|
214
225
|
- spec/spec_helper.rb
|
215
226
|
- spec/support/create.rb
|
216
227
|
- spec/support/github_web_mocks.rb
|
217
|
-
- spec/support/
|
228
|
+
- spec/support/gitlab_v4_web_mocks.rb
|
229
|
+
- spec/support/gitlab_v5_web_mocks.rb
|
218
230
|
- spec/support/read_fixture.rb
|
@@ -1,49 +0,0 @@
|
|
1
|
-
require 'gitlab'
|
2
|
-
|
3
|
-
module Vx
|
4
|
-
module ServiceConnector
|
5
|
-
GitlabV41 = Struct.new(:endpoint, :private_token) do
|
6
|
-
|
7
|
-
include ServiceConnector::Base
|
8
|
-
|
9
|
-
def repos
|
10
|
-
@repos ||= GitlabV41::Repos.new(session).to_a
|
11
|
-
end
|
12
|
-
|
13
|
-
def organizations
|
14
|
-
[]
|
15
|
-
end
|
16
|
-
|
17
|
-
def hooks(repo)
|
18
|
-
GitlabV41::Hooks.new(session, repo)
|
19
|
-
end
|
20
|
-
|
21
|
-
def deploy_keys(repo)
|
22
|
-
GitlabV41::DeployKeys.new(session, repo)
|
23
|
-
end
|
24
|
-
|
25
|
-
def notices(repo)
|
26
|
-
GitlabV41::Notices.new(session, repo)
|
27
|
-
end
|
28
|
-
|
29
|
-
def files(repo)
|
30
|
-
GitlabV41::Files.new(session, repo)
|
31
|
-
end
|
32
|
-
|
33
|
-
def commits(repo)
|
34
|
-
GitlabV41::Commits.new(session, repo)
|
35
|
-
end
|
36
|
-
|
37
|
-
private
|
38
|
-
|
39
|
-
def create_session
|
40
|
-
GitlabV41::Session.new(endpoint, private_token)
|
41
|
-
end
|
42
|
-
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
Dir[File.expand_path("../gitlab_v41/*.rb", __FILE__)].each do |f|
|
48
|
-
require f
|
49
|
-
end
|
@@ -1,93 +0,0 @@
|
|
1
|
-
module Vx
|
2
|
-
module ServiceConnector
|
3
|
-
class GitlabV41
|
4
|
-
class Payload
|
5
|
-
|
6
|
-
def initialize(params)
|
7
|
-
@params = params || {}
|
8
|
-
end
|
9
|
-
|
10
|
-
def pull_request?
|
11
|
-
false
|
12
|
-
end
|
13
|
-
|
14
|
-
def tag?
|
15
|
-
false
|
16
|
-
end
|
17
|
-
|
18
|
-
def pull_request_number
|
19
|
-
nil
|
20
|
-
end
|
21
|
-
|
22
|
-
def head
|
23
|
-
self["after"]
|
24
|
-
end
|
25
|
-
|
26
|
-
def base
|
27
|
-
self["before"]
|
28
|
-
end
|
29
|
-
|
30
|
-
def branch
|
31
|
-
self["ref"].to_s.split("refs/heads/").last
|
32
|
-
end
|
33
|
-
|
34
|
-
def branch_label
|
35
|
-
branch
|
36
|
-
end
|
37
|
-
|
38
|
-
def url
|
39
|
-
self["commits"] && self["commits"].first && self["commits"].first["url"]
|
40
|
-
end
|
41
|
-
|
42
|
-
def pull_request_head_repo_id
|
43
|
-
nil
|
44
|
-
end
|
45
|
-
|
46
|
-
def pull_request_base_repo_id
|
47
|
-
nil
|
48
|
-
end
|
49
|
-
|
50
|
-
def closed_pull_request?
|
51
|
-
false
|
52
|
-
end
|
53
|
-
|
54
|
-
def foreign_pull_request?
|
55
|
-
false
|
56
|
-
end
|
57
|
-
|
58
|
-
def ignore?
|
59
|
-
head == '0000000000000000000000000000000000000000'
|
60
|
-
end
|
61
|
-
|
62
|
-
def to_model
|
63
|
-
ServiceConnector::Model::Payload.new(
|
64
|
-
!!pull_request,
|
65
|
-
pull_request_number,
|
66
|
-
head,
|
67
|
-
base,
|
68
|
-
branch,
|
69
|
-
branch_label,
|
70
|
-
url,
|
71
|
-
!!ignore?
|
72
|
-
)
|
73
|
-
end
|
74
|
-
|
75
|
-
private
|
76
|
-
|
77
|
-
def pull_request
|
78
|
-
self["pull_request"]
|
79
|
-
end
|
80
|
-
|
81
|
-
def key?(name)
|
82
|
-
@params.key? name
|
83
|
-
end
|
84
|
-
|
85
|
-
def [](val)
|
86
|
-
@params[val]
|
87
|
-
end
|
88
|
-
|
89
|
-
end
|
90
|
-
|
91
|
-
end
|
92
|
-
end
|
93
|
-
end
|
@@ -1,40 +0,0 @@
|
|
1
|
-
module Vx
|
2
|
-
module ServiceConnector
|
3
|
-
class GitlabV41
|
4
|
-
Repos = Struct.new(:session) do
|
5
|
-
|
6
|
-
def to_a
|
7
|
-
session.get("/projects").map do |proj|
|
8
|
-
proj_to_model proj
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
private
|
13
|
-
|
14
|
-
def proj_to_model(repo)
|
15
|
-
Model::Repo.new(
|
16
|
-
repo.id,
|
17
|
-
compute_name_with_namespace(repo),
|
18
|
-
repo.private,
|
19
|
-
compute_ssh_url(repo),
|
20
|
-
compute_web_url(repo),
|
21
|
-
repo.description
|
22
|
-
)
|
23
|
-
end
|
24
|
-
|
25
|
-
def compute_name_with_namespace(repo)
|
26
|
-
[session.uri.hostname, repo.name.downcase].join("/")
|
27
|
-
end
|
28
|
-
|
29
|
-
def compute_ssh_url(repo)
|
30
|
-
"git@#{session.uri.hostname}:#{repo.name.downcase}.git"
|
31
|
-
end
|
32
|
-
|
33
|
-
def compute_web_url(repo)
|
34
|
-
"#{session.uri.scheme}://#{session.uri.hostname}:#{session.uri.port}/#{repo.name.downcase}"
|
35
|
-
end
|
36
|
-
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|