gitlab 3.2.0 → 3.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (48) hide show
  1. checksums.yaml +4 -4
  2. data/CONTRIBUTING.md +195 -0
  3. data/README.md +12 -0
  4. data/lib/gitlab.rb +5 -0
  5. data/lib/gitlab/cli.rb +6 -0
  6. data/lib/gitlab/cli_helpers.rb +40 -3
  7. data/lib/gitlab/client.rb +1 -0
  8. data/lib/gitlab/client/labels.rb +55 -0
  9. data/lib/gitlab/client/merge_requests.rb +20 -2
  10. data/lib/gitlab/client/projects.rb +18 -9
  11. data/lib/gitlab/client/repositories.rb +84 -4
  12. data/lib/gitlab/configuration.rb +1 -1
  13. data/lib/gitlab/help.rb +2 -2
  14. data/lib/gitlab/objectified_hash.rb +4 -0
  15. data/lib/gitlab/request.rb +18 -6
  16. data/lib/gitlab/shell.rb +42 -4
  17. data/lib/gitlab/shell_history.rb +61 -0
  18. data/lib/gitlab/version.rb +1 -1
  19. data/spec/fixtures/compare_merge_request_diff.json +31 -0
  20. data/spec/fixtures/label.json +1 -0
  21. data/spec/fixtures/labels.json +1 -0
  22. data/spec/fixtures/{comment_merge_request.json → merge_request_comment.json} +0 -0
  23. data/spec/fixtures/project_commit_comment.json +1 -0
  24. data/spec/fixtures/project_commit_comments.json +1 -0
  25. data/spec/fixtures/project_tag_annotated.json +1 -0
  26. data/spec/fixtures/project_tag_lightweight.json +1 -0
  27. data/spec/fixtures/raw_file.json +2 -0
  28. data/spec/fixtures/shell_history.json +2 -0
  29. data/spec/fixtures/tree.json +1 -0
  30. data/spec/gitlab/client/branches_spec.rb +12 -31
  31. data/spec/gitlab/client/labels_spec.rb +68 -0
  32. data/spec/gitlab/client/merge_requests_spec.rb +39 -17
  33. data/spec/gitlab/client/projects_spec.rb +1 -1
  34. data/spec/gitlab/client/repositories_spec.rb +110 -5
  35. data/spec/gitlab/client/system_hooks_spec.rb +3 -3
  36. data/spec/gitlab/objectified_hash_spec.rb +19 -1
  37. data/spec/gitlab/request_spec.rb +4 -3
  38. data/spec/gitlab/shell_history_spec.rb +53 -0
  39. data/spec/gitlab_spec.rb +21 -1
  40. metadata +32 -21
  41. data/spec/fixtures/create_branch.json +0 -1
  42. data/spec/fixtures/create_merge_request.json +0 -1
  43. data/spec/fixtures/project_delete_key.json +0 -8
  44. data/spec/fixtures/protect_branch.json +0 -1
  45. data/spec/fixtures/system_hook_test.json +0 -1
  46. data/spec/fixtures/tag.json +0 -1
  47. data/spec/fixtures/unprotect_branch.json +0 -1
  48. data/spec/fixtures/update_merge_request.json +0 -1
