labclient 0.1.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (66) hide show
  1. checksums.yaml +4 -4
  2. data/lib/labclient.rb +23 -4
  3. data/lib/labclient/access_levels.rb +24 -30
  4. data/lib/labclient/branches/branch.rb +25 -0
  5. data/lib/labclient/branches/create.rb +33 -0
  6. data/lib/labclient/client.rb +48 -7
  7. data/lib/labclient/docs.rb +9 -5
  8. data/lib/labclient/epics/epic.rb +13 -0
  9. data/lib/labclient/error.rb +1 -0
  10. data/lib/labclient/files/create.rb +14 -8
  11. data/lib/labclient/generator/generator.rb +70 -0
  12. data/lib/labclient/generator/names.rb +68 -0
  13. data/lib/labclient/generator/template_helper.rb +81 -0
  14. data/lib/labclient/generator/templates/environments.rb +98 -0
  15. data/lib/labclient/generator/templates/pages.rb +67 -0
  16. data/lib/labclient/generator/templates/pipeline_trigger.rb +82 -0
  17. data/lib/labclient/generator/wizard.rb +142 -0
  18. data/lib/labclient/groups/group.rb +9 -1
  19. data/lib/labclient/http.rb +3 -2
  20. data/lib/labclient/issues/create.rb +2 -0
  21. data/lib/labclient/issues/issue.rb +31 -1
  22. data/lib/labclient/issues/update.rb +20 -2
  23. data/lib/labclient/jobs/delete.rb +1 -1
  24. data/lib/labclient/jobs/keep.rb +1 -1
  25. data/lib/labclient/jobs/play.rb +1 -1
  26. data/lib/labclient/jobs/trace.rb +2 -2
  27. data/lib/labclient/klass.rb +34 -4
  28. data/lib/labclient/lab_struct.rb +17 -0
  29. data/lib/labclient/license/list.rb +2 -2
  30. data/lib/labclient/members/member.rb +1 -0
  31. data/lib/labclient/merge_requests/accept.rb +15 -6
  32. data/lib/labclient/merge_requests/create.rb +12 -0
  33. data/lib/labclient/merge_requests/merge_request.rb +49 -4
  34. data/lib/labclient/notes/epics/create.rb +12 -4
  35. data/lib/labclient/notes/epics/delete.rb +3 -3
  36. data/lib/labclient/notes/epics/list.rb +21 -4
  37. data/lib/labclient/notes/epics/show.rb +4 -4
  38. data/lib/labclient/notes/epics/update.rb +4 -4
  39. data/lib/labclient/notes/issues/create.rb +11 -1
  40. data/lib/labclient/notes/issues/list.rb +18 -3
  41. data/lib/labclient/notes/issues/show.rb +1 -1
  42. data/lib/labclient/notes/merge_requests/create.rb +8 -0
  43. data/lib/labclient/notes/merge_requests/list.rb +20 -2
  44. data/lib/labclient/notes/snippets/create.rb +1 -1
  45. data/lib/labclient/notes/snippets/list.rb +20 -3
  46. data/lib/labclient/notes/snippets/show.rb +1 -1
  47. data/lib/labclient/notifications/update.rb +1 -1
  48. data/lib/labclient/overview.rb +110 -11
  49. data/lib/labclient/paginated_response.rb +8 -1
  50. data/lib/labclient/pipelines/pipeline.rb +41 -0
  51. data/lib/labclient/projects/methods.rb +71 -2
  52. data/lib/labclient/projects/reference.rb +14 -0
  53. data/lib/labclient/projects/snippets/project_snippet.rb +12 -0
  54. data/lib/labclient/protected_branches/protect.rb +6 -5
  55. data/lib/labclient/protected_environments/list.rb +29 -0
  56. data/lib/labclient/protected_environments/protect.rb +53 -0
  57. data/lib/labclient/protected_environments/protected_environment.rb +22 -0
  58. data/lib/labclient/protected_environments/show.rb +24 -0
  59. data/lib/labclient/protected_environments/unprotect.rb +31 -0
  60. data/lib/labclient/snippets/snippet.rb +2 -2
  61. data/lib/labclient/users/membership.rb +62 -0
  62. data/lib/labclient/users/memberships.rb +8 -3
  63. data/lib/labclient/users/user.rb +13 -1
  64. data/lib/labclient/version.rb +1 -1
  65. metadata +37 -9
  66. data/lib/labclient/open_struct.rb +0 -14
