vx-service_connector 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (30) hide show
  1. checksums.yaml +4 -4
  2. data/lib/vx/service_connector.rb +7 -6
  3. data/lib/vx/service_connector/error.rb +5 -0
  4. data/lib/vx/service_connector/gitlab_v41.rb +49 -0
  5. data/lib/vx/service_connector/gitlab_v41/commits.rb +35 -0
  6. data/lib/vx/service_connector/gitlab_v41/deploy_keys.rb +32 -0
  7. data/lib/vx/service_connector/gitlab_v41/files.rb +20 -0
  8. data/lib/vx/service_connector/gitlab_v41/hooks.rb +32 -0
  9. data/lib/vx/service_connector/gitlab_v41/notices.rb +13 -0
  10. data/lib/vx/service_connector/gitlab_v41/payload.rb +93 -0
  11. data/lib/vx/service_connector/gitlab_v41/repos.rb +40 -0
  12. data/lib/vx/service_connector/gitlab_v41/session.rb +58 -0
  13. data/lib/vx/service_connector/version.rb +1 -1
  14. data/spec/fixtures/gitlab_v41/commits.json +18 -0
  15. data/spec/fixtures/{gitlab_v3 → gitlab_v41}/deploy_keys.json +0 -0
  16. data/spec/fixtures/gitlab_v41/hooks.json +1 -0
  17. data/spec/fixtures/gitlab_v41/payload/push.json +106 -0
  18. data/spec/fixtures/gitlab_v41/projects.json +1 -0
  19. data/spec/fixtures/gitlab_v41/user_keys.json +1 -0
  20. data/spec/lib/gitlab_v41_payload_spec.rb +92 -0
  21. data/spec/lib/gitlab_v41_spec.rb +141 -0
  22. data/spec/lib/service_connector_spec.rb +2 -2
  23. data/spec/support/gitlab_v41_web_mocks.rb +73 -0
  24. metadata +30 -13
  25. data/lib/vx/service_connector/gitlab_v3.rb +0 -29
  26. data/lib/vx/service_connector/gitlab_v3/deploy_keys.rb +0 -20
  27. data/lib/vx/service_connector/gitlab_v3/repos.rb +0 -28
  28. data/spec/fixtures/gitlab_v3/projects.json +0 -72
  29. data/spec/lib/gitlab_v3_spec.rb +0 -44
  30. data/spec/support/gitlab_v3_mocks.rb +0 -29
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: eb54ddf9b4a35e3537d44d9e4a78ab1ff6f5e238
4
- data.tar.gz: bee8b9b125abac40e996387f3da6bfab65ffa460
3
+ metadata.gz: bc937a5f342e9a450658d50b50c8b4bb9f46912a
4
+ data.tar.gz: b2a972208b17bfc6d4c60c8725c6ce49e3a2dbbd
5
5
  SHA512:
6
- metadata.gz: 1d3256f9742c901bd636bfb62ce8893403982976276ea41642dc5e81624573e1205c2a637dc7e581b4f16e0f289c1faee62adce732b90bc9a6522325cd85e194
7
- data.tar.gz: d4e2fcfeda4695fb2a48153f8cf1c2339dc3f185161f5cc9d2e9cb476a38afccf487381e5a78d0a376009ae9875c95d19b099c2b97a53162851c971e1aebf31c
6
+ metadata.gz: 56bdaf27fdd6d26f450204ed80c8e78011bb525166ea08b166576990c75e39094169c42a7794addab07fed6274c3a39508d54e4d4d3c81b8617f4892c1369c2e
7
+ data.tar.gz: 01055be7c7e3547e4c1e6cf589a94fdb4575bfc41df56c196df56dd8fbdd3eefa0ac70f62fe61bc626aa12a5ef03aee1af8185ec68ba042552dc3c4573d26e7e
@@ -1,12 +1,13 @@
1
1
  require File.expand_path("../service_connector/version", __FILE__)
2
+ require File.expand_path("../service_connector/error", __FILE__)
2
3
 
3
4
  module Vx
4
5
  module ServiceConnector
5
6
 
6
- autoload :Base, File.expand_path("../service_connector/base", __FILE__)
7
- autoload :Github, File.expand_path("../service_connector/github", __FILE__)
8
- autoload :GitlabV3, File.expand_path("../service_connector/gitlab_v3", __FILE__)
9
- autoload :Model, File.expand_path("../service_connector/model", __FILE__)
7
+ autoload :Base, File.expand_path("../service_connector/base", __FILE__)
8
+ autoload :Github, File.expand_path("../service_connector/github", __FILE__)
9
+ autoload :GitlabV41, File.expand_path("../service_connector/gitlab_v41", __FILE__)
10
+ autoload :Model, File.expand_path("../service_connector/model", __FILE__)
10
11
 
11
12
  extend self
12
13
 
@@ -17,8 +18,8 @@ module Vx
17
18
  case name.to_sym
18
19
  when :github
19
20
  Github
20
- when :gitlab_v3
21
- GitlabV3
21
+ when :gitlab_v41
22
+ GitlabV41
22
23
  else
23
24
  raise ArgumentError, "Serivice for #{name.inspect} is not defined"
24
25
  end