@@ -0,0 +1,68 @@
1
+ require 'spec_helper'
2
+
3
+ describe Gitlab::Client do
4
+ describe ".labels" do
5
+ before do
6
+ stub_get("/projects/3/labels", "labels")
7
+ @labels = Gitlab.labels(3)
8
+ end
9
+
10
+ it "should get the correct resource" do
11
+ expect(a_get("/projects/3/labels")).to have_been_made
12
+ end
13
+
14
+ it "should return an array of project's labels" do
15
+ expect(@labels).to be_an Array
16
+ expect(@labels.first.name).to eq("Backlog")
17
+ end
18
+ end
19
+
20
+ describe ".delete" do
21
+ before do
22
+ stub_delete("/projects/3/labels", "label")
23
+ @label = Gitlab.delete_label(3, "Backlog")
24
+ end
25
+
26
+ it "should get the correct resource" do
27
+ expect(a_delete("/projects/3/labels").
28
+ with(:body => {:name => 'Backlog'})).to have_been_made
29
+ end
30
+
31
+ it "should return information about a deleted snippet" do
32
+ expect(@label.name).to eq("Backlog")
33
+ end
34
+ end
35
+
36
+ describe ".edit_label" do
37
+ before do
38
+ stub_put("/projects/3/labels", "label")
39
+ @label = Gitlab.edit_label(3, "TODO", :new_name => 'Backlog')
40
+ end
41
+
42
+ it "should get the correct resource" do
43
+ expect(a_put("/projects/3/labels").
44
+ with(:body => {:name => 'TODO', :new_name => "Backlog"})).to have_been_made
45
+ end
46
+
47
+ it "should return information about an edited label" do
48
+ expect(@label.name).to eq("Backlog")
49
+ end
50
+ end
51
+
52
+ describe ".create_label" do
53
+ before do
54
+ stub_post("/projects/3/labels", "label")
55
+ @label = Gitlab.create_label(3, 'Backlog', '#DD10AA')
56
+ end
57
+
58
+ it "should get the correct resource" do
59
+ expect(a_post("/projects/3/labels").
60
+ with(:body => {:name => 'Backlog', :color => '#DD10AA'})).to have_been_made
61
+ end
62
+
63
+ it "should return information about a created label" do
64
+ expect(@label.name).to eq('Backlog')
65
+ expect(@label.color).to eq('#DD10AA')
66
+ end
67
+ end
68
+ end
@@ -35,7 +35,7 @@ describe Gitlab::Client do
35
35
 
36
36
  describe ".create_merge_request" do
37
37
  before do
38
- stub_post("/projects/3/merge_requests", "create_merge_request")
38
+ stub_post("/projects/3/merge_requests", "merge_request")
39
39
  end
40
40
 
41
41
  it "should fail if it doesn't have a source_branch" do
@@ -57,13 +57,17 @@ describe Gitlab::Client do
57
57
  )
58
58
  expect(@merge_request.project_id).to eq(3)
59
59
  expect(@merge_request.assignee.name).to eq("Jack Smith")
60
- expect(@merge_request.title).to eq('New feature')
61
60
  end
62
61
  end
63
62
 
64
63
  describe ".update_merge_request" do
65
64
  before do
66
- stub_put("/projects/3/merge_request/2", "update_merge_request")
65
+ stub_put("/projects/3/merge_request/2", "merge_request").
66
+ with(:body => {
67
+ :assignee_id => '1',
68
+ :target_branch => 'master',
69
+ :title => 'A different new feature'
70
+ })
67
71
  @merge_request = Gitlab.update_merge_request(3, 2,
68
72
  :assignee_id => '1',
69
73
  :target_branch => 'master',
@@ -71,26 +75,36 @@ describe Gitlab::Client do
71
75
  )
72
76
  end
73
77
 
78
+ it "should get the correct resource" do
79
+ expect(a_put("/projects/3/merge_request/2").
80
+ with(:body => {
81
+ :assignee_id => '1',
82
+ :target_branch => 'master',
83
+ :title => 'A different new feature'
84
+ })).to have_been_made
85
+ end
86
+
74
87
  it "should return information about a merge request" do
75
88
  expect(@merge_request.project_id).to eq(3)
76
89
  expect(@merge_request.assignee.name).to eq("Jack Smith")
77
- expect(@merge_request.title).to eq('A different new feature')
78
90
  end
79
91
  end
80
92
 
81
- describe ".merge_request_comments" do
93
+ describe ".accept_merge_request" do
82
94
  before do
83
- stub_get("/projects/3/merge_request/2/comments", "merge_request_comments")
84
- @merge_request = Gitlab.merge_request_comments(3, 2)
95
+ stub_put("/projects/5/merge_request/42/merge", "merge_request").
96
+ with(:body => {:merge_commit_message => 'Nice!'})
97
+ @merge_request = Gitlab.accept_merge_request(5, 42, :merge_commit_message => 'Nice!')
85
98
  end
