labclient 0.1.1 → 0.2.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 (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
@@ -4,7 +4,7 @@ module LabClient
4
4
  class SnippetNotes < Common
5
5
  doc 'Snippets' do
6
6
  title 'Create'
7
- desc 'Creates a new note for a single merge request [Project, Snippet ID]'
7
+ desc 'Creates a new note for a single snippet [Project, Snippet ID]'
8
8
  example 'client.notes.snippets.create(16, 2, body: "Hello!")'
9
9
  result <<~DOC
10
10
  => #<Note id: 44, type: Snippet>
@@ -5,18 +5,35 @@ module LabClient
5
5
  @group_name = 'Notes'
6
6
  doc 'Snippets' do
7
7
  title 'List'
8
- desc 'Gets a list of all notes for a single merge request. [Project ID, Snippet ID]'
8
+ desc 'Gets a list of all notes for a single snippet. [Project ID, Snippet ID]'
9
+ markdown <<~DOC
10
+ | Attribute | Type | Required | Description |
11
+ | --------- | ------ | -------- | ------------------------------------------------------------------------------------ |
12
+ | sort | string | no | Return snippet notes sorted in asc or desc order. Default is desc |
13
+ | order_by | string | no | Return snippet notes ordered by created_at or updated_at fields. Default is created_at |
14
+ DOC
15
+ end
16
+
17
+ doc 'Snippets' do
9
18
  example 'client.notes.snippets.list(16, 1)'
10
19
  result <<~DOC
11
20
  => [#<Note id: 21, type: Snippet>, #<Note id: 20, type: Snippet> .. ]
12
21
  DOC
13
22
  end
14
23
 
15
- def list(project_id, snippet_id)
24
+ doc 'Snippets' do
25
+ desc 'Filter or Sort'
26
+ example 'client.notes.snippets.list(16, 1, order_by: :created_at, sort: :asc)'
27
+ result <<~DOC
28
+ => [#<Note id: 21, type: Snippet>, #<Note id: 20, type: Snippet> .. ]
29
+ DOC
30
+ end
31
+
32
+ def list(project_id, snippet_id, query = {})
16
33
  project_id = format_id(project_id)
17
34
  snippet_id = format_id(snippet_id)
18
35
 
19
- client.request(:get, "projects/#{project_id}/snippets/#{snippet_id}/notes", Note)
36
+ client.request(:get, "projects/#{project_id}/snippets/#{snippet_id}/notes", Note, query)
20
37
  end
21
38
  end
22
39
  end
@@ -4,7 +4,7 @@ module LabClient
4
4
  class SnippetNotes < Common
5
5
  doc 'Snippets' do
6
6
  title 'Show'
7
- desc 'Returns a single note for a given merge request. [Project ID, Snippet ID, Note ID]'
7
+ desc 'Returns a single note for a given snippet. [Project ID, Snippet ID, Note ID]'
8
8
  example 'client.notes.snippets.show(16, 1, 43)'
9
9
  result <<~DOC
10
10
  => #<Note id: 21, type: Snippet>
@@ -33,7 +33,7 @@ module LabClient
33
33
  result <<~DOC
34
34
  OpenStruct {
35
35
  :level => "custom",
36
- :events => OpenStruct {
36
+ :events => LabStruct {
37
37
  :new_release => nil,
38
38
  :new_note => nil,
39
39
  :new_issue => nil,
@@ -7,11 +7,15 @@ module LabClient
7
7
 
8
8
  doc 'Overview' do
9
9
  title 'About'
10
- desc <<~DOC
10
+ markdown <<~DOC
11
11
  Labclient is another Gitlab API Gem. A focus on ease of use and helpers and snippets.
12
12
 
13
13
  <a href="https://github.com/NARKOZ/gitlab">Gitlab</a> is an excellent gem, and is nearly complete in its implementation. While this is still a work in progress and you are looking for general use you should use it.
14
+
15
+ Here's a quick whirlwind example of some of the features:
14
16
  DOC
17
+
18
+ demo '350689'
15
19
  end
16
20
 
17
21
  doc 'Overview' do
@@ -44,6 +48,41 @@ module LabClient
44
48
  DOC
45
49
  end
46
50
 
51
+ doc 'Authentication' do
52
+ title 'Named Profiles'
53
+ markdown 'Within the `~/.gitlab-labclient` you can also specify profile names'
54
+ example <<~DOC
55
+ {
56
+ "prod": {
57
+ "url": "https://labclient-prod",
58
+ "token": "super_secure",
59
+ "paginate": false
60
+ },
61
+ "dev": {
62
+ "url": "https://labclient-dev",
63
+ "token": "super_secure",
64
+ "ssl_verify": false,
65
+ "paginate": true
66
+ }
67
+ }
68
+ DOC
69
+ end
70
+
71
+ doc 'Authentication' do
72
+ desc 'Manually select a named profile'
73
+ example <<~DOC
74
+ client = LabClient::Client.new(profile: 'prod')
75
+ DOC
76
+ end
77
+
78
+ doc 'Authentication' do
79
+ desc 'Automatically select via ENV Variables'
80
+ example <<~DOC
81
+ ENV['LABCLIENT_PROFILE'] = 'dev'
82
+ client = LabClient::Client.new
83
+ DOC
84
+ end
85
+
47
86
  doc 'Authentication' do
48
87
  title 'Environment Variables'
49
88
  desc 'If not provided, and credentials file does not exist will attempt to use ENV variables'
@@ -143,6 +182,27 @@ module LabClient
143
182
  DOC
144
183
  end
145
184
 
185
+ doc 'Response' do
186
+ title 'Status'
187
+ desc 'Each object/call will return a "response" object or the instantiated class object. On each of these you can use "success?" to verify the response of a call.'
188
+
189
+ result <<~DOC
190
+ project = client.projects.show 123123
191
+ # => #<TyphoeusResponse code: 404>
192
+ project.success?
193
+ # => false
194
+
195
+ user = client.users.show 1
196
+ => #<User id: 1, username: root>
197
+ user.success?
198
+ => true
199
+ DOC
200
+
201
+ result <<~DOC
202
+ curl -k -H "Private-Token: super_secret_token" -H "Accept: application/json" "https://labclient/api/v4/users?"
203
+ DOC
204
+ end
205
+
146
206
  doc 'Other' do
147
207
  title 'Common Helpers'
148
208
  markdown <<~DOC
@@ -191,6 +251,20 @@ module LabClient
191
251
  DOC
192
252
  end
193
253
 
254
+ doc 'Other' do
255
+ desc 'Object Help'
256
+
257
+ result <<~DOC
258
+ project = client.projects.show(5)
259
+
260
+ # List Possible Methods
261
+ project.help
262
+
263
+ # Array result of methods
264
+ project.api_methods
265
+ DOC
266
+ end
267
+
194
268
  doc 'Other' do
195
269
  title 'Object IDs'
196
270
 
@@ -218,17 +292,18 @@ module LabClient
218
292
  end
219
293
 
220
294
  doc 'Other' do
221
- title 'Docker'
222
- desc 'A docker image is created from master and can be used to execute snippets or load a quick pry session'
223
-
224
- example 'docker run -it registry.gitlab.com/labclient/labclient'
225
-
226
- result <<~DOC
227
- # Run Container
228
- docker run -it -e LABCLIENT_URL="https://labclient" -e LABCLIENT_TOKEN="token" registry.gitlab.com/labclient/labclient
295
+ title 'Quiet'
296
+ desc 'Error messages by default are printed to STDOUT. This can be supressed via the :quiet setting'
229
297
 
230
- client = LabClient::Client.new
231
- client.users.list
298
+ example <<~DOC
299
+ client = LabClient::Client.new(
300
+ url: 'https://gitlab.labclient',
301
+ token: 'gitlab api token',
302
+ quiet: true
303
+ )
304
+
305
+ # Or after the init
306
+ client.settings[:quiet] = true
232
307
  DOC
233
308
  end
234
309
 
@@ -256,6 +331,30 @@ module LabClient
256
331
  - [API Authentication](https://docs.gitlab.com/ee/api/README.html#authentication)
257
332
  DOC
258
333
  end
334
+
335
+ doc 'Docker' do
336
+ desc 'A docker image is created from master and can be used to execute snippets or load a quick pry session'
337
+
338
+ example 'docker run -it registry.gitlab.com/labclient/labclient'
339
+
340
+ result <<~DOC
341
+ # Run Container
342
+ docker run -it registry.gitlab.com/labclient/labclient
343
+ # Without settings configured, initial will prompt for credentials
344
+
345
+ client.users.list
346
+ DOC
347
+ end
348
+
349
+ doc 'Docker' do
350
+ desc 'The docker container configured and execute code snippets'
351
+
352
+ example 'docker run -it registry.gitlab.com/labclient/labclient'
353
+
354
+ result <<~DOC
355
+ docker run -it -e LABCLIENT_URL="https://labclient" -e LABCLIENT_TOKEN="secure_token" labclient 'puts client.users.list.count'
356
+ DOC
357
+ end
259
358
  end
260
359
  end
261
360
  # rubocop:enable Metrics/ClassLength
@@ -40,7 +40,9 @@ module LabClient
40
40
  DOC
41
41
  end
42
42
 
43
+ # rubocop:disable Lint/MissingSuper
43
44
  def respond_to_missing?(method_name, include_private = false); end
45
+ # rubocop:enable Lint/MissingSuper
44
46
 
45
47
  def each_page(&block)
46
48
  yield @array # This will eventually be the whole list
@@ -86,7 +88,7 @@ module LabClient
86
88
  end
87
89
 
88
90
  def link_regex
89
- /<([^>]+)>; rel=\"([^\"]+)\"/
91
+ /<([^>]+)>; rel="([^"]+)"/
90
92
  end
91
93
 
92
94
  def next_page
@@ -111,5 +113,10 @@ module LabClient
111
113
  process_entry(entry, @response)
112
114
  end
113
115
  end
116
+
117
+ # Forward response success
118
+ def success?
119
+ @response.success?
120
+ end
114
121
  end
115
122
  end
@@ -33,6 +33,45 @@ module LabClient
33
33
  client.jobs.pipeline(project_id, id, scope)
34
34
  end
35
35
 
36
+ def reload
37
+ project_id = collect_project_id
38
+ update_self client.pipelines.show(project_id, id)
39
+ end
40
+
41
+ # The status of pipelines, one of: running, pending, success, failed, canceled, skipped, created, manual
42
+
43
+ # Wait for Import / Set a Hard Limit
44
+ def wait_for_status(total_time = 300, sleep_time = 15)
45
+ # running
46
+ # pending
47
+ # success
48
+ # failed
49
+ # canceled
50
+ # skipped
51
+ # manual
52
+ # created
53
+
54
+ # Wait
55
+ # [running created pending]
56
+
57
+ # Success
58
+ # [skipped manual canceled success]
59
+
60
+ # Fail
61
+ # [failed]
62
+
63
+ Timeout.timeout(total_time) do
64
+ loop do
65
+ reload
66
+ puts "Waiting for Pipeline: #{status}"
67
+ break if %w[skipped manual canceled success].include? status
68
+ raise 'Pipeline failed' if status == 'failed'
69
+
70
+ sleep sleep_time
71
+ end
72
+ end
73
+ end
74
+
36
75
  # DateTime Fields
37
76
  date_time_attrs %i[created_at updated_at finished_at started_at]
38
77
  user_attrs %i[user]
@@ -43,6 +82,8 @@ module LabClient
43
82
  option 'retry', 'Retry jobs in this pipeline'
44
83
  option 'cancel', 'Cancel jobs in this pipeline'
45
84
  option 'delete', 'Delete this pipeline'
85
+ option 'reload', 'Reload this pipeline object (New API Call)'
86
+ option 'wait_for_status', 'Looping, wait for merge request status [Timeout, Interval]'
46
87
  end
47
88
  end
48
89
  end
@@ -7,8 +7,8 @@ module LabClient
7
7
  client.projects.users(id)
8
8
  end
9
9
 
10
- def events
11
- client.events.project(id)
10
+ def events(query = {})
11
+ client.events.project(id, query)
12
12
  end
13
13
 
14
14
  def delete
@@ -346,6 +346,10 @@ module LabClient
346
346
  client.branches.show(id, branch_id)
347
347
  end
348
348
 
349
+ def branch_create(query)
350
+ client.branches.create(id, query)
351
+ end
352
+
349
353
  def branch_delete(branch_id)
350
354
  client.branches.delete(id, branch_id)
351
355
  end
@@ -488,6 +492,23 @@ module LabClient
488
492
  client.projects.environments.stop(id, environment_id)
489
493
  end
490
494
 
495
+ # Protected Environments
496
+ def protected_environments
497
+ client.protected_environments.list(id)
498
+ end
499
+
500
+ def protected_environment(environment_id)
501
+ client.protected_environments.show(id, environment_id)
502
+ end
503
+
504
+ def protect_environment(query)
505
+ client.protected_environments.protect(id, query)
506
+ end
507
+
508
+ def unprotect_environment(environment_id)
509
+ client.protected_environments.unprotect(id, environment_id)
510
+ end
511
+
491
512
  # Project Triggers
492
513
  def triggers
493
514
  client.projects.triggers.list(id)
@@ -620,6 +641,10 @@ module LabClient
620
641
  client.merge_requests.list_project(id, query)
621
642
  end
622
643
 
644
+ def merge_request_create(query)
645
+ client.merge_requests.create(id, query)
646
+ end
647
+
623
648
  # Access Requests
624
649
  def request_access
625
650
  client.projects.access_requests.create(id)
@@ -681,6 +706,50 @@ module LabClient
681
706
  def clusters
682
707
  client.projects.clusters.list(id)
683
708
  end
709
+
710
+ # Reload
711
+ def reload
712
+ update_self client.projects.show(id)
713
+ end
714
+
715
+ # Parent Helper
716
+ def parent
717
+ case namespace.kind
718
+ when 'user'
719
+ client.users.show(namespace.id)
720
+ when 'group'
721
+ client.groups.show(namespace.id)
722
+ end
723
+ end
724
+
725
+ # Snippets
726
+ def snippets
727
+ client.projects.snippets.list(id)
728
+ end
729
+
730
+ def snippet_create(query)
731
+ client.projects.snippets.create(id, query)
732
+ end
733
+
734
+ # Wait for Import / Set a Hard Limit
735
+ def wait_for_import(total_time = 300, sleep_time = 15)
736
+ # none
737
+ # scheduled
738
+ # failed
739
+ # started
740
+ # finished
741
+
742
+ Timeout.timeout(total_time) do
743
+ loop do
744
+ reload
745
+ puts "Waiting for Import Status: #{import_status}"
746
+ break if %w[none finished].include? import_status
747
+ raise "Import Failed: #{import_error}" if import_status == 'failed'
748
+
749
+ sleep sleep_time
750
+ end
751
+ end
752
+ end
684
753
  end
685
754
  # rubocop:enable Metrics/ModuleLength
686
755
  end
@@ -8,6 +8,9 @@ module LabClient
8
8
  option 'archive', 'Archive this project'
9
9
  option 'delete', 'Schedule/Delete this project'
10
10
  option 'events', "List this project's events"
11
+ option 'reload', 'Reload this project object (New API Call)'
12
+ option 'wait_for_import', 'Looping, wait for project import [Timeout, Interval]'
13
+
11
14
  option 'fork_existing', 'Create Fork Relationship [Target/Source Project]'
12
15
  option 'fork_remove', 'Remove Fork Relationshgip'
13
16
  option 'fork', 'Fork this project, accepts hash, [namespace, path, name]'
@@ -68,6 +71,12 @@ module LabClient
68
71
  option 'environment_update', 'Update project environment [Environment ID, Hash]'
69
72
  option 'environment_stop', 'Stop project environment [Environment ID]'
70
73
 
74
+ # Protected Environments
75
+ option 'protected_environments', 'List protected environments [String]'
76
+ option 'protected_environment', 'Show single protected environment [String]'
77
+ option 'protect_environment', 'Protect a single environment [Hash]'
78
+ option 'unprotect_environment', 'Unprotect environment [Environment]'
79
+
71
80
  # Deployments
72
81
  option 'deployments', "List this project's deployments"
73
82
  option 'deployment_create', 'Create project deployment [Hash]'
@@ -201,6 +210,7 @@ module LabClient
201
210
  # Branches
202
211
  option 'branches', 'List repository branches [String]'
203
212
  option 'branch', 'Get a single repository branches [Branch Name]'
213
+ option 'branch_create', 'Create a repository branches [Hash]'
204
214
  option 'branch_delete', 'Delete a single repository branches [Branch Name]'
205
215
  option 'branch_delete_merged', 'Will delete all branches that are merged into the project’s default branch'
206
216
 
@@ -238,6 +248,7 @@ module LabClient
238
248
 
239
249
  # Merge Requests
240
250
  option 'merge_requests', 'List project merge requests, [Hash]'
251
+ option 'merge_request_create', 'Create new merge request [Hash]'
241
252
 
242
253
  # Access Requests
243
254
  option 'access_requests', 'List access requests for project'
@@ -251,6 +262,9 @@ module LabClient
251
262
 
252
263
  # Clusters
253
264
  option 'clusters', 'Returns a list of project clusters.'
265
+
266
+ option 'events', 'List project events [Hash]'
267
+ option 'parent', 'Show (API Call) Project Parent, returns either Group or User'
254
268
  end
255
269
  end
256
270
  # rubocop:enable Metrics/BlockLength, Metrics/ClassLength