@@ -0,0 +1,5 @@
1
+ module Vx
2
+ module ServiceConnector
3
+ class RequestError < StandardError ; end
4
+ end
5
+ end
@@ -0,0 +1,49 @@
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
@@ -0,0 +1,35 @@
1
+ require 'base64'
2
+
3
+ module Vx
4
+ module ServiceConnector
5
+ class GitlabV41
6
+ Commits = Struct.new(:session, :repo) do
7
+
8
+ def get(sha)
9
+ begin
10
+ all_commits = session.get "/projects/#{repo.id}/repository/commits", ref_name: sha
11
+ commits_to_model all_commits
12
+ rescue RequestError => e
13
+ $stderr.puts "ERROR: #{e.inspect}"
14
+ nil
15
+ end
16
+ end
17
+
18
+ private
19
+
20
+ def commits_to_model(commits)
21
+ if commit = commits.first
22
+ Model::Commit.new(
23
+ commit.id,
24
+ commit.title,
25
+ commit.author_name,
26
+ commit.author_email,
27
+ nil
28
+ )
29
+ end
30
+ end
31
+
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,32 @@
1
+ module Vx
2
+ module ServiceConnector
3
+ class GitlabV41
4
+ DeployKeys = Struct.new(:session, :repo) do
5
+
6
+ def all
7
+ session.get "/user/keys"
8
+ end
9
+
10
+ def create(key_name, public_key)
11
+ key_name = compute_key_name(key_name)
12
+ session.post "/user/keys", title: key_name, key: public_key
13
+ end
14
+
15
+ def destroy(key_name)
16
+ key_name = compute_key_name(key_name)
17
+ all.select do |key|
18
+ key.title == key_name
19
+ end.map do |key|
20
+ session.delete "/user/keys/#{key.id}"
21
+ end
22
+ end
23
+
24
+ private
25
+ def compute_key_name(orig_name)
26
+ "(#{repo.full_name}) #{orig_name}"
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+
@@ -0,0 +1,20 @@
1
+ require 'base64'
2
+
3
+ module Vx
4
+ module ServiceConnector
5
+ class GitlabV41
6
+ Files = Struct.new(:session, :repo) do
7
+
8
+ def get(sha, path)
9
+ begin
10
+ session.get("/projects/#{repo.id}/repository/commits/#{sha}/blob", filepath: path)
11
+ rescue RequestError => e
12
+ $stderr.puts "ERROR: #{e.inspect}"
13
+ nil
14
+ end
15
+ end
16
+
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,32 @@
1
+ module Vx
2
+ module ServiceConnector
3
+ class GitlabV41
4
+ Hooks = Struct.new(:session, :repo) do
5
+
6
+ def all
7
+ session.get hooks_url
8
+ end
9
+
10
+ def create(url, token)
11
+ session.post hooks_url, url: url
12
+ end
13
+
14
+ def destroy(url_mask)
15
+ all.select do |hook|
16
+ hook.url =~ /#{Regexp.escape url_mask}/
17
+ end.map do |hook|
18
+ session.delete hooks_url, hook_id: hook.id
19
+ end
20
+ end
21
+
22
+ private
23
+
24
+ def hooks_url
25
+ "/projects/#{repo.id}/hooks"
26
+ end
27
+
28
+ end
29
+ end
30
+ end
31
+ end
32
+
@@ -0,0 +1,13 @@
1
+ module Vx
2
+ module ServiceConnector
3
+ class GitlabV41
4
+ Notices = Struct.new(:session, :repo) do
5
+
6
+ def create(build_sha, build_status, build_url, description)
7
+ :not_available
8
+ end
9
+
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,93 @@
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
@@ -0,0 +1,40 @@
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
@@ -0,0 +1,58 @@
1
+ require 'sawyer'
2
+ require 'uri'
3
+
4
+ module Vx
5
+ module ServiceConnector
6
+ class GitlabV41
7
+
8
+ Session = Struct.new(:endpoint, :private_token) do
9
+
10
+ def get(url, options = {})
11
+ res = agent.call :get, request_url(url), nil, query: options
12
+ response! res
13
+ end
14
+
15
+ def post(url, options = {})
16
+ res = agent.call :post, request_url(url), options, nil
17
+ response! res
18
+ end
19
+
20
+ def delete(url, options = {})
21
+ res = agent.call :delete, request_url(url), options
22
+ response! res
23
+ end
24
+
25
+ def uri
26
+ @uri ||= URI(endpoint)
27
+ end
28
+
29
+ private
30
+
31
+ def response!(res)
32
+ if (200..204).include?(res.status)
33
+ res.data
34
+ else
35
+ raise RequestError, res.data
36
+ end
37
+ end
38
+
39
+ def request_url(url)
40
+ "/api/v3/#{url}"
41
+ end
42
+
43
+ def api_endpoint
44
+ "#{endpoint}/api/v3"
45
+ end
46
+
47
+ def agent
48
+ @agent ||= Sawyer::Agent.new(api_endpoint) do |http|
49
+ http.headers['content-type'] = 'application/json'
50
+ http.headers['accept'] = 'application/json'
51
+ http.headers['PRIVATE-TOKEN'] = private_token
52
+ end
53
+ end
54
+ end
55
+
56
+ end
57
+ end
58
+ end
@@ -1,5 +1,5 @@
1
1
  module Vx