86
99
 
87
- it "should return merge request's comments" do
88
- expect(@merge_request).to be_an Array
89
- expect(@merge_request.length).to eq(2)
90
- expect(@merge_request[0].note).to eq("this is the 1st comment on the 2merge merge request")
91
- expect(@merge_request[0].author.id).to eq(11)
92
- expect(@merge_request[1].note).to eq("another discussion point on the 2merge request")
93
- expect(@merge_request[1].author.id).to eq(12)
100
+ it "should get the correct resource" do
101
+ expect(a_put("/projects/5/merge_request/42/merge").
102
+ with(:body => {:merge_commit_message => 'Nice!'})).to have_been_made
103
+ end
104
+
105
+ it "should return information about merged merge request" do
106
+ expect(@merge_request.project_id).to eq(3)
107
+ expect(@merge_request.assignee.name).to eq("Jack Smith")
94
108
  end
95
109
  end
96
110
 
@@ -100,6 +114,10 @@ describe Gitlab::Client do
100
114
  @merge_request = Gitlab.merge_request_comments(3, 2)
101
115
  end
102
116
 
117
+ it "should get the correct resource" do
118
+ expect(a_get("/projects/3/merge_request/2/comments")).to have_been_made
119
+ end
120
+
103
121
  it "should return merge request's comments" do
104
122
  expect(@merge_request).to be_an Array
105
123
  expect(@merge_request.length).to eq(2)
@@ -112,13 +130,17 @@ describe Gitlab::Client do
112
130
 
113
131
  describe ".create_merge_request_comment" do
114
132
  before do
115
- stub_post("/projects/3/merge_request/2/comments", "comment_merge_request")
133
+ stub_post("/projects/3/merge_request/2/comments", "merge_request_comment")
134
+ @merge_request = Gitlab.create_merge_request_comment(3, 2, 'Cool Merge Request!')
135
+ end
136
+
137
+ it "should get the correct resource" do
138
+ expect(a_post("/projects/3/merge_request/2/comments")).to have_been_made
116
139
  end
117
140
 
118
141
  it "should return information about a merge request" do
119
- @merge_request = Gitlab.create_merge_request_comment(3, 2, 'Cool Merge Request!')
120
142
  expect(@merge_request.note).to eq('Cool Merge Request!')
121
- @merge_request.author.id == 1
143
+ expect(@merge_request.author.id).to eq(1)
122
144
  end
123
145
  end
124
146
  end
@@ -342,7 +342,7 @@ describe Gitlab::Client do
342
342
 
343
343
  describe ".delete_deploy_key" do
344
344
  before do
345
- stub_delete("/projects/42/keys/2", "project_delete_key")
345
+ stub_delete("/projects/42/keys/2", "project_key")
346
346
  @deploy_key = Gitlab.delete_deploy_key(42, 2)
347
347
  end
348
348
 
@@ -8,6 +8,10 @@ describe Gitlab::Client do
8
8
  it { should respond_to :repo_commits }
9
9
  it { should respond_to :repo_commit }
10
10
  it { should respond_to :repo_commit_diff }
11
+ it { should respond_to :repo_commit_comments }
12
+ it { should respond_to :repo_create_commit_comment }
13
+ it { should respond_to :repo_tree }
14
+ it { should respond_to :repo_compare}
11
15
 
12
16
  describe ".tags" do
13
17
  before do
@@ -25,18 +29,68 @@ describe Gitlab::Client do
25
29
  end
26
30
  end
27
31
 
32
+ describe ".file_contents" do
33
+ before do
34
+ stub_get("/projects/3/repository/blobs/master?filepath=Gemfile", "raw_file")
35
+ @file_contents = Gitlab.file_contents(3, "Gemfile")
36
+ end
37
+
38
+ it "should get the correct resource" do
39
+ expect(a_get("/projects/3/repository/blobs/master?filepath=Gemfile")).to have_been_made
40
+ end
41
+
42
+ it "should return file contents" do
43
+ expect(@file_contents).to eq("source 'https://rubygems.org'\ngem 'rails', '4.1.2'\n")
44
+ end
45
+ end
46
+
28
47
  describe ".create_tag" do
