geet 0.27.7 → 0.28.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 (44) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +0 -1
  3. data/README.md +8 -17
  4. data/geet.gemspec +1 -1
  5. data/lib/geet/commandline/configuration.rb +1 -1
  6. data/lib/geet/git/repository.rb +36 -70
  7. data/lib/geet/helpers/services_workflow_helper.rb +1 -1
  8. data/lib/geet/services/add_upstream_repo.rb +1 -1
  9. data/lib/geet/services/close_milestones.rb +1 -1
  10. data/lib/geet/services/comment_pr.rb +1 -1
  11. data/lib/geet/services/create_issue.rb +27 -28
  12. data/lib/geet/services/create_label.rb +2 -2
  13. data/lib/geet/services/create_milestone.rb +2 -2
  14. data/lib/geet/services/create_pr.rb +20 -27
  15. data/lib/geet/services/list_issues.rb +3 -3
  16. data/lib/geet/services/list_labels.rb +1 -1
  17. data/lib/geet/services/list_milestones.rb +7 -7
  18. data/lib/geet/services/list_prs.rb +1 -1
  19. data/lib/geet/services/merge_pr.rb +4 -3
  20. data/lib/geet/services/open_pr.rb +1 -1
  21. data/lib/geet/utils/git_client.rb +0 -11
  22. data/lib/geet/version.rb +1 -1
  23. data/spec/integration/create_label_spec.rb +0 -21
  24. data/spec/integration/create_pr_spec.rb +0 -1
  25. data/spec/integration/list_issues_spec.rb +0 -46
  26. data/spec/integration/list_labels_spec.rb +0 -27
  27. data/spec/integration/list_milestones_spec.rb +0 -27
  28. data/spec/integration/merge_pr_spec.rb +1 -31
  29. data/spec/spec_helper.rb +0 -3
  30. metadata +3 -17
  31. data/lib/geet/github/remote_repository.rb +0 -53
  32. data/lib/geet/gitlab/api_interface.rb +0 -212
  33. data/lib/geet/gitlab/issue.rb +0 -62
  34. data/lib/geet/gitlab/label.rb +0 -66
  35. data/lib/geet/gitlab/milestone.rb +0 -78
  36. data/lib/geet/gitlab/pr.rb +0 -114
  37. data/lib/geet/gitlab/user.rb +0 -52
  38. data/lib/geet/services/abstract_create_issue.rb +0 -21
  39. data/spec/vcr_cassettes/gitlab_com/create_label.yml +0 -64
  40. data/spec/vcr_cassettes/gitlab_com/list_issues.yml +0 -84
  41. data/spec/vcr_cassettes/gitlab_com/list_issues_with_assignee.yml +0 -162
  42. data/spec/vcr_cassettes/gitlab_com/list_labels.yml +0 -80
  43. data/spec/vcr_cassettes/gitlab_com/list_milestones.yml +0 -397
  44. data/spec/vcr_cassettes/gitlab_com/merge_pr.yml +0 -144