2
2
  module ServiceConnector
3
- VERSION = "0.0.2"
3
+ VERSION = "0.0.3"
4
4
  end
5
5
  end
@@ -0,0 +1,18 @@
1
+ [
2
+ {
3
+ "id": "ed899a2f4b50b4370feeea94676502b42383c746",
4
+ "short_id": "ed899a2f4b5",
5
+ "title": "Replace sanitize with escape once",
6
+ "author_name": "Dmitriy Zaporozhets",
7
+ "author_email": "dzaporozhets@sphereconsultinginc.com",
8
+ "created_at": "2012-09-20T11:50:22+03:00"
9
+ },
10
+ {
11
+ "id": "6104942438c14ec7bd21c6cd5bd995272b3faff6",
12
+ "short_id": "6104942438c",
13
+ "title": "Sanitize for network graph",
14
+ "author_name": "randx",
15
+ "author_email": "dmitriy.zaporozhets@gmail.com",
16
+ "created_at": "2012-09-20T09:06:12+03:00"
17
+ }
18
+ ]
@@ -0,0 +1 @@
1
+ [{"id":57,"url":"http://example.com/hook","created_at":"2014-01-28T14:04:22Z"}]
@@ -0,0 +1,106 @@
1
+ {
2
+ "before": "e9f2a24318cf0a08dc2d7b987b9d8484e8c89406",
3
+ "after": "a1dfcca6369dcbd19607c4cc0f932194d8bdf57d",
4
+ "ref": "refs/heads/master",
5
+ "user_id": 228,
6
+ "user_name": "User Name",
7
+ "repository": {
8
+ "name": "SQERP",
9
+ "url": "git@gitlab.example.com:sqerp.git",
10
+ "description": null,
11
+ "homepage": "https://gitlab.example.com/sqerp"
12
+ },
13
+ "commits": [
14
+ {
15
+ "id": "4b65377d80364713293df276d7756ff6253eedcd",
16
+ "message": "Merge branch '93537_hours_units_in_details' of gitlab.example.com:sqerp",
17
+ "timestamp": "2014-01-21T08:51:56+04:00",
18
+ "url": "https://gitlab.example.com/sqerp/commit/4b65377d80364713293df276d7756ff6253eedcd",
19
+ "author": {
20
+ "name": "User Name",
21
+ "email": "me@example.com"
22
+ }
23
+ },
24
+ {
25
+ "id": "17574ef138f188e5b51a1f036448c92296b674e7",
26
+ "message": "[97241] activities_controller specs",
27
+ "timestamp": "2014-01-21T18:26:16+04:00",
28
+ "url": "https://gitlab.example.com/sqerp/commit/17574ef138f188e5b51a1f036448c92296b674e7",
29
+ "author": {
30
+ "name": "User Name",
31
+ "email": "me@example.com"
32
+ }
33
+ },
34
+ {
35
+ "id": "ca71c5938c9c796cddf2d5a32c2689669998bb0d",
36
+ "message": "fixes #84078 Custom roles.",
37
+ "timestamp": "2014-01-22T11:20:10+04:00",
38
+ "url": "https://gitlab.example.com/sqerp/commit/ca71c5938c9c796cddf2d5a32c2689669998bb0d",
39
+ "author": {
40
+ "name": "Maxim Dorofienko",
41
+ "email": "dorofienko@gmail.com"
42
+ }
43
+ },
44
+ {
45
+ "id": "f27d4dca4e7094fbb2206cd61ecbf933d77f0897",
46
+ "message": "[96071] merge ad_campaing's table",
47
+ "timestamp": "2014-01-22T12:20:55+04:00",
48
+ "url": "https://gitlab.example.com/sqerp/commit/f27d4dca4e7094fbb2206cd61ecbf933d77f0897",
49
+ "author": {
50
+ "name": "Evgeny Li",
51
+ "email": "exaspark@gmail.com"
52
+ }
53
+ },
54
+ {
55
+ "id": "432ead814f28ec1701584b7ffe130eeb8ecd3e1f",
56
+ "message": "csv exporter fix",
57
+ "timestamp": "2014-01-23T13:25:38+04:00",
58
+ "url": "https://gitlab.example.com/sqerp/commit/432ead814f28ec1701584b7ffe130eeb8ecd3e1f",
59
+ "author": {
60
+ "name": "Dmitry Koprov",
61
+ "email": "dmitry.koprov@gmail.com"
62
+ }
63
+ },
64
+ {
65
+ "id": "780c2e4a26ebf10691d157a64e3d7259f369d48f",
66
+ "message": "Merge branch '97241_controller_tests' of gitlab.example.com:sqerp",
67
+ "timestamp": "2014-01-23T14:58:27+04:00",
68
+ "url": "https://gitlab.example.com/sqerp/commit/780c2e4a26ebf10691d157a64e3d7259f369d48f",
69
+ "author": {
70
+ "name": "User Name",
71
+ "email": "me@example.com"
72
+ }
73
+ },
74
+ {
75
+ "id": "e63d231b1c3e6286bea9ffbceebd6c12d87e3dc7",
76
+ "message": "[98386] env fix",
77
+ "timestamp": "2014-01-28T11:52:48+04:00",
78
+ "url": "https://gitlab.example.com/sqerp/commit/e63d231b1c3e6286bea9ffbceebd6c12d87e3dc7",
79
+ "author": {
80
+ "name": "User Name",
81
+ "email": "me@example.com"
82
+ }
83
+ },
84
+ {
85
+ "id": "09d62be9db7e476b01c9773b5e06e5fc6a550d3c",
86
+ "message": "Merge branch '98386_fix' of gitlab.example.com:sqerp",
87
+ "timestamp": "2014-01-28T11:54:49+04:00",
88
+ "url": "https://gitlab.example.com/sqerp/commit/09d62be9db7e476b01c9773b5e06e5fc6a550d3c",
89
+ "author": {
90
+ "name": "User Name",
91
+ "email": "me@example.com"
92
+ }
93
+ },
94
+ {
95
+ "id": "a1dfcca6369dcbd19607c4cc0f932194d8bdf57d",
96
+ "message": "Merge branch '96071_merge_ad_campaigns' of gitlab.example.com:sqerp",
97
+ "timestamp": "2014-01-28T12:10:16+04:00",
98
+ "url": "https://gitlab.example.com/sqerp/commit/a1dfcca6369dcbd19607c4cc0f932194d8bdf57d",
99
+ "author": {
100
+ "name": "User Name",
101
+ "email": "me@example.com"
102
+ }
103
+ }
104
+ ],
105
+ "total_commits_count": 9
106
+ }
@@ -0,0 +1 @@
1
+ [{"id":9,"name":"SQERP","description":null,"default_branch":"master","owner":{"id":14,"username":null,"email":"me@example.com","name":"MyName","blocked":true,"created_at":"2012-06-21T07:47:41Z"},"private":true,"issues_enabled":true,"merge_requests_enabled":true,"wall_enabled":true,"wiki_enabled":true,"created_at":"2012-06-21T08:02:09Z","namespace":null}]
@@ -0,0 +1 @@
1
+ [{"id":589,"title":"(full/name) me@example.com","key":"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDXnM3fhBisPY223C7poY7J7qsMPHHc1aJ4+rwUqzdGHANNWoP8tCUXXnhWvhy8fxEqImDUWdYMNLQI42MJ8RB7naQjvWJqBU/JUvXRznrGcldPjmdIpb25Jod29wQDmPEYC31S1HoEEgmqVeG1V+ypxeqm8XEy1USjsY/Cbx0cbGUOa560GRV89/8KB4GHzN8R82OUxIzUJotIGIcAvNhYwR+skrsI2/QnDMqty2O5SQU52bgzlotCfSQbeujOT9DU3uP9YeRUcY/Xouqx19Q5TSPNk8rkh5uIHNKQ9LipJlfVU9G+YI0r5oMRlvqEXyR2gUEUwwhzafp8JQ4O/YJ7 me@example.com","created_at":"2013-10-24T12:41:18Z"}]
@@ -0,0 +1,92 @@
1
+ require 'spec_helper'
2
+
3
+ describe Vx::ServiceConnector::GitlabV41::Payload do
4
+ let(:content) { read_json_fixture("gitlab_v41/payload/push") }
5
+ let(:payload) { described_class.new content }
6
+ subject { payload }
7
+
8
+ context "push" do
9
+ let(:url) { "https://gitlab.example.com/sqerp/commit/4b65377d80364713293df276d7756ff6253eedcd" }
10
+
11
+ its(:pull_request?) { should be_false }
12
+ its(:pull_request_number) { should be_nil }
13
+ its(:head) { should eq 'a1dfcca6369dcbd19607c4cc0f932194d8bdf57d' }
14
+ its(:base) { should eq 'e9f2a24318cf0a08dc2d7b987b9d8484e8c89406' }
15
+ its(:branch) { should eq 'master' }
16
+ its(:branch_label) { should eq 'master' }
17
+ its(:url) { should eq url }
18
+
19
+ its(:pull_request_head_repo_id){ should be_nil }
20
+ its(:pull_request_base_repo_id){ should be_nil }
21
+ end
22
+
23
+ context "pull_request" do
24
+ end
25
+
26
+ context "tag?" do
27
+ end
28
+
29
+ context "closed_pull_request?" do
30
+ end
31
+
32
+ context "foreign_pull_request?" do
33
+ end
34
+
35
+ =begin
36
+ context "ignore?" do
37
+ subject { payload.ignore? }
38
+
39
+ context "when pull request" do
40
+ let(:content) { read_json_fixture("github/payload/foreign_pull_request") }
41
+ it { should be_false}
42
+
43
+ context "and is closed" do
44
+ before do
45
+ expect(payload).to receive(:closed_pull_request?) { true }
46
+ end
47
+ it { should be_true }
48
+ end
49
+
50
+ context "and same repo" do
51
+ let(:content) { read_json_fixture("github/payload/pull_request") }
52
+ it { should be_true }
53
+ end
54
+ end
55
+
56
+ context "when regular commit" do
57
+ it { should be_false }
58
+
59
+ context "and deleted branch" do
60
+ before do
61
+ expect(payload).to receive(:head) { '0000000000000000000000000000000000000000' }
62
+ end
63
+ it { should be_true }
64
+ end
65
+
66
+ context "and tag created" do
67
+ before do
68
+ expect(payload).to receive(:tag?) { true }
69
+ end
70
+ it { should be_true }
71
+ end
72
+ end
73
+ end
74
+ =end
75
+
76
+ context "to_model" do
77
+ subject { payload.to_model }
78
+ it { should be_instance_of(Vx::ServiceConnector::Model::Payload) }
79
+
80
+ its(:values) { should eq(
81
+ [false,
82
+ nil,
83
+ "a1dfcca6369dcbd19607c4cc0f932194d8bdf57d",
84
+ "e9f2a24318cf0a08dc2d7b987b9d8484e8c89406",
85
+ "master",
86
+ "master",
87
+ "https://gitlab.example.com/sqerp/commit/4b65377d80364713293df276d7756ff6253eedcd",
88
+ false]
89
+ ) }
90
+ end
91
+
92
+ end
@@ -0,0 +1,141 @@
1
+ require 'spec_helper'
2
+
3
+ describe Vx::ServiceConnector::GitlabV41 do
4
+
5
+ include GitlabV41WebMocks
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 "(notices)" do
17
+ let(:notices) { gitlab.notices(repo) }
18
+
19
+ context "create" do
20
+ subject { notices.create nil, nil, nil, nil }
21
+ it { should be :not_available }
22
+ end
23
+ end
24
+
25
+ context "(repos)" do
26
+ subject { gitlab.repos }
27
+
28
+ before do
29
+ mock_repos
30
+ end
31
+
32
+ it { should have(1).item }
33
+
34
+ context "values" do
35
+ subject { gitlab.repos.map(&:values) }
36
+ it { should eq(
37
+ [[9, "example.com/sqerp", true, "git@example.com:sqerp.git", "http://example.com:80/sqerp", nil]]
38
+ ) }
39
+ end
40
+ end
41
+
42
+ context "(deploy_keys)" do
43
+ let(:key_name) { 'me@example.com' }
44
+ let(:public_key) { 'public key' }
45
+ let(:deploy_keys) { gitlab.deploy_keys(repo) }
46
+
47
+ context "all" do
48
+ subject { deploy_keys.all }
49
+ before { mock_user_keys }
50
+ it { should have(1).item }
51
+ end
52
+
53
+ context "create" do
54
+ subject { deploy_keys.create key_name, public_key }
55
+ before { mock_add_user_key }
56
+ it { should be }
57
+ end
58
+
59
+ context "destroy" do
60
+ subject { deploy_keys.destroy key_name }
61
+
62
+ before do
63
+ mock_user_keys
64
+ mock_delete_user_key
65
+ end
66
+
67
+ it { should have(1).item }
68
+ end
69
+ end
70
+
71
+ context "(hooks)" do
72
+ let(:url) { 'url' }
73
+ let(:token) { 'token' }
74
+ let(:hooks) { gitlab.hooks(repo) }
75
+
76
+ context "all" do
77
+ subject { hooks.all }
78
+ before { mock_hooks }
79
+ it { should have(1).item }
80
+ end
81
+
82
+ context "create" do
83
+ subject { hooks.create url, token }
84
+ before { mock_add_hook }
85
+ it { should be }
86
+ end
87
+
88
+ context "destroy" do
89
+ let(:mask) { "http://example.com" }
90
+ subject { hooks.destroy mask }
91
+ before do
92
+ mock_hooks
93
+ mock_remove_hook
94
+ end
95
+ it { should have(1).item }
96
+ end
97
+ end
98
+
99
+ context "(files)" do
100
+ let(:sha) { 'sha' }
101
+ let(:path) { 'path' }
102
+
103
+ context "get" do
104
+ subject { gitlab.files(repo).get sha, path }
105
+
106
+ context "success" do
107
+ before { mock_get_file }
108
+ it { should eq 'content' }
109
+ end
110
+
111
+ context "not found" do
112
+ before { mock_get_file_not_found }
113
+ it { should be_nil }
114
+ end
115
+ end
116
+ end
117
+
118
+ context "(commits)" do
119
+ let(:sha) { 'sha' }
120
+
121
+ context "get" do
122
+ subject { gitlab.commits(repo).get sha }
123
+
124
+ context "success" do
125
+ before { mock_get_commit }
126
+ it { should be }
127
+ its(:sha) { should eq 'ed899a2f4b50b4370feeea94676502b42383c746' }
128
+ its(:message) { should eq 'Replace sanitize with escape once' }
129
+ its(:author) { should eq 'Dmitriy Zaporozhets' }
130
+ its(:author_email) { should eq 'dzaporozhets@sphereconsultinginc.com' }
131
+ its(:http_url) { should be_nil }
132
+ end
133
+
134
+ context "not found" do
135
+ before { mock_get_commit_not_found }
136
+ it { should be_nil }
137
+ end
138
+ end
139
+ end
140
+
141
+ end
@@ -21,8 +21,8 @@ describe Vx::ServiceConnector do
21
21
  it { should be }