48
+ context "when lightweight" do
49
+ before do
50
+ stub_post("/projects/3/repository/tags", "project_tag_lightweight")
51
+ @tag = Gitlab.create_tag(3, 'v1.0.0', '2695effb5807a22ff3d138d593fd856244e155e7')
52
+ end
53
+
54
+ it "should get the correct resource" do
55
+ expect(a_post("/projects/3/repository/tags")).to have_been_made
56
+ end
57
+
58
+ it "should return information about a new repository tag" do
59
+ expect(@tag.name).to eq("v1.0.0")
60
+ expect(@tag.message).to eq(nil)
61
+ end
62
+ end
63
+
64
+ context "when annotated" do
65
+ before do
66
+ stub_post("/projects/3/repository/tags", "project_tag_annotated")
67
+ @tag = Gitlab.create_tag(3, 'v1.1.0', '2695effb5807a22ff3d138d593fd856244e155e7', 'Release 1.1.0')
68
+ end
69
+
70
+ it "should get the correct resource" do
71
+ expect(a_post("/projects/3/repository/tags")).to have_been_made
72
+ end
73
+
74
+ it "should return information about a new repository tag" do
75
+ expect(@tag.name).to eq("v1.1.0")
76
+ expect(@tag.message).to eq("Release 1.1.0")
77
+ end
78
+ end
79
+ end
80
+
81
+ describe ".tree" do
29
82
  before do
30
- stub_post("/projects/3/repository/tags", "tag")
31
- @tag = Gitlab.create_tag(3, 'v1.0.0', '2695effb5807a22ff3d138d593fd856244e155e7')
83
+ stub_get("/projects/3/repository/tree", "tree")
84
+ @tree = Gitlab.tree(3)
32
85
  end
33
86
 
34
87
  it "should get the correct resource" do
35
- expect(a_post("/projects/3/repository/tags")).to have_been_made
88
+ expect(a_get("/projects/3/repository/tree")).to have_been_made
36
89
  end
37
90
 
38
- it "should return information about a new repository tag" do
39
- expect(@tag.name).to eq("v1.0.0")
91
+ it "should return an array of repository tree files (root level)" do
92
+ expect(@tree).to be_an Array
93
+ expect(@tree.first.name).to eq("app")
40
94
  end
41
95
  end
42
96
 
@@ -89,4 +143,55 @@ describe Gitlab::Client do
89
143
  expect(@diff.new_path).to eq("doc/update/5.4-to-6.0.md")
90
144
  end
91
145
  end
