labclient 0.1.2 → 0.1.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/labclient.rb +7 -4
- data/lib/labclient/branches/branch.rb +25 -0
- data/lib/labclient/branches/create.rb +33 -0
- data/lib/labclient/client.rb +2 -2
- data/lib/labclient/epics/epic.rb +13 -0
- data/lib/labclient/error.rb +1 -0
- data/lib/labclient/files/create.rb +14 -8
- data/lib/labclient/generator/generator.rb +2 -14
- data/lib/labclient/generator/names.rb +17 -3
- data/lib/labclient/generator/template_helper.rb +82 -0
- data/lib/labclient/generator/templates/environments.rb +98 -0
- data/lib/labclient/generator/templates/pages.rb +24 -30
- data/lib/labclient/generator/templates/pipeline_trigger.rb +82 -0
- data/lib/labclient/generator/wizard.rb +23 -7
- data/lib/labclient/http.rb +2 -1
- data/lib/labclient/issues/issue.rb +6 -1
- data/lib/labclient/klass.rb +3 -2
- data/lib/labclient/lab_struct.rb +17 -0
- data/lib/labclient/license/list.rb +2 -2
- data/lib/labclient/merge_requests/accept.rb +15 -6
- data/lib/labclient/merge_requests/create.rb +12 -0
- data/lib/labclient/merge_requests/merge_request.rb +49 -4
- data/lib/labclient/notes/epics/create.rb +4 -4
- data/lib/labclient/notes/epics/delete.rb +3 -3
- data/lib/labclient/notes/epics/list.rb +21 -4
- data/lib/labclient/notes/epics/show.rb +4 -4
- data/lib/labclient/notes/epics/update.rb +4 -4
- data/lib/labclient/notes/issues/create.rb +3 -1
- data/lib/labclient/notes/issues/list.rb +18 -3
- data/lib/labclient/notes/issues/show.rb +1 -1
- data/lib/labclient/notes/merge_requests/list.rb +20 -2
- data/lib/labclient/notes/snippets/create.rb +1 -1
- data/lib/labclient/notes/snippets/list.rb +20 -3
- data/lib/labclient/notes/snippets/show.rb +1 -1
- data/lib/labclient/notifications/update.rb +1 -1
- data/lib/labclient/paginated_response.rb +1 -1
- data/lib/labclient/pipelines/pipeline.rb +41 -0
- data/lib/labclient/projects/methods.rb +30 -2
- data/lib/labclient/projects/reference.rb +5 -0
- data/lib/labclient/projects/snippets/project_snippet.rb +12 -0
- data/lib/labclient/snippets/snippet.rb +2 -2
- data/lib/labclient/users/user.rb +6 -0
- data/lib/labclient/version.rb +1 -1
- metadata +10 -7
- data/lib/labclient/generator/templates/template.rb +0 -23
- data/lib/labclient/open_struct.rb +0 -14
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ab2d7a4a0dcf9e876c42f3d92537ad03f6cc9d00391bf574188de36fa5dde3a6
|
4
|
+
data.tar.gz: 9bba10386c15059b97c79a0e6f0ed322af7614736b78e55fd968f362e767dd8e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8998430e5b8d07584da6fe906d465238fd7725fa0773b9bb11a7b47dc755ce5fcb80d0cbb22055b16327665d70cbd034a24a63d310fabd11bd560c0ebd994f95
|
7
|
+
data.tar.gz: 3e61e5c568a93cfad5955198f6524349a89a06d729ead2d8f98c1d05c78e885edfb9fbb069fee2226731b26a1ab8c0404b857883f745d99c7564280e8f855b4d
|
data/lib/labclient.rb
CHANGED
@@ -3,7 +3,7 @@ require 'oj'
|
|
3
3
|
require 'pry'
|
4
4
|
require 'typhoeus'
|
5
5
|
require 'active_support/all'
|
6
|
-
require '
|
6
|
+
require 'amazing_print'
|
7
7
|
require 'gitlab_chronic_duration'
|
8
8
|
require 'ostruct'
|
9
9
|
|
@@ -13,8 +13,8 @@ require 'labclient/http'
|
|
13
13
|
require 'labclient/access_levels'
|
14
14
|
require 'labclient/common'
|
15
15
|
require 'labclient/curl'
|
16
|
+
require 'labclient/lab_struct'
|
16
17
|
require 'labclient/klass'
|
17
|
-
require 'labclient/open_struct'
|
18
18
|
require 'labclient/class_helpers'
|
19
19
|
require 'labclient/paginated_response'
|
20
20
|
require 'labclient/error'
|
@@ -768,6 +768,7 @@ require 'labclient/files/delete'
|
|
768
768
|
# Branches
|
769
769
|
require 'labclient/branches/list'
|
770
770
|
require 'labclient/branches/show'
|
771
|
+
require 'labclient/branches/create'
|
771
772
|
require 'labclient/branches/delete'
|
772
773
|
require 'labclient/branches/delete_merged'
|
773
774
|
require 'labclient/branches/branch'
|
@@ -844,12 +845,14 @@ require 'labclient/resource_labels/resource_label'
|
|
844
845
|
|
845
846
|
# Generators
|
846
847
|
require 'labclient/generator/names'
|
847
|
-
require 'labclient/generator/
|
848
|
-
require 'labclient/generator/templates/pages'
|
848
|
+
require 'labclient/generator/template_helper' # Default Include Template
|
849
849
|
|
850
850
|
# Wizard
|
851
851
|
require 'labclient/generator/generator'
|
852
852
|
require 'labclient/generator/wizard'
|
853
853
|
|
854
|
+
# Dynamically Require Templates (Simplify new template creation)
|
855
|
+
Dir[File.dirname(__FILE__) + '/labclient/generator/templates/*.rb'].sort.each { |file| require file }
|
856
|
+
|
854
857
|
# I am Very Last
|
855
858
|
require 'labclient/client'
|
@@ -11,5 +11,30 @@ module LabClient
|
|
11
11
|
def commit
|
12
12
|
Commit.new(@table[:commit], response, client)
|
13
13
|
end
|
14
|
+
|
15
|
+
def pipelines
|
16
|
+
project_id = collect_project_id
|
17
|
+
client.pipelines.list(project_id, ref: name)
|
18
|
+
end
|
19
|
+
|
20
|
+
# Wait for Import / Set a Hard Limit
|
21
|
+
def wait_for_pipelines(total_time = 300, sleep_time = 15)
|
22
|
+
Timeout.timeout(total_time) do
|
23
|
+
loop do
|
24
|
+
reload
|
25
|
+
puts 'Waiting for Pipelines'
|
26
|
+
break unless pipelines.empty?
|
27
|
+
|
28
|
+
sleep sleep_time
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
help do
|
34
|
+
subtitle 'Branch'
|
35
|
+
option 'commit', 'Show Commit information for branch'
|
36
|
+
option 'pipelines', 'Show Pipelines for this Branch/Ref'
|
37
|
+
option 'wait_for_pipelines', 'Looping, on newly created branches, wait for pipelines to populate (not finish) [Timeout, Interval]'
|
38
|
+
end
|
14
39
|
end
|
15
40
|
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# Top namespace
|
2
|
+
module LabClient
|
3
|
+
# Specifics
|
4
|
+
class Branches < Common
|
5
|
+
doc 'Create' do
|
6
|
+
desc 'Get a list of repository branches from a project, sorted by name alphabetically. [Project ID, String]'
|
7
|
+
example 'client.branches.create(264, branch: :branch, ref: :master)'
|
8
|
+
result '[#<Branch name: feature>, #<Branch name: master>]'
|
9
|
+
|
10
|
+
markdown <<~DOC
|
11
|
+
| Attribute | Type | Required | Description |
|
12
|
+
|----------|--------|---------|-------------------------------------------------------------------------------------------------------------|
|
13
|
+
| id | integer | yes | ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user. |
|
14
|
+
| branch | string | yes | Name of the branch. |
|
15
|
+
| ref | string | yes | Branch name or commit SHA to create branch from. |
|
16
|
+
DOC
|
17
|
+
end
|
18
|
+
|
19
|
+
doc 'Create' do
|
20
|
+
desc 'via Project'
|
21
|
+
example <<~DOC
|
22
|
+
project = client.projects.show(264)
|
23
|
+
project.branch_create(branch: :branch, ref: :master)
|
24
|
+
DOC
|
25
|
+
end
|
26
|
+
|
27
|
+
def create(project_id, query)
|
28
|
+
project_id = format_id(project_id)
|
29
|
+
|
30
|
+
client.request(:post, "projects/#{project_id}/repository/branches", Branch, query)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
data/lib/labclient/client.rb
CHANGED
@@ -139,10 +139,10 @@ module LabClient
|
|
139
139
|
resp
|
140
140
|
end
|
141
141
|
|
142
|
-
# Assume we want
|
142
|
+
# Assume we want LabStruct if @klass is ever nil
|
143
143
|
def process(resp)
|
144
144
|
case resp.data
|
145
|
-
when
|
145
|
+
when LabStruct
|
146
146
|
klass ? klass.new(resp.data, resp, self) : resp.data
|
147
147
|
when Array
|
148
148
|
if @klass.nil?
|
data/lib/labclient/epics/epic.rb
CHANGED
@@ -51,6 +51,15 @@ module LabClient
|
|
51
51
|
client.resource_labels.epics.show(group_id, id, resource_event_id)
|
52
52
|
end
|
53
53
|
|
54
|
+
# Notes
|
55
|
+
def notes
|
56
|
+
client.notes.epics.list(group_id, iid)
|
57
|
+
end
|
58
|
+
|
59
|
+
def note_create(query)
|
60
|
+
client.notes.epics.create(group_id, iid, query)
|
61
|
+
end
|
62
|
+
|
54
63
|
date_time_attrs %i[created_at closed_at updated_at]
|
55
64
|
|
56
65
|
help do
|
@@ -64,6 +73,10 @@ module LabClient
|
|
64
73
|
option 'issue_remove', 'Remove issue from Epic [Epic Issue ID]'
|
65
74
|
option 'issue_update', 'Update issue association [Epic Issue ID, Hash]'
|
66
75
|
|
76
|
+
# Notes
|
77
|
+
option 'notes', 'List notes/comments. [Hash]'
|
78
|
+
option 'note_create', 'Creates a new note. [Hash]'
|
79
|
+
|
67
80
|
# Resource Labels
|
68
81
|
option 'resource_labels', 'List of all label events'
|
69
82
|
option 'resource_label', 'Show single label event [Resource Event ID]'
|
data/lib/labclient/error.rb
CHANGED
@@ -16,15 +16,18 @@ module LabClient
|
|
16
16
|
result '{:file_path=>"new.md", :branch=>"master"}'
|
17
17
|
|
18
18
|
markdown <<~DOC
|
19
|
-
|
19
|
+
Parameters
|
20
|
+
|
21
|
+
| **Attribute** | **Required** | **Description** |
|
22
|
+
| -------------- | ------------ | ----------------------------------------------- |
|
23
|
+
| branch | yes | Name of the branch |
|
24
|
+
| content | yes | File content |
|
25
|
+
| start_branch | no | Name of the branch to start the new commit from |
|
26
|
+
| encoding | no | Change encoding to ‘base64’. Default is text. |
|
27
|
+
| author_email | no | Specify the commit author’s email address |
|
28
|
+
| author_name | no | Specify the commit author’s name |
|
29
|
+
| commit_message | no | Commit message |
|
20
30
|
|
21
|
-
* branch (required) - Name of the branch
|
22
|
-
* start_branch (optional) - Name of the branch to start the new commit from
|
23
|
-
* encoding (optional) - Change encoding to ‘base64’. Default is text.
|
24
|
-
* author_email (optional) - Specify the commit author’s email address
|
25
|
-
* author_name (optional) - Specify the commit author’s name
|
26
|
-
* content (required) - File content
|
27
|
-
* commit_message (required) - Commit message
|
28
31
|
|
29
32
|
DOC
|
30
33
|
end
|
@@ -43,6 +46,9 @@ module LabClient
|
|
43
46
|
def create(project_id, file_path, query)
|
44
47
|
project_id = format_id(project_id)
|
45
48
|
|
49
|
+
# Path Name Encoding
|
50
|
+
file_path = CGI.escape(file_path)
|
51
|
+
|
46
52
|
client.request(:post, "projects/#{project_id}/repository/files/#{file_path}", nil, query)
|
47
53
|
end
|
48
54
|
end
|
@@ -54,29 +54,17 @@ module LabClient
|
|
54
54
|
end
|
55
55
|
|
56
56
|
doc 'Wizard' do
|
57
|
-
title '
|
57
|
+
title 'Run one templates'
|
58
58
|
desc <<-DOC
|
59
59
|
Outside of the wizard at large, you can also select and manually run specific templates.
|
60
60
|
DOC
|
61
61
|
|
62
62
|
example <<~DOC
|
63
|
-
pages =
|
63
|
+
pages = client.wizard.template(:pages)
|
64
64
|
=> #<LabClient::Template Pages>
|
65
65
|
pages.run! # Run pages template
|
66
66
|
DOC
|
67
67
|
end
|
68
|
-
|
69
|
-
doc 'Pages' do
|
70
|
-
markdown <<~DOC
|
71
|
-
Create GitLab Pages group and test projects. Projects imported from Gitlab's [demo pages projects](https://gitlab.com/pages)
|
72
|
-
|
73
|
-
| Setting | Default | Type | Description |
|
74
|
-
| ---------- | --------- | ------- | -------------------------------------- |
|
75
|
-
| group_name | Generated | String | Parent Group name for pages projects |
|
76
|
-
| group_path | Generated | String | Parent Group path |
|
77
|
-
| count | 5 | Integer | Number of projects to import (max: 28) |
|
78
|
-
DOC
|
79
|
-
end
|
80
68
|
end
|
81
69
|
end
|
82
70
|
end
|
@@ -4,20 +4,34 @@ module LabClient
|
|
4
4
|
module Generator
|
5
5
|
# Name Helper
|
6
6
|
module Names
|
7
|
+
def create_file(content, branch = :master, message = nil)
|
8
|
+
{
|
9
|
+
branch: branch,
|
10
|
+
commit_message: message || gen_description,
|
11
|
+
content: content
|
12
|
+
}
|
13
|
+
end
|
14
|
+
|
7
15
|
def gen_groups
|
8
16
|
[
|
9
17
|
Faker::Games::LeagueOfLegends.location,
|
10
18
|
Faker::Movies::LordOfTheRings.location,
|
11
19
|
Faker::TvShows::RickAndMorty.location,
|
12
20
|
Faker::TvShows::StarTrek.location,
|
13
|
-
Faker::Games::ElderScrolls.region
|
21
|
+
Faker::Games::ElderScrolls.region,
|
22
|
+
Faker::Games::ElderScrolls.city,
|
23
|
+
Faker::Games::Zelda.location,
|
24
|
+
Faker::Games::SuperSmashBros.stage
|
14
25
|
].map { |x| x.gsub(/[^0-9A-Za-z]/, '') }
|
15
26
|
end
|
16
27
|
|
17
28
|
def gen_projects
|
18
29
|
[
|
19
30
|
Faker::Games::ElderScrolls.creature,
|
31
|
+
Faker::Movies::LordOfTheRings.location,
|
20
32
|
Faker::Games::LeagueOfLegends.summoner_spell,
|
33
|
+
Faker::Games::Pokemon.move,
|
34
|
+
Faker::TvShows::RickAndMorty.location,
|
21
35
|
Faker::Games::LeagueOfLegends.masteries,
|
22
36
|
Faker::Superhero.power
|
23
37
|
].map { |x| x.gsub(/[^0-9A-Za-z]/, '') }
|
@@ -45,8 +59,8 @@ module LabClient
|
|
45
59
|
# rubocop:disable Metrics/AbcSize
|
46
60
|
def generate_names
|
47
61
|
@user_names = Array.new(count[:users]) { gen_people }.flatten.uniq.sample(count[:users])
|
48
|
-
@group_names = Array.new(count[:groups]) { gen_groups }.flatten.uniq
|
49
|
-
@project_names = Array.new(
|
62
|
+
@group_names = Array.new(count[:groups]) { gen_groups }.flatten.uniq.sample(count[:groups])
|
63
|
+
@project_names = Array.new(count[:projects]) { gen_projects }.flatten.uniq.sample(count[:projects])
|
50
64
|
end
|
51
65
|
# rubocop:enable Metrics/AbcSize
|
52
66
|
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
module LabClient
|
2
|
+
module Generator
|
3
|
+
# Public Method Helpers
|
4
|
+
module TemplateMethods
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
@group_prefix = 'Environment'
|
8
|
+
|
9
|
+
class_methods do
|
10
|
+
def template_name
|
11
|
+
name.demodulize.underscore.to_sym
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
# Common Helper Class
|
17
|
+
class TemplateHelper
|
18
|
+
include TemplateMethods
|
19
|
+
|
20
|
+
attr_reader :client
|
21
|
+
attr_accessor :opts
|
22
|
+
|
23
|
+
def inspect
|
24
|
+
"#<LabClient::Template #{self.class.to_s.demodulize}>"
|
25
|
+
end
|
26
|
+
|
27
|
+
def initialize(client, opts = {})
|
28
|
+
@client = client
|
29
|
+
self.opts = opts
|
30
|
+
setup
|
31
|
+
end
|
32
|
+
|
33
|
+
def setup
|
34
|
+
# Blank Place Holder
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
# ====================================================
|
39
|
+
# Helper for Common Group/Project Templates
|
40
|
+
# - Create Group, @group
|
41
|
+
# - Execute any `setup_` methods
|
42
|
+
# - Print all @projects, and @group
|
43
|
+
class GroupTemplateHelper < TemplateHelper
|
44
|
+
@group_prefix = 'Environment'
|
45
|
+
include Names
|
46
|
+
attr_accessor :group_name, :group_path, :group_suffix, :project_name
|
47
|
+
|
48
|
+
def run!
|
49
|
+
puts "Running: #{group_suffix}"
|
50
|
+
generate_group
|
51
|
+
|
52
|
+
# Run `setup_` prefixed classes
|
53
|
+
self.class.instance_methods.grep(/setup_/).each { |x| send(x) }
|
54
|
+
|
55
|
+
# Print Created Groups/Project
|
56
|
+
puts "#{@group.name} - #{@group.web_url}"
|
57
|
+
@projects.each do |project|
|
58
|
+
puts " - #{project.name} - #{project.web_url}"
|
59
|
+
end
|
60
|
+
|
61
|
+
{
|
62
|
+
group: @group,
|
63
|
+
projects: @projects
|
64
|
+
}
|
65
|
+
end
|
66
|
+
|
67
|
+
def setup
|
68
|
+
self.group_suffix = self.class.name.demodulize
|
69
|
+
self.group_name = opts[:group_name] || "#{gen_groups.sample} #{group_suffix}"
|
70
|
+
self.group_path = opts[:group_path] || group_name.downcase.gsub(' ', '-')
|
71
|
+
|
72
|
+
@projects = []
|
73
|
+
end
|
74
|
+
|
75
|
+
def generate_group
|
76
|
+
@group = client.groups.create(name: group_name, path: group_path)
|
77
|
+
# puts "#{@group.name} - #{@group.web_url}"
|
78
|
+
raise 'Unable to Create Group' unless @group.success?
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
@@ -0,0 +1,98 @@
|
|
1
|
+
module LabClient
|
2
|
+
module Generator
|
3
|
+
# Docs for the wizard
|
4
|
+
class GeneratorDocs
|
5
|
+
doc 'Templates' do
|
6
|
+
title 'Environments'
|
7
|
+
markdown <<~DOC
|
8
|
+
- On Stop: Create environment on new branch. Stop environment on merge
|
9
|
+
|
10
|
+
| Setting | Default | Type | Description |
|
11
|
+
| ---------- | --------- | ------- | -------------------------------------- |
|
12
|
+
| group_name | Generated | String | Parent Group name for pages projects |
|
13
|
+
| group_path | Generated | String | Parent Group path |
|
14
|
+
DOC
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
# Child and other Trigger Examples
|
19
|
+
# https://docs.gitlab.com/ee/ci/yaml/#trigger
|
20
|
+
class Environments < GroupTemplateHelper
|
21
|
+
def on_stop_yaml
|
22
|
+
<<~YAML
|
23
|
+
image: busybox:latest
|
24
|
+
|
25
|
+
build:
|
26
|
+
stage: build
|
27
|
+
script:
|
28
|
+
- echo "Build on both master and branches"
|
29
|
+
|
30
|
+
branch-review:
|
31
|
+
stage: deploy
|
32
|
+
environment:
|
33
|
+
name: ${CI_COMMIT_REF_NAME}
|
34
|
+
on_stop: review-teardown
|
35
|
+
script:
|
36
|
+
- echo "branch-review"
|
37
|
+
only:
|
38
|
+
- branches
|
39
|
+
except:
|
40
|
+
- master
|
41
|
+
|
42
|
+
review-teardown:
|
43
|
+
stage: deploy
|
44
|
+
when: manual
|
45
|
+
variables:
|
46
|
+
GIT_STRATEGY: none
|
47
|
+
environment:
|
48
|
+
name: ${CI_COMMIT_REF_NAME}
|
49
|
+
action: stop
|
50
|
+
script:
|
51
|
+
- echo "review-teardown"
|
52
|
+
only:
|
53
|
+
- branches
|
54
|
+
except:
|
55
|
+
- master
|
56
|
+
YAML
|
57
|
+
end
|
58
|
+
|
59
|
+
# rubocop:disable Metrics/MethodLength
|
60
|
+
def setup_master_branch_environment_on_stop
|
61
|
+
project = @group.project_create(
|
62
|
+
name: 'On Stop',
|
63
|
+
description: 'Environments created on non-master branches, stopped on merge',
|
64
|
+
auto_devops_enabled: false,
|
65
|
+
only_allow_merge_if_pipeline_succeeds: true
|
66
|
+
)
|
67
|
+
|
68
|
+
# Create Parent
|
69
|
+
project.file_create('README.md', create_file("# #{project.name}"))
|
70
|
+
|
71
|
+
# # Create Branch
|
72
|
+
project.branch_create(branch: :branch, ref: :master)
|
73
|
+
|
74
|
+
# Create Branch Files
|
75
|
+
project.file_create('.gitlab-ci.yml', create_file(on_stop_yaml, :branch))
|
76
|
+
|
77
|
+
# Create Merge Request
|
78
|
+
merge_request = project.merge_request_create(
|
79
|
+
title: 'Merge Test Branch!',
|
80
|
+
source_branch: :branch,
|
81
|
+
target_branch: :master
|
82
|
+
)
|
83
|
+
|
84
|
+
# Wait for Merge
|
85
|
+
merge_request.wait_for_merge_status
|
86
|
+
|
87
|
+
# Merge
|
88
|
+
merge_request.accept(
|
89
|
+
should_remove_source_branch: true,
|
90
|
+
merge_when_pipeline_succeeds: true
|
91
|
+
)
|
92
|
+
|
93
|
+
@projects.push project
|
94
|
+
end
|
95
|
+
# rubocop:enable Metrics/MethodLength
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|