22
22
  end
23
23
 
24
- context ":gitlab_v3" do
25
- let(:name) { :gitlab_v3 }
24
+ context ":gitlab_v41" do
25
+ let(:name) { :gitlab_v41 }
26
26
  it { should be }
27
27
  end
28
28
  end
@@ -0,0 +1,73 @@
1
+ module GitlabV41WebMocks
2
+
3
+ def mock_repos
4
+ mock_get "projects", 'projects'
5
+ end
6
+
7
+ def mock_user_keys
8
+ mock_get "user/keys", 'user_keys'
9
+ end
10
+
11
+ def mock_add_user_key
12
+ mock_post "user/keys", "{\"title\":\"(full/name) me@example.com\",\"key\":\"public key\"}"
13
+ end
14
+
15
+ def mock_delete_user_key
16
+ mock_delete "user/keys/589", '{}'
17
+ end
18
+
19
+ def mock_add_hook
20
+ mock_post "projects/1/hooks", "{\"url\":\"url\"}"
21
+ end
22
+
23
+ def mock_remove_hook
24
+ mock_delete "projects/1/hooks", "{\"hook_id\":57}"
25
+ end
26
+
27
+ def mock_hooks
28
+ mock_get "projects/1/hooks", 'hooks'
29
+ end
30
+
31
+ def mock_get_file
32
+ stub_request(:get, "http://example.com/api/v3/projects/1/repository/commits/sha/blob?filepath=path").
33
+ with(:headers => {'Accept'=>'application/json', 'Content-Type'=>'application/json', 'Private-Token'=>'token'}).
34
+ to_return(:status => 200, :body => "content")
35
+ end
36
+
37
+ def mock_get_file_not_found
38
+ stub_request(:get, "http://example.com/api/v3/projects/1/repository/commits/sha/blob?filepath=path").
39
+ with(:headers => {'Accept'=>'application/json', 'Content-Type'=>'application/json', 'Private-Token'=>'token'}).
40
+ to_return(:status => 404, :body => "")
41
+ end
42
+
43
+ def mock_get_commit
44
+ mock_get "projects/1/repository/commits?ref_name=sha", 'commits'
45
+ end
46
+
47
+ def mock_get_commit_not_found
48
+ stub_request(:get, "http://example.com/api/v3/projects/1/repository/commits?ref_name=sha").
49
+ with(:headers => {'Accept'=>'application/json', 'Content-Type'=>'application/json', 'Private-Token'=>'token'}).
50
+ to_return(:status => 404, :body => "")
51
+ end
52
+
53
+ def mock_get(url, fixture)
54
+ stub_request(:get, "http://example.com/api/v3/#{url}").
55
+ with(:headers => {'Accept'=>'application/json', 'PRIVATE-TOKEN' => "token"}).
56
+ to_return(
57
+ :status => 200,
58
+ :body => read_fixture("gitlab_v41/#{fixture}.json"),
59
+ :headers => {'Content-Type' => 'application/json'})
60
+ end
61
+
62
+ def mock_post(url, body)
63
+ stub_request(:post, "http://example.com/api/v3/#{url}").
64
+ with(:headers => {'Accept'=>'application/json', }, body: body).
65
+ to_return(:status => 200, :body => "{}", :headers => {'Content-Type' => 'application/json'})
66
+ end
67
+
68
+ def mock_delete(url, body)
69
+ stub_request(:delete, "http://example.com/api/v3/#{url}").
70
+ with(:headers => {'Accept'=>'application/json', }, body: body).
71
+ to_return(:status => 200, :body => "{}", :headers => {'Content-Type' => 'application/json'})
72
+ end
73
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vx-service_connector
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dmitry Galinsky
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-01-26 00:00:00.000000000 Z
11
+ date: 2014-01-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: octokit
@@ -110,6 +110,7 @@ files:
110
110
  - Rakefile