146
+
147
+ describe ".commit_comments" do
148
+ before do
149
+ stub_get("/projects/3/repository/commits/6104942438c14ec7bd21c6cd5bd995272b3faff6/comments", "project_commit_comments")
150
+ @commit_comments = Gitlab.commit_comments(3, '6104942438c14ec7bd21c6cd5bd995272b3faff6')
151
+ end
152
+
153
+ it "should get the correct resource" do
154
+ expect(a_get("/projects/3/repository/commits/6104942438c14ec7bd21c6cd5bd995272b3faff6/comments"))
155
+ .to have_been_made
156
+ end
157
+
158
+ it "should return commit's comments" do
159
+ expect(@commit_comments).to be_an Array
160
+ expect(@commit_comments.length).to eq(2)
161
+ expect(@commit_comments[0].note).to eq("this is the 1st comment on commit 6104942438c14ec7bd21c6cd5bd995272b3faff6")
162
+ expect(@commit_comments[0].author.id).to eq(11)
163
+ expect(@commit_comments[1].note).to eq("another discussion point on commit 6104942438c14ec7bd21c6cd5bd995272b3faff6")
164
+ expect(@commit_comments[1].author.id).to eq(12)
165
+ end
166
+ end
167
+
168
+ describe ".create_commit_comment" do
169
+ before do
170
+ stub_post("/projects/3/repository/commits/6104942438c14ec7bd21c6cd5bd995272b3faff6/comments", "project_commit_comment")
171
+ @merge_request = Gitlab.create_commit_comment(3, '6104942438c14ec7bd21c6cd5bd995272b3faff6', 'Nice code!')
172
+ end
173
+
174
+ it "should return information about the newly created comment" do
175
+ expect(@merge_request.note).to eq('Nice code!')
176
+ expect(@merge_request.author.id).to eq(1)
177
+ end
178
+ end
179
+
180
+ describe ".compare" do
181
+ before do
182
+ stub_get("/projects/3/repository/compare", "compare_merge_request_diff").
183
+ with(:query => {:from => "master", :to => "feature"})
184
+ @diff = Gitlab.compare(3, 'master', 'feature')
185
+ end
186
+
187
+ it "should get the correct resource" do
188
+ expect(a_get("/projects/3/repository/compare").
189
+ with(:query => {:from => "master", :to => "feature"})).to have_been_made
190
+ end
191
+
192
+ it "should get diffs of a merge request" do
193
+ expect(@diff.diffs).to be_kind_of Array
194
+ expect(@diff.diffs.last["new_path"]).to eq "files/js/application.js"
195
+ end
196
+ end
92
197
  end
@@ -39,16 +39,16 @@ describe Gitlab::Client do
39
39
 
40
40
  describe ".hook" do
41
41
  before do
42
- stub_get("/hooks/3", "system_hook_test")
42
+ stub_get("/hooks/3", "system_hook")
43
43
  @hook = Gitlab.hook(3)
44
44
  end
45
+
45
46
  it "should get the correct resource" do
46
47
  expect(a_get("/hooks/3")).to have_been_made
47
48
  end
48
49
 
49
50
  it "should return information about a added system hook" do
50
- expect(@hook.event_name).to eq("project_create")
51
- expect(@hook.project_id).to eq(1)
51
+ expect(@hook.url).to eq("http://example.com/hook")
52
52
  end
53
53
  end
54
54
 
@@ -2,7 +2,7 @@ require 'spec_helper'
2
2
 
3
3
  describe Gitlab::ObjectifiedHash do
4
4
  before do
5
- @hash = {a: 1, b: 2}
5
+ @hash = {a: 1, b: 2, 'string' => 'string', symbol: :symbol}
6
6
  @oh = Gitlab::ObjectifiedHash.new @hash
7
7
  end
8
8
 
@@ -20,4 +20,22 @@ describe Gitlab::ObjectifiedHash do
20
20
  expect(@oh.respond_to?(:to_h)).to be_truthy
21
21
  end
22
22
  end
23
+
24
+ describe "#respond_to" do
25
+ it "should return true for methods this object responds to through method_missing as sym" do
26
+ expect(@oh.respond_to?(:a)).to be_truthy
27
+ end
28
+
29
+ it "should return true for methods this object responds to through method_missing as string" do
30
+ expect(@oh.respond_to?('string')).to be_truthy
31
+ end
32
+
33
+ it "should not care if you use a string or symbol to reference a method" do
34
+ expect(@oh.respond_to?(:string)).to be_truthy
35
+ end
36
+
37
+ it "should not care if you use a string or symbol to reference a method" do
38
+ expect(@oh.respond_to?('symbol')).to be_truthy
39
+ end
40
+ end
23
41
  end
@@ -34,9 +34,10 @@ describe Gitlab::Request do
34
34
  end
35
35
 
36
36
  context "when endpoint is set" do
37
- it "should set base_uri" do
38
- Gitlab::Request.new.set_request_defaults('http://rabbit-hole.example.org', 1234000)
39
- expect(Gitlab::Request.base_uri).to eq("http://rabbit-hole.example.org")
37
+ it "should set instance variable 'endpoint'" do
38
+ request = Gitlab::Request.new
39
+ request.set_request_defaults('http://rabbit-hole.example.org', 1234000)
40
+ expect(request.instance_variable_get(:@endpoint)).to eq("http://rabbit-hole.example.org")
40
41
  end
