gitlab 3.2.0 → 3.3.0

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.
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