111
111
  - lib/vx/service_connector.rb
112
112
  - lib/vx/service_connector/base.rb
113
+ - lib/vx/service_connector/error.rb
113
114
  - lib/vx/service_connector/github.rb
114
115
  - lib/vx/service_connector/github/commits.rb
115
116
  - lib/vx/service_connector/github/deploy_keys.rb
@@ -118,9 +119,15 @@ files:
118
119
  - lib/vx/service_connector/github/notices.rb
119
120
  - lib/vx/service_connector/github/payload.rb
120
121
  - lib/vx/service_connector/github/repos.rb
121
- - lib/vx/service_connector/gitlab_v3.rb
122
- - lib/vx/service_connector/gitlab_v3/deploy_keys.rb
123
- - lib/vx/service_connector/gitlab_v3/repos.rb
122
+ - lib/vx/service_connector/gitlab_v41.rb
123
+ - lib/vx/service_connector/gitlab_v41/commits.rb
124
+ - lib/vx/service_connector/gitlab_v41/deploy_keys.rb
125
+ - lib/vx/service_connector/gitlab_v41/files.rb
126
+ - lib/vx/service_connector/gitlab_v41/hooks.rb
127
+ - lib/vx/service_connector/gitlab_v41/notices.rb
128
+ - lib/vx/service_connector/gitlab_v41/payload.rb
129
+ - lib/vx/service_connector/gitlab_v41/repos.rb
130
+ - lib/vx/service_connector/gitlab_v41/session.rb
124
131
  - lib/vx/service_connector/model.rb