41
42
 
42
43
  it "should set default_params" do
@@ -0,0 +1,53 @@
1
+ require 'spec_helper'
2
+ require 'tempfile'
3
+
4
+ describe Gitlab::Shell::History do
5
+ context 'saving to a file' do
6
+ before do
7
+ @file = Tempfile.new('.gitlab_shell_history')
8
+ @history = Gitlab::Shell::History.new(file_path: @file.path)
9
+ end
10
+
11
+ after do @file.close(true) end
12
+
13
+ it 'saves the lines' do
14
+ @history << 'party on, dudes'
15
+ @history << 'be excellent to each other'
16
+ @history.save
17
+ expect(File.read @file.path).
18
+ to eq("party on, dudes\nbe excellent to each other\n")
19
+ end
20
+
21
+ it 'has the lines' do
22
+ @history << 'party on, dudes'
23
+ @history << 'be excellent to each other'
24
+ expect(@history.lines).
25
+ to eq(["party on, dudes", "be excellent to each other"])
26
+ end
27
+
28
+ it 'limits the lines to GITLAB_HISTFILESIZE' do
29
+ ENV['GITLAB_HISTFILESIZE'] = '2'
30
+ @history << 'bogus'
31
+ @history << 'party on, dudes'
32
+ @history << 'be excellent to each other'
33
+ @history.save
34
+ expect(@history.lines).
35
+ to eq(["party on, dudes", "be excellent to each other"])
36
+ expect(File.read @file.path).
37
+ to eq("party on, dudes\nbe excellent to each other\n")
38
+ end
39
+ end
40
+
41
+ context 'loading a file' do
42
+ before do
43
+ @file = load_fixture('shell_history')
44
+ @history = Gitlab::Shell::History.new(file_path: @file.path)
45
+ end
46
+
47
+ it 'has the lines' do
48
+ @history.load
49
+ expect(@history.lines).
50
+ to eq(["party on, dudes", "be excellent to each other"])
51
+ end
52
+ end
53
+ end
@@ -7,6 +7,15 @@ describe Gitlab do
7
7
  it "should be a Gitlab::Client" do
8
8
  expect(Gitlab.client).to be_a Gitlab::Client
9
9
  end
10
+
11
+ it "should not override each other" do
12
+ client1 = Gitlab.client(endpoint: 'https://api1.example.com', private_token: '001')
13
+ client2 = Gitlab.client(endpoint: 'https://api2.example.com', private_token: '002')
14
+ expect(client1.endpoint).to eq('https://api1.example.com')
15
+ expect(client2.endpoint).to eq('https://api2.example.com')
16
+ expect(client1.private_token).to eq('001')
17
+ expect(client2.private_token).to eq('002')
18
+ end
10
19
  end
11
20
 
12
21
  describe ".actions" do
@@ -14,7 +23,7 @@ describe Gitlab do
14
23
  actions = Gitlab.actions
15
24
  expect(actions).to be_an Array
16
25
  expect(actions.first).to be_a Symbol
17
- expect(actions.sort.first).to match(/add_/)
26
+ expect(actions.sort.first).to eq(:accept_merge_request)
18
27
  end
19
28
  end
20
29
 
@@ -62,4 +71,15 @@ describe Gitlab do
62
71
  end
63
72
  end
64
73
  end
74
+
75
+ describe ".http_proxy" do
76
+ it "delegates the method to Gitlab::Request" do
77
+ Gitlab.endpoint = 'https://api.example.com'
78
+ request = class_spy(Gitlab::Request).as_stubbed_const
79
+
80
+ Gitlab.http_proxy('fazbearentertainment.com', 1987, 'ffazbear', 'itsme')
81
+ expect(request).to have_received(:http_proxy).
82
+ with('fazbearentertainment.com', 1987, 'ffazbear', 'itsme')
83
+ end
84
+ end
65
85
  end