@@ -32,12 +32,12 @@ module LabClient
32
32
  :expires_at => "2050-11-14",
33
33
  :historical_max => 0,
34
34
  :maximum_user_count => 48,
35
- :licensee => OpenStruct {
35
+ :licensee => LabStruct {
36
36
  :Name => "GitLab Henley",
37
37
  :Email => "test_user@gitlab.com",
38
38
  :Company => "GitLab, Inc."
39
39
  },
40
- :add_ons => OpenStruct {},
40
+ :add_ons => LabStruct {},
41
41
  :expired => false,
42
42
  :overage => 0,
43
43
  :user_limit => 100,
@@ -51,6 +51,7 @@ module LabClient
51
51
  option 'level', 'Humanized symbol of access level. e.g. :developer'
52
52
  option 'user', 'Collect user object.'
53
53
  option '<permission>?', 'True/False evaluation each guest?, developer? etc'
54
+ option 'greater_than', 'True/False if user has greater than [Permission Name]'
54
55
  end
55
56
  end
56
57
  end
@@ -7,10 +7,19 @@ module LabClient
7
7
  desc 'Merge changes submitted with MR. [Project ID, merge request iid]'
8
8
 
9
9
  markdown <<~DOC
10
- - <small>if merge request is unable to be accepted (ie: Work in Progress, Closed, Pipeline Pending Completion, or Failed while requiring Success) - you'll get a `405` and the error message 'Method Not Allowed'</small>
11
- - <small>If it has some conflicts and can not be merged - you'll get a `406` and the error message 'Branch cannot be merged'</small>
12
- - <small>If the `sha` parameter is passed and does not match the HEAD of the source - you'll get a `409` and the error message 'SHA </small>does not match HEAD of source branch'
13
- - <small>If you don't have permissions to accept this merge request - you'll get a `401`</small>
10
+ - <small>if merge request is unable to be accepted (ie: Work in Progress, Closed, Pipeline Pending Completion, or Failed while requiring Success) - you'll get a `405` and the error message 'Method Not Allowed'</small>
11
+ - <small>If it has some conflicts and can not be merged - you'll get a `406` and the error message 'Branch cannot be merged'</small>
12
+ - <small>If the `sha` parameter is passed and does not match the HEAD of the source - you'll get a `409` and the error message 'SHA </small>does not match HEAD of source branch'
13
+ - <small>If you don't have permissions to accept this merge request - you'll get a `401`</small>
14
+
15
+ | **Attribute** | **Attribute** |
16
+ | ---------------------------- | ------------------------------------------------------------------------------------------------- |
17
+ | merge_commit_message | Custom merge commit message |
18
+ | squash_commit_message | Custom squash commit message |
19
+ | squash | if true the commits will be squashed into a single commit on merge |
20
+ | should_remove_source_branch | if true removes the source branch |
21
+ | merge_when_pipeline_succeeds | if true the MR is merged when the pipeline succeeds |
22
+ | sha | if present, then this SHA must match the HEAD of the source branch, otherwise the merge will fail |
14
23
  DOC
15
24
 
16
25
  example 'client.merge_requests.accept(343, 3)'
@@ -29,11 +38,11 @@ module LabClient
29
38
  end
30
39
 
31
40
  # Accept
32
- def accept(project_id, merge_request_id)
41
+ def accept(project_id, merge_request_id, query = {})
33
42
  project_id = format_id(project_id)
34
43
  merge_request_id = format_id(merge_request_id)
35
44
 
36
- client.request(:put, "projects/#{project_id}/merge_requests/#{merge_request_id}/merge", MergeRequest)
45
+ client.request(:put, "projects/#{project_id}/merge_requests/#{merge_request_id}/merge", MergeRequest, query)
37
46
  end
38
47
  end
39
48
  end
@@ -41,6 +41,18 @@ module LabClient
41
41
  DOC
42
42
  end
43
43
 
44
+ doc 'Create' do
45
+ desc 'via Project'
46
+ example <<~DOC
47
+ project = client.projects.show(264)
48
+ project.merge_request_create(
49
+ title: 'New MR!',
50
+ source_branch: 'sweet-release',
51
+ target_branch: :master
52
+ )
53
+ DOC
54
+ end
55
+
44
56
  # Create
45
57
  def create(project_id, query)
46
58
  project_id = format_id(project_id)
@@ -51,8 +51,8 @@ module LabClient
51
51
  client.merge_requests.delete(project_id, iid)
52
52
  end
53
53
 
54
- def accept
55
- client.merge_requests.accept(project_id, iid)
54
+ def accept(query = {})
55
+ client.merge_requests.accept(project_id, iid, query)
56
56
  end
57
57
 
58
58
  def merge_ref
@@ -99,6 +99,10 @@ module LabClient
99
99
  client.notes.merge_requests.list(project_id, iid)
100
100
  end
101
101
 
102
+ def note_create(query)
103
+ client.notes.merge_requests.create(project_id, iid, query)
104
+ end
105
+
102
106
  def todo
103
107
  client.merge_requests.todo(project_id, iid)
104
108
  end
@@ -166,9 +170,42 @@ module LabClient
166
170
  client.resource_labels.merge_requests.show(project_id, iid, resource_event_id)
167
171
  end
168
172
 
173
+ # Reload
174
+ def reload
175
+ update_self client.merge_requests.show(project_id, iid)
176
+ end
177
+
178
+ # Wait for Import / Set a Hard Limit
179
+ def wait_for_merge_status(total_time = 300, sleep_time = 15)
180
+ # :unchecked
181
+ # :cannot_be_merged_recheck
182
+ # :checking
183
+ # :cannot_be_merged_rechecking
184
+ # :can_be_merged
185
+ # :cannot_be_merged
186
+
187
+ # Success
188
+ # [unchecked, can_be_merged]
189
+
190
+ # Fail
191
+ # [cannot_be_merged cannot_be_merged_recheck]
192
+
193
+ Timeout.timeout(total_time) do
194
+ loop do
195
+ reload
196
+ puts "Waiting for Merge Status: #{merge_status}"
197
+ break if %w[can_be_merged unchecked].include? merge_status
198
+ raise "Cannot be merged! #{import_error}" if %w[cannot_be_merged cannot_be_merged_recheck].include? merge_status
199
+
200
+ sleep sleep_time
201
+ end
202
+ end
203
+ end
204
+
205
+ # rubocop:disable Metrics/BlockLength
169
206
  help do
170
207
  subtitle 'MergeRequest'
171
- option 'accept', 'Merge changes submitted'
208
+ option 'accept', 'Merge changes submitted [Hash]'
172
209
  option 'add_time_spent', 'Adds spent time. Accepts Duration or Human Format. (1.hour or "1h")'
173
210
  option 'changes', 'Show merge request changes'
174
211
  option 'closes_issues', 'Show issues that this merge request will close'
@@ -176,7 +213,13 @@ module LabClient
176
213
  option 'create_pipeline', 'Create new pipeline for this merge request.'
177
214
  option 'delete', 'Delete this merge request.'
178
215
  option 'merge_ref', 'Show Merge Ref'
179
- option 'notes', 'List notes/comments.'
216
+ option 'reload', 'Reload this merge request object (New API Call)'
217
+ option 'wait_for_merge_status', 'Looping, wait for merge request status [Timeout, Interval]'
218
+
219
+ # Notes
220
+ option 'notes', 'List notes/comments. [Hash]'
221
+ option 'note_create', 'Creates a new note. [Hash]'
222
+
180
223
  option 'participants', 'List participants in this merge request.'
181
224
  option 'pipelines', 'List pipelines in this merge request.'
182
225
  option 'reset_spent_time', 'Resets the spent time'
@@ -206,6 +249,8 @@ module LabClient
206
249
  option 'resource_labels', 'List of all label events'
207
250
  option 'resource_label', 'Show single label event [Resource Event ID]'
208
251
  end
252
+
253
+ # rubocop:enable Metrics/BlockLength
209
254
  end
210
255
  # rubocop:enable Metrics/ClassLength
211
256
  end
@@ -4,13 +4,21 @@ module LabClient
4
4
  class EpicNotes < Common
5
5
  doc 'Epics' do
6
6
  title 'Create'
7
- desc 'Creates a new note for a single merge request [Project, Epic IID]'
7
+ desc 'Creates a new note for a single epic [Project, Epic IID]'
8
8
  example 'client.notes.epics.create(16, 2, body: "Hello!")'
9
9
  result <<~DOC
10
10
  => #<Note id: 44, type: Epic>
11
11
  DOC
12
12
  end
13
13
 
14
+ doc 'Epics' do
15
+ desc 'Via Epic'
16
+ example <<~DOC
17
+ epic = client.epics.show(16, 2)
18
+ epic.note_create(body: 'There!')
19
+ DOC
20
+ end
21
+
14
22
  doc 'Epics' do
15
23
  markdown <<~DOC
16
24
  | Attribute | Type | Required | Description |
@@ -20,13 +28,13 @@ module LabClient
20
28
  DOC
21
29
  end
22
30
 
23
- def create(project_id, epic_id, query = {})
24
- project_id = format_id(project_id)
31
+ def create(group_id, epic_id, query = {})
32
+ group_id = format_id(group_id)
25
33
  epic_id = format_id(epic_id)
26
34
 
27
35
  query[:created_at] = query[:created_at].to_time.iso8601 if format_time?(query[:created_at])
28
36
 
29
- client.request(:post, "projects/#{project_id}/epics/#{epic_id}/notes", Note, query)
37
+ client.request(:post, "groups/#{group_id}/epics/#{epic_id}/notes", Note, query)
30
38
  end
31
39
  end
32
40
  end
@@ -9,12 +9,12 @@ module LabClient
9
9
  end
10
10
 
11
11
  # Delete
12
- def delete(project_id, epic_id, note_id)
13
- project_id = format_id(project_id)
12
+ def delete(group_id, epic_id, note_id)
13
+ group_id = format_id(group_id)
14
14
  epic_id = format_id(epic_id)
15
15
  note_id = format_id(note_id)
16
16
 
17
- client.request(:delete, "projects/#{project_id}/epics/#{epic_id}/notes/#{note_id}")
17
+ client.request(:delete, "groups/#{group_id}/epics/#{epic_id}/notes/#{note_id}")
18
18
  end
19
19
  end
20
20
  end
@@ -5,18 +5,35 @@ module LabClient
5
5
  @group_name = 'Notes'
6
6
  doc 'Epics' do
7
7
  title 'List'
8
- desc 'Gets a list of all notes for a single merge request. [Project ID, Epic IID]'
8
+ desc 'Gets a list of all notes for a single epic. [Project ID, Epic IID]'
9
+ markdown <<~DOC
10
+ | Attribute | Type | Required | Description |
11
+ | --------- | ------ | -------- | ------------------------------------------------------------------------------------ |
12
+ | sort | string | no | Return epic notes sorted in asc or desc order. Default is desc |
13
+ | order_by | string | no | Return epic notes ordered by created_at or updated_at fields. Default is created_at |
14
+ DOC
15
+ end
16
+
17
+ doc 'Epics' do
9
18
  example 'client.notes.epics.list(16, 1)'
10
19
  result <<~DOC
11
20
  => [#<Note id: 21, type: Epic>, #<Note id: 20, type: Epic> .. ]
12
21
  DOC
13
22
  end
14
23
 
15
- def list(project_id, epic_id)
16
- project_id = format_id(project_id)
24
+ doc 'Epics' do
25
+ desc 'Filter or Sort'
26
+ example 'client.notes.epics.list(16, 1, order_by: :created_at, sort: :asc)'
27
+ result <<~DOC
28
+ => [#<Note id: 21, type: Epic>, #<Note id: 20, type: Epic> .. ]
29
+ DOC
30
+ end
31
+
32
+ def list(group_id, epic_id, query = {})
33
+ group_id = format_id(group_id)
17
34
  epic_id = format_id(epic_id)
18
35
 
19
- client.request(:get, "projects/#{project_id}/epics/#{epic_id}/notes", Note)
36
+ client.request(:get, "groups/#{group_id}/epics/#{epic_id}/notes", Note, query)
20
37
  end
21
38
  end
22
39
  end
@@ -4,19 +4,19 @@ module LabClient
4
4
  class EpicNotes < Common
5
5
  doc 'Epics' do
6
6
  title 'Show'
7
- desc 'Returns a single note for a given merge request. [Project ID, Epic IID, Note ID]'
7
+ desc 'Returns a single note for a given epic. [Project ID, Epic IID, Note ID]'
8
8
  example 'client.notes.epics.show(16, 1, 43)'
9
9
  result <<~DOC
10
10
  => #<Note id: 21, type: Epic>
11
11
  DOC
12
12
  end
13
13
 
14
- def show(project_id, epic_id, note_id)
15
- project_id = format_id(project_id)
14
+ def show(group_id, epic_id, note_id)
15
+ group_id = format_id(group_id)
16
16
  epic_id = format_id(epic_id)
17
17
  note_id = format_id(note_id)
18
18
 
19
- client.request(:get, "projects/#{project_id}/epics/#{epic_id}/notes/#{note_id}", Note)
19
+ client.request(:get, "groups/#{group_id}/epics/#{epic_id}/notes/#{note_id}", Note)
20
20
  end
21
21
  end
22
22
  end
@@ -4,7 +4,7 @@ module LabClient
4
4
  class EpicNotes < Common
5
5
  doc 'Epics' do
6
6
  title 'Update'
7
- desc 'Get a single project epic. [Project ID, Epic IID, Note ID]'
7
+ desc 'Get a single group epic. [Project ID, Epic IID, Note ID]'
8
8
  example 'client.notes.epics.update(16, 1, 43, "Updaaate")'
9
9
  result <<~DOC
10
10
  => #<Note id: 43, type: Epic>
@@ -20,13 +20,13 @@ module LabClient
20
20
  end
21
21
 
22
22
  # Show
23
- def update(project_id, epic_id, note_id, body)
24
- project_id = format_id(project_id)
23
+ def update(group_id, epic_id, note_id, body)
24
+ group_id = format_id(group_id)
25
25
  epic_id = format_id(epic_id)
26
26
  note_id = format_id(note_id)
27
27
  query = { body: body }
28
28
 
29
- client.request(:put, "projects/#{project_id}/epics/#{epic_id}/notes/#{note_id}", Note, query)
29
+ client.request(:put, "groups/#{group_id}/epics/#{epic_id}/notes/#{note_id}", Note, query)
30
30
  end
31
31
  end
32
32
  end
@@ -4,13 +4,21 @@ module LabClient
4
4
  class IssueNotes < Common
5
5
  doc 'Issues' do
6
6
  title 'Create'
7
- desc 'Creates a new note for a single merge request [Project, Issue IID]'
7
+ desc 'Creates a new note for a single issue [Project, Issue IID]'
8
8
  example 'client.notes.issues.create(16, 2, body: "Hello!")'
9
9
  result <<~DOC
10
10
  => #<Note id: 44, type: Issue>
11
11
  DOC
12
12
  end
13
13
 
14
+ doc 'Issues' do
15
+ desc 'Via Issue'
16
+ example <<~DOC
17
+ issue = client.issues.show(16, 1)
18
+ issue.note_create(body: 'There!')
19
+ DOC
20
+ end
21
+
14
22
  doc 'Issues' do
15
23
  markdown <<~DOC
16
24
  | Attribute | Type | Required | Description |
@@ -26,6 +34,8 @@ module LabClient
26
34
 
27
35
  query[:created_at] = query[:created_at].to_time.iso8601 if format_time?(query[:created_at])
28
36
 
37
+ # POST /projects/:id/issues/:issue_iid/notes
38
+
29
39
  client.request(:post, "projects/#{project_id}/issues/#{issue_id}/notes", Note, query)
30
40
  end
31
41
  end
@@ -3,20 +3,35 @@ module LabClient
3
3
  # Specifics
4
4
  class IssueNotes < Common
5
5
  @group_name = 'Notes'
6
+
6
7
  doc 'Issues' do
7
8
  title 'List'
8
- desc 'Gets a list of all notes for a single merge request. [Project ID, Issue IID]'
9
+ desc 'Gets a list of all notes for a single issue. [Project ID, Issue IID]'
10
+ markdown <<~DOC
11
+ | Attribute | Type | Required | Description |
12
+ | --------- | ------ | -------- | ------------------------------------------------------------------------------------ |
13
+ | sort | string | no | Return issue notes sorted in asc or desc order. Default is desc |
14
+ | order_by | string | no | Return issue notes ordered by created_at or updated_at fields. Default is created_at |
15
+ DOC
16
+ end
17
+
18
+ doc 'Issues' do
9
19
  example 'client.notes.issues.list(16, 1)'
10
20
  result <<~DOC
11
21
  => [#<Note id: 21, type: Issue>, #<Note id: 20, type: Issue> .. ]
12
22
  DOC
13
23
  end
14
24
 
15
- def list(project_id, issue_id)
25
+ doc 'Issues' do
26
+ desc 'Sort or Filter'
27
+ example 'client.notes.issues.list(16, 1, order_by: :created_at, sort: :asc)'
28
+ end
29
+
30
+ def list(project_id, issue_id, query = {})
16
31
  project_id = format_id(project_id)
17
32
  issue_id = format_id(issue_id)
18
33
 
19
- client.request(:get, "projects/#{project_id}/issues/#{issue_id}/notes", Note)
34
+ client.request(:get, "projects/#{project_id}/issues/#{issue_id}/notes", Note, query)
20
35
  end
21
36
  end
22
37
  end
@@ -4,7 +4,7 @@ module LabClient
4
4
  class IssueNotes < Common
5
5
  doc 'Issues' do
6
6
  title 'Show'
7
- desc 'Returns a single note for a given merge request. [Project ID, Issue IID, Note ID]'
7
+ desc 'Returns a single note for a given issue. [Project ID, Issue IID, Note ID]'
8
8
  example 'client.notes.issues.show(16, 1, 43)'
9
9
  result <<~DOC
10
10
  => #<Note id: 21, type: Issue>
@@ -11,6 +11,14 @@ module LabClient
11
11
  DOC
12
12
  end
13
13
 
14
+ doc 'Merge Request' do
15
+ desc 'Via Merge Request'
16
+ example <<~DOC
17
+ merge_request = client.merge_requests.show(16, 2)
18
+ merge_request.note_create(body: 'There!')
19
+ DOC
20
+ end
21
+
14
22
  doc 'Merge Requests' do
15
23
  markdown <<~DOC
16
24
  | Attribute | Type | Required | Description |
@@ -6,17 +6,35 @@ module LabClient
6
6
  doc 'Merge Requests' do
7
7
  title 'List'
8
8
  desc 'Gets a list of all notes for a single merge request. [Project ID, Merge Request IID]'
9
+
10
+ markdown <<~DOC
11
+ | Attribute | Type | Required | Description |
12
+ | --------- | ------ | -------- | -------------------------------------------------------------------------------------------- |
13
+ | sort | string | no | Return merge request notes sorted in asc or desc order. Default is desc |
14
+ | order_by | string | no | Return merge request notes ordered by created_at or updated_at fields. Default is created_at |
15
+ DOC
16
+ end
17
+
18
+ doc 'Merge Requests' do
9
19
  example 'client.notes.merge_requests.list(16, 1)'
10
20
  result <<~DOC
11
21
  => [#<Note id: 21, type: MergeRequest>, #<Note id: 20, type: MergeRequest> .. ]
12
22
  DOC
13
23
  end
14
24
 
15
- def list(project_id, merge_request_id)
25
+ doc 'Merge Requests' do
26
+ desc 'Sort or Filter'
27
+ example 'client.notes.merge_requests.list(16, 1, order_by: :created_at, sort: :asc)'
28
+ result <<~DOC
29
+ => [#<Note id: 21, type: MergeRequest>, #<Note id: 20, type: MergeRequest> .. ]
30
+ DOC
31
+ end
32
+
33
+ def list(project_id, merge_request_id, query = {})
16
34
  project_id = format_id(project_id)
17
35
  merge_request_id = format_id(merge_request_id)
18
36
 
19
- client.request(:get, "projects/#{project_id}/merge_requests/#{merge_request_id}/notes", Note)
37
+ client.request(:get, "projects/#{project_id}/merge_requests/#{merge_request_id}/notes", Note, query)
20
38
  end
21
39
  end
22
40
  end