125
132
  - lib/vx/service_connector/version.rb
126
133
  - spec/fixtures/github/add_deploy_key.json
@@ -137,17 +144,22 @@ files:
137
144
  - spec/fixtures/github/payload/push.json
138
145
  - spec/fixtures/github/payload/push_tag.json
139
146
  - spec/fixtures/github/user_repos.json
140
- - spec/fixtures/gitlab_v3/deploy_keys.json
141
- - spec/fixtures/gitlab_v3/projects.json
147
+ - spec/fixtures/gitlab_v41/commits.json
148
+ - spec/fixtures/gitlab_v41/deploy_keys.json
149
+ - spec/fixtures/gitlab_v41/hooks.json
150
+ - spec/fixtures/gitlab_v41/payload/push.json
151
+ - spec/fixtures/gitlab_v41/projects.json
152
+ - spec/fixtures/gitlab_v41/user_keys.json
142
153
  - spec/lib/github_payload_spec.rb
143
154
  - spec/lib/github_spec.rb
144
- - spec/lib/gitlab_v3_spec.rb
155
+ - spec/lib/gitlab_v41_payload_spec.rb
156
+ - spec/lib/gitlab_v41_spec.rb
145
157
  - spec/lib/model_spec.rb
146
158
  - spec/lib/service_connector_spec.rb