@@ -1,62 +0,0 @@
1
- # frozen_string_literal: true
2
- # typed: strict
3
-
4
- module Geet
5
- module Gitlab
6
- class Issue
7
- extend T::Sig
8
-
9
- sig { returns(Integer) }
10
- attr_reader :number
11
-
12
- sig { returns(String) }
13
- attr_reader :title
14
-
15
- sig { returns(String) }
16
- attr_reader :link
17
-
18
- sig {
19
- params(
20
- number: Integer,
21
- title: String,
22
- link: String
23
- ).void
24
- }
25
- def initialize(number, title, link)
26
- @number = number
27
- @title = title
28
- @link = link
29
- end
30
-
31
- # See https://docs.gitlab.com/ee/api/issues.html#list-issues
32
- #
33
- sig {
34
- params(
35
- api_interface: ApiInterface,
36
- assignee: T.nilable(User),
37
- milestone: T.nilable(Milestone)
38
- ).returns(T::Array[Issue])
39
- }
40
- def self.list(api_interface, assignee: nil, milestone: nil)
41
- api_path = "projects/#{api_interface.path_with_namespace(encoded: true)}/issues"
42
-
43
- request_params = {}
44
- request_params[:assignee_id] = assignee.id if assignee
45
- request_params[:milestone] = milestone.title if milestone
46
-
47
- response = T.cast(
48
- api_interface.send_request(api_path, params: request_params, multipage: true),
49
- T::Array[T::Hash[String, T.untyped]]
50
- )
51
-
52
- response.map do |issue_data, result|
53
- number = T.cast(issue_data.fetch("iid"), Integer)
54
- title = T.cast(issue_data.fetch("title"), String)
55
- link = T.cast(issue_data.fetch("web_url"), String)
56
-
57
- new(number, title, link)
58
- end
59
- end
60
- end
61
- end
62
- end
@@ -1,66 +0,0 @@
1
- # frozen_string_literal: true
2
- # typed: strict
3
-
4
- module Geet
5
- module Gitlab
6
- class Label
7
- extend T::Sig
8
-
9
- sig { returns(String) }
10
- attr_reader :name
11
-
12
- sig { returns(String) }
13
- attr_reader :color
14
-
15
- sig {
16
- params(
17
- name: String,
18
- color: String
19
- ).void
20
- }
21
- def initialize(name, color)
22
- @name = name
23
- @color = color
24
- end
25
-
26
- sig {
27
- params(
28
- api_interface: ApiInterface
29
- ).returns(T::Array[Label])
30
- }
31
- def self.list(api_interface)
32
- api_path = "projects/#{api_interface.path_with_namespace(encoded: true)}/labels"
33
- response = T.cast(
34
- api_interface.send_request(api_path, multipage: true),
35
- T::Array[T::Hash[String, T.untyped]]
36
- )
37
-
38
- response.map do |label_entry|
39
- name = T.cast(label_entry.fetch("name"), String)
40
- color = T.cast(label_entry.fetch("color"), String)
41
-
42
- color = color.sub("#", "") # normalize
43
-
44
- new(name, color)
45
- end
46
- end
47
-
48
- # See https://docs.gitlab.com/ee/api/labels.html#create-a-new-label
49
- sig {
50
- params(
51
- name: String,
52
- color: String,
53
- api_interface: ApiInterface
54
- ).returns(Label)
55
- }
56
- def self.create(name, color, api_interface)
57
- api_path = "projects/#{api_interface.path_with_namespace(encoded: true)}/labels"
58
- request_data = {name:, color: "##{color}"}
59
-
60
- api_interface.send_request(api_path, data: request_data)
61
-
62
- new(name, color)
63
- end
64
- end
65
- end
66
- end
@@ -1,78 +0,0 @@
1
- # frozen_string_literal: true
2
- # typed: strict
3
-
4
- require "date"
5
-
6
- module Geet
7
- module Gitlab
8
- class Milestone
9
- extend T::Sig
10
-
11
- sig { returns(Integer) }
12
- attr_reader :number
13
-
14
- sig { returns(String) }
15
- attr_reader :title
16
-
17
- sig { returns(T.nilable(Date)) }
18
- attr_reader :due_on
19
-
20
- sig {
21
- params(
22
- number: Integer,
23
- title: String,
24
- due_on: T.nilable(Date),
25
- api_interface: ApiInterface
26
- ).void
27
- }
28
- def initialize(number, title, due_on, api_interface)
29
- @number = number
30
- @title = title
31
- @due_on = due_on
32
-
33
- @api_interface = api_interface
34
- end
35
-
36
- # See https://docs.gitlab.com/ee/api/milestones.html#list-project-milestones
37
- #
38
- sig {
39
- params(
40
- api_interface: ApiInterface
41
- ).returns(T::Array[Milestone])
42
- }
43
- def self.list(api_interface)
44
- api_path = "projects/#{api_interface.path_with_namespace(encoded: true)}/milestones"
45
-
46
- response = T.cast(
47
- api_interface.send_request(api_path, multipage: true),
48
- T::Array[T::Hash[String, T.untyped]]
49
- )
50
-
51
- response.map do |milestone_data|
52
- number = T.cast(milestone_data.fetch("iid"), Integer)
53
- title = T.cast(milestone_data.fetch("title"), String)
54
- due_on = parse_due_date(
55
- T.cast(milestone_data.fetch("due_date"), T.nilable(String))
56
- )
57
-
58
- new(number, title, due_on, api_interface)
59
- end
60
- end
61
-
62
- class << self
63
- extend T::Sig
64
-
65
- private
66
-
67
- sig {
68
- params(
69
- raw_due_date: T.nilable(String)
70
- ).returns(T.nilable(Date))
71
- }
72
- def parse_due_date(raw_due_date)
73
- Date.parse(raw_due_date) if raw_due_date
74
- end
75
- end
76
- end # Milestone
77
- end # Gitlab
78
- end # Geet
@@ -1,114 +0,0 @@
1
- # frozen_string_literal: true
2
- # typed: strict
3
-
4
- module Geet
5
- module Gitlab
6
- class PR
7
- extend T::Sig
8
-
9
- sig { returns(Integer) }
10
- attr_reader :number
11
-
12
- sig { returns(String) }
13
- attr_reader :title
14
-
15
- sig { returns(String) }
16
- attr_reader :link
17
-
18
- sig {
19
- params(
20
- number: Integer,
21
- api_interface: ApiInterface,
22
- title: String,
23
- link: String
24
- ).void
25
- }
26
- def initialize(number, api_interface, title, link)
27
- @number = number
28
- @api_interface = api_interface
29
- @title = title
30
- @link = link
31
- end
32
-
33
- # See https://docs.gitlab.com/ee/api/merge_requests.html#list-merge-requests
34
- #
35
- sig {
36
- params(
37
- api_interface: ApiInterface,
38
- milestone: T.nilable(Milestone),
39
- assignee: T.nilable(User),
40
- # Required only for API compatibility. it's not required; if passed, it's only checked
41
- # against the API path to make sure it's correct.
42
- owner: T.nilable(String),
43
- head: T.nilable(String)
44
- ).returns(T::Array[PR])
45
- }
46
- def self.list(api_interface, milestone: nil, assignee: nil, owner: nil, head: nil)
47
- api_path = "projects/#{api_interface.path_with_namespace(encoded: true)}/merge_requests"
48
-
49
- check_list_owner!(api_interface, owner) if owner
50
-
51
- request_params = {}
52
- request_params[:assignee_id] = assignee.id if assignee
53
- request_params[:milestone] = milestone.title if milestone
54
- request_params[:source_branch] = head if head
55
-
56
- response = T.cast(
57
- api_interface.send_request(api_path, params: request_params, multipage: true),
58
- T::Array[T::Hash[String, T.untyped]]
59
- )
60
-
61
- response.map do |issue_data, result|
62
- number = T.cast(issue_data.fetch("iid"), Integer)
63
- title = T.cast(issue_data.fetch("title"), String)
64
- link = T.cast(issue_data.fetch("web_url"), String)
65
-
66
- new(number, api_interface, title, link)
67
- end
68
- end
69
-
70
- # See https://docs.gitlab.com/ee/api/notes.html#create-new-merge-request-note
71
- #
72
- sig { params(comment: String).void }
73
- def comment(comment)
74
- api_path = "projects/#{@api_interface.path_with_namespace(encoded: true)}/merge_requests/#{number}/notes"
75
- request_data = {body: comment}
76
-
77
- @api_interface.send_request(api_path, data: request_data)
78
- end
79
-
80
- # See https://docs.gitlab.com/ee/api/merge_requests.html#accept-mr
81
- #
82
- sig {
83
- params(
84
- merge_method: T.nilable(String)
85
- ).void
86
- }
87
- def merge(merge_method: nil)
88
- raise ArgumentError, "GitLab does not support the merge_method parameter" if merge_method
89
-
90
- api_path = "projects/#{@api_interface.path_with_namespace(encoded: true)}/merge_requests/#{number}/merge"
91
-
92
- @api_interface.send_request(api_path, http_method: :put)
93
- end
94
-
95
- class << self
96
- extend T::Sig
97
-
98
- private
99
-
100
- sig {
101
- params(
102
- api_interface: ApiInterface,
103
- owner: String
104
- ).void
105
- }
106
- def check_list_owner!(api_interface, owner)
107
- if !api_interface.path_with_namespace.start_with?("#{owner}/")
108
- raise "Mismatch owner/API path!: #{owner}<>#{api_interface.path_with_namespace}"
109
- end
110
- end
111
- end
112
- end # PR
113
- end # Gitlab
114
- end # Geet
@@ -1,52 +0,0 @@
1
- # frozen_string_literal: true
2
- # typed: strict
3
-
4
- module Geet
5
- module Gitlab
6
- class User
7
- extend T::Sig
8
-
9
- sig { returns(Integer) }
10
- attr_reader :id
11
-
12
- sig { returns(String) }
13
- attr_reader :username
14
-
15
- sig {
16
- params(
17
- id: Integer,
18
- username: String,
19
- api_interface: ApiInterface
20
- ).void
21
- }
22
- def initialize(id, username, api_interface)
23
- @id = id
24
- @username = username
25
- @api_interface = api_interface
26
- end
27
-
28
- # Returns an array of User instances
29
- #
30
- sig {
31
- params(
32
- api_interface: ApiInterface
33
- ).returns(T::Array[User])
34
- }
35
- def self.list_collaborators(api_interface)
36
- api_path = "projects/#{api_interface.path_with_namespace(encoded: true)}/members"
37
-
38
- response = T.cast(
39
- api_interface.send_request(api_path, multipage: true),
40
- T::Array[T::Hash[String, T.untyped]]
41
- )
42
-
43
- response.map do |user_entry|
44
- id = T.cast(user_entry.fetch("id"), Integer)
45
- username = T.cast(user_entry.fetch("username"), String)
46
-
47
- new(id, username, api_interface)
48
- end
49
- end
50
- end # User
51
- end # Gitlab
52
- end # Geet
@@ -1,21 +0,0 @@
1
- # frozen_string_literal: true
2
- # typed: strict
3
-
4
- require "stringio"
5
- require "tmpdir"
6
-
7
- module Geet
8
- module Services
9
- class AbstractCreateIssue
10
- extend T::Sig
11
-
12
- include Geet::Helpers::OsHelper
13
-
14
- sig { params(repository: Git::Repository, out: T.any(IO, StringIO)).void }
15
- def initialize(repository, out: $stdout)
16
- @repository = repository
17
- @out = out
18
- end
19
- end
20
- end
21
- end
@@ -1,64 +0,0 @@
1
- ---
2
- http_interactions:
3
- - request:
4
- method: post
5
- uri: https://gitlab.com/api/v4/projects/donaldduck%2Ftestproject/labels
6
- body:
7
- encoding: US-ASCII
8
- string: name=my_label&color=%23123456
9
- headers:
10
- Accept-Encoding:
11
- - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
12
- Accept:
13
- - "*/*"
14
- User-Agent:
15
- - Ruby
16
- Host:
17
- - gitlab.com
18
- Private-Token:
19
- - "<GITLAB_CREDENTIALS>"
20
- response:
21
- status:
22
- code: 201
23
- message: Created
24
- headers:
25
- Server:
26
- - nginx
27
- Date:
28
- - Tue, 03 Jul 2018 16:44:14 GMT
29
- Content-Type:
30
- - application/json
31
- Content-Length:
32
- - '180'
33
- Cache-Control:
34
- - max-age=0, private, must-revalidate
35
- Etag:
36
- - W/"9ccd74bc7bedefbbc67c4783b163c8fc"
37
- Vary:
38
- - Origin
39
- X-Content-Type-Options:
40
- - nosniff
41
- X-Frame-Options:
42
- - SAMEORIGIN
43
- X-Request-Id:
44
- - fb041fb4-a96d-4230-9eac-514d9db1a9f0
45
- X-Runtime:
46
- - '0.253058'
47
- Strict-Transport-Security:
48
- - max-age=31536000
49
- Ratelimit-Limit:
50
- - '600'
51
- Ratelimit-Observed:
52
- - '2'
53
- Ratelimit-Remaining:
54
- - '598'
55
- Ratelimit-Reset:
56
- - '1530636314'
57
- Ratelimit-Resettime:
58
- - Wed, 03 Jul 2018 16:45:14 GMT
59
- body:
60
- encoding: UTF-8
61
- string: '{"id":123456,"name":"my_label","color":"#123456","description":null,"open_issues_count":0,"closed_issues_count":0,"open_merge_requests_count":0,"priority":null,"subscribed":false}'
62
- http_version:
63
- recorded_at: Tue, 03 Jul 2018 16:44:15 GMT
64
- recorded_with: VCR 3.0.3
@@ -1,84 +0,0 @@
1
- ---
2
- http_interactions:
3
- - request:
4
- method: get
5
- uri: https://gitlab.com/api/v4/projects/donaldduck%2Ftestproject/issues
6
- body:
7
- encoding: US-ASCII
8
- string: ''
9
- headers:
10
- Accept-Encoding:
11
- - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
12
- Accept:
13
- - "*/*"
14
- User-Agent:
15
- - Ruby
16
- Host:
17
- - gitlab.com
18
- Private-Token:
19
- - "<GITLAB_CREDENTIALS>"
20
- response:
21
- status:
22
- code: 200
23
- message: OK
24
- headers:
25
- Server:
26
- - nginx
27
- Date:
28
- - Mon, 27 Nov 2017 20:58:06 GMT
29
- Content-Type:
30
- - application/json
31
- Content-Length:
32
- - '1648'
33
- Cache-Control:
34
- - max-age=0, private, must-revalidate
35
- Etag:
36
- - W/"622f178aa3f7cf68c0314a3faa6c520f"
37
- Link:
38
- - <https://gitlab.com/api/v4/projects/donaldduck%2Ftestproject/issues?id=donaldduck%2Ftestproject&order_by=created_at&page=1&per_page=20&sort=desc&state=all>;
39
- rel="first", <https://gitlab.com/api/v4/projects/donaldduck%2Ftestproject/issues?id=donaldduck%2Ftestproject&order_by=created_at&page=1&per_page=20&sort=desc&state=all>;
40
- rel="last"
41
- Vary:
42
- - Origin
43
- X-Content-Type-Options:
44
- - nosniff
45
- X-Frame-Options:
46
- - SAMEORIGIN
47
- X-Next-Page:
48
- - ''
49
- X-Page:
50
- - '1'
51
- X-Per-Page:
52
- - '20'
53
- X-Prev-Page:
54
- - ''
55
- X-Request-Id:
56
- - 9d46bac0-142f-464f-af89-4cac318e4563
57
- X-Runtime:
58
- - '0.428030'
59
- X-Total:
60
- - '2'
61
- X-Total-Pages:
62
- - '1'
63
- Strict-Transport-Security:
64
- - max-age=31536000
65
- Ratelimit-Limit:
66
- - '600'
67
- Ratelimit-Observed:
68
- - '1'
69
- Ratelimit-Remaining:
70
- - '599'
71
- Ratelimit-Reset:
72
- - '1511816346'
73
- Ratelimit-Resettime:
74
- - Tue, 27 Nov 2017 20:59:06 GMT
75
- body:
76
- encoding: UTF-8
77
- string: '[{"id":123456,"iid":2,"project_id":123456,"title":"I like more pizza","description":"And
78
- you should, too!","state":"opened","created_at":"2017-11-26T20:56:53.870Z","updated_at":"2017-11-27T18:57:07.289Z","closed_at":null,"labels":[],"milestone":null,"assignees":[],"author":{"id":123456,"name":"Donald
79
- Duck","username":"donaldduck","state":"active","avatar_url":"https://secure.gravatar.com/avatar/0123456789abcdef0123456789abcdef?s=80\u0026d=identicon","web_url":"https://gitlab.com/donaldduck"},"assignee":null,"user_notes_count":1,"upvotes":0,"downvotes":0,"due_date":null,"confidential":false,"weight":null,"discussion_locked":null,"web_url":"https://gitlab.com/donaldduck/testproject/issues/2","time_stats":{"time_estimate":0,"total_time_spent":0,"human_time_estimate":null,"human_total_time_spent":null}},{"id":123456,"iid":1,"project_id":123456,"title":"I
80
- like pizza","description":"How about you?","state":"opened","created_at":"2017-11-26T20:56:42.241Z","updated_at":"2017-11-26T20:56:42.241Z","closed_at":null,"labels":[],"milestone":null,"assignees":[],"author":{"id":123456,"name":"Donald
81
- Duck","username":"donaldduck","state":"active","avatar_url":"https://secure.gravatar.com/avatar/0123456789abcdef0123456789abcdef?s=80\u0026d=identicon","web_url":"https://gitlab.com/donaldduck"},"assignee":null,"user_notes_count":0,"upvotes":0,"downvotes":0,"due_date":null,"confidential":false,"weight":null,"discussion_locked":null,"web_url":"https://gitlab.com/donaldduck/testproject/issues/1","time_stats":{"time_estimate":0,"total_time_spent":0,"human_time_estimate":null,"human_total_time_spent":null}}]'
82
- http_version:
83
- recorded_at: Mon, 27 Nov 2017 20:58:06 GMT
84
- recorded_with: VCR 3.0.3