147
159
  - spec/spec_helper.rb
148
160
  - spec/support/create.rb
149
161
  - spec/support/github_web_mocks.rb
150
- - spec/support/gitlab_v3_mocks.rb
162
+ - spec/support/gitlab_v41_web_mocks.rb
151
163
  - spec/support/read_fixture.rb
152
164
  - vx-service_connector.gemspec
153
165
  homepage: ''
@@ -189,15 +201,20 @@ test_files:
189
201
  - spec/fixtures/github/payload/push.json
190
202
  - spec/fixtures/github/payload/push_tag.json
191
203
  - spec/fixtures/github/user_repos.json
192
- - spec/fixtures/gitlab_v3/deploy_keys.json
193
- - spec/fixtures/gitlab_v3/projects.json
204
+ - spec/fixtures/gitlab_v41/commits.json
205
+ - spec/fixtures/gitlab_v41/deploy_keys.json
206
+ - spec/fixtures/gitlab_v41/hooks.json
207
+ - spec/fixtures/gitlab_v41/payload/push.json
208
+ - spec/fixtures/gitlab_v41/projects.json
209
+ - spec/fixtures/gitlab_v41/user_keys.json
194
210
  - spec/lib/github_payload_spec.rb
195
211
  - spec/lib/github_spec.rb
196
- - spec/lib/gitlab_v3_spec.rb
212
+ - spec/lib/gitlab_v41_payload_spec.rb
213
+ - spec/lib/gitlab_v41_spec.rb
197
214
  - spec/lib/model_spec.rb
198
215
  - spec/lib/service_connector_spec.rb
199
216
  - spec/spec_helper.rb
200
217
  - spec/support/create.rb
201
218
  - spec/support/github_web_mocks.rb
202
- - spec/support/gitlab_v3_mocks.rb
219
+ - spec/support/gitlab_v41_web_mocks.rb
203
220
  - spec/support/read_fixture.rb
@@ -1,29 +0,0 @@
1
- require 'gitlab'
2
-
3
- module Vx
4
- module ServiceConnector
5
- GitlabV3 = Struct.new(:endpoint, :private_token) do
6
-
7
- include ServiceConnector::Base
8
-
9
- def repos
10
- @repos ||= GitlabV3::Repos.new(session).to_a
11
- end
12
-
13
- def deploy_keys(repo)
14
- GitlabV3::DeployKeys.new(session, repo)
15
- end
16
-
17
- private
18
-
19
- def create_session
20
- ::Gitlab.client(:endpoint => "#{endpoint}/api/v3", private_token: private_token)
21
- end
22
-
23
- end
24
- end
25
- end
26
-
27
- %w{ repos deploy_keys }.each do |f|
28
- require File.expand_path("../gitlab_v3/#{f}", __FILE__)
29
- end
@@ -1,20 +0,0 @@
1
- module Vx
2
- module ServiceConnector
3
- class GitlabV3
4
- DeployKeys = Struct.new(:session, :repo) do
5
-
6
- def all
7
- session.deploy_keys(repo.id)
8
- end
9
-
10
- def add(key_name, public_key)
11
- session.create_deploy_key(repo.id, key_name, public_key)
12
- end
13
-
14
- def remove(key_name)
15
- end
16
- end
17
- end
18
- end
19
- end
20
-
@@ -1,28 +0,0 @@
1
- module Vx
2
- module ServiceConnector
3
- class GitlabV3
4
- Repos = Struct.new(:session) do
5
-
6
- def to_a
7
- session.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
- repo.path_with_namespace,
18
- true,
19
- repo.ssh_url_to_repo,
20
- repo.web_url,
21
- repo.description
22
- )
23
- end
24
-
25
- end
26
- end
27
- end
28
- end
@@ -1,72 +0,0 @@
1
- [
2
- {
3
- "id": 4,
4
- "description": "description",
5
- "default_branch": "master",
6
- "public": false,
7
- "visibility_level": 0,
8
- "ssh_url_to_repo": "git@example.com:diaspora/diaspora-client.git",
9
- "http_url_to_repo": "http://example.com/diaspora/diaspora-client.git",
10
- "web_url": "http://example.com/diaspora/diaspora-client",
11
- "owner": {
12
- "id": 3,
13
- "name": "Diaspora",
14
- "created_at": "2013-09-30T13: 46: 02Z"
15
- },
16
- "name": "Diaspora Client",
17
- "name_with_namespace": "Diaspora / Diaspora Client",
18
- "path": "diaspora-client",
19
- "path_with_namespace": "diaspora/diaspora-client",
20
- "issues_enabled": true,
21
- "merge_requests_enabled": true,
22
- "wall_enabled": false,
23
- "wiki_enabled": true,
24
- "snippets_enabled": false,
25
- "created_at": "2013-09-30T13: 46: 02Z",
26
- "last_activity_at": "2013-09-30T13: 46: 02Z",
27
- "namespace": {
28
- "created_at": "2013-09-30T13: 46: 02Z",
29
- "description": "",
30
- "id": 3,
31
- "name": "Diaspora",
32
- "owner_id": 1,
33
- "path": "diaspora",
34
- "updated_at": "2013-09-30T13: 46: 02Z"
35
- }
36
- },
37
- {
38
- "id": 6,
39
- "description": "description",
40
- "default_branch": "master",
41
- "public": false,
42
- "visibility_level": 0,
43
- "ssh_url_to_repo": "git@example.com:brightbox/puppet.git",
44
- "http_url_to_repo": "http://example.com/brightbox/puppet.git",
45
- "web_url": "http://example.com/brightbox/puppet",
46
- "owner": {
47
- "id": 4,
48
- "name": "Brightbox",
49
- "created_at": "2013-09-30T13:46:02Z"
50
- },
51
- "name": "Puppet",
52
- "name_with_namespace": "Brightbox / Puppet",
53
- "path": "puppet",
54
- "path_with_namespace": "brightbox/puppet",
55
- "issues_enabled": true,
56
- "merge_requests_enabled": true,
57
- "wall_enabled": false,
58
- "wiki_enabled": true,
59
- "snippets_enabled": false,
60
- "created_at": "2013-09-30T13:46:02Z",
61
- "last_activity_at": "2013-09-30T13:46:02Z",
62
- "namespace": {
63
- "created_at": "2013-09-30T13:46:02Z",
64
- "description": "",
65
- "id": 4,
66
- "name": "Brightbox",
67
- "owner_id": 1,
68
- "path": "brightbox",
69
- "updated_at": "2013-09-30T13:46:02Z"
70
- }
71
- }
72
- ]
@@ -1,44 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Vx::ServiceConnector::GitlabV3 do
4
-
5
- include GitlabV3Mocks
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
- subject { gitlab }
12
-
13
- context "(repos)" do
14
- subject { gitlab.repos }
15
- before { mock_repos }
16
- it { should have(2).item }
17
- context "values" do
18
- subject { gitlab.repos.map(&:values) }
19
- it { should eq(
20
- [[4, "diaspora/diaspora-client", true,
21
- "git@example.com:diaspora/diaspora-client.git",
22
- "http://example.com/diaspora/diaspora-client",
23
- "description"],
24
- [6, "brightbox/puppet", true,
25
- "git@example.com:brightbox/puppet.git",
26
- "http://example.com/brightbox/puppet",
27
- "description"]]
28
- ) }
29
- end
30
- end
31
-
32
- context "(deploy_keys)" do
33
- let(:key_name) { 'key_name' }
34
- let(:public_key) { 'public_key' }
35
- let(:deploy_keys) { gitlab.deploy_keys(repo) }
36
-
37
- context "all" do
38
- subject { deploy_keys.all }
39
- before { mock_deploy_keys }
40
- it { should have(2).item }
41
- end
42
-
43
- end
44
- end
@@ -1,29 +0,0 @@
1
- module GitlabV3Mocks
2
-
3
- def mock_add_deploy_key
4
- mock_post "http://example.com/api/v3/projects/1/keys", '{}'
5
- end
6
-
7
- def mock_deploy_keys
8
- mock_get "http://example.com/api/v3/projects/1/keys", 'deploy_keys'
9
- end
10
-
11
- def mock_repos
12
- mock_get "http://example.com/api/v3/projects", 'projects'
13
- end
14
-
15
- def mock_get(url, fixture)
16
- stub_request(:get, "#{url}?private_token=token").
17
- with(:headers => {'Accept'=>'application/json'}).
18
- to_return(
19
- :status => 200,
20
- :body => read_fixture("gitlab_v3/#{fixture}.json"),
21
- :headers => {'Content-Type' => 'application/json'})
22
- end
23
-
24
- def mock_post(url, body)
25
- stub_request(:post, "#{url}?private_token=token").
26
- with(:headers => {'Accept'=>'application/json'}, body: body).
27
- to_return(:status => 200, :body => "{}", :headers => {'Content-Type' => 'application/json'})
28
- end
29
- end