lex-github 0.2.4 → 0.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 (59) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +3 -3
  3. data/.rubocop.yml +2 -53
  4. data/CHANGELOG.md +55 -0
  5. data/CLAUDE.md +45 -19
  6. data/Gemfile +1 -0
  7. data/README.md +155 -83
  8. data/lex-github.gemspec +2 -0
  9. data/lib/legion/extensions/github/app/actor/token_refresh.rb +68 -0
  10. data/lib/legion/extensions/github/app/actor/webhook_poller.rb +65 -0
  11. data/lib/legion/extensions/github/app/hooks/setup.rb +19 -0
  12. data/lib/legion/extensions/github/app/hooks/webhook.rb +19 -0
  13. data/lib/legion/extensions/github/app/runners/auth.rb +48 -0
  14. data/lib/legion/extensions/github/app/runners/credential_store.rb +46 -0
  15. data/lib/legion/extensions/github/app/runners/installations.rb +56 -0
  16. data/lib/legion/extensions/github/app/runners/manifest.rb +65 -0
  17. data/lib/legion/extensions/github/app/runners/webhooks.rb +118 -0
  18. data/lib/legion/extensions/github/app/transport/exchanges/app.rb +17 -0
  19. data/lib/legion/extensions/github/app/transport/messages/event.rb +18 -0
  20. data/lib/legion/extensions/github/app/transport/queues/auth.rb +18 -0
  21. data/lib/legion/extensions/github/app/transport/queues/webhooks.rb +18 -0
  22. data/lib/legion/extensions/github/cli/app.rb +57 -0
  23. data/lib/legion/extensions/github/cli/auth.rb +99 -0
  24. data/lib/legion/extensions/github/client.rb +24 -0
  25. data/lib/legion/extensions/github/errors.rb +44 -0
  26. data/lib/legion/extensions/github/helpers/browser_auth.rb +106 -0
  27. data/lib/legion/extensions/github/helpers/cache.rb +99 -0
  28. data/lib/legion/extensions/github/helpers/callback_server.rb +89 -0
  29. data/lib/legion/extensions/github/helpers/client.rb +292 -2
  30. data/lib/legion/extensions/github/helpers/scope_registry.rb +91 -0
  31. data/lib/legion/extensions/github/helpers/token_cache.rb +86 -0
  32. data/lib/legion/extensions/github/middleware/credential_fallback.rb +76 -0
  33. data/lib/legion/extensions/github/middleware/rate_limit.rb +40 -0
  34. data/lib/legion/extensions/github/middleware/scope_probe.rb +37 -0
  35. data/lib/legion/extensions/github/oauth/actor/token_refresh.rb +76 -0
  36. data/lib/legion/extensions/github/oauth/hooks/callback.rb +19 -0
  37. data/lib/legion/extensions/github/oauth/runners/auth.rb +111 -0
  38. data/lib/legion/extensions/github/oauth/transport/exchanges/oauth.rb +17 -0
  39. data/lib/legion/extensions/github/oauth/transport/queues/auth.rb +18 -0
  40. data/lib/legion/extensions/github/runners/actions.rb +100 -0
  41. data/lib/legion/extensions/github/runners/branches.rb +8 -6
  42. data/lib/legion/extensions/github/runners/checks.rb +84 -0
  43. data/lib/legion/extensions/github/runners/comments.rb +15 -9
  44. data/lib/legion/extensions/github/runners/commits.rb +13 -8
  45. data/lib/legion/extensions/github/runners/contents.rb +6 -4
  46. data/lib/legion/extensions/github/runners/deployments.rb +76 -0
  47. data/lib/legion/extensions/github/runners/gists.rb +11 -6
  48. data/lib/legion/extensions/github/runners/issues.rb +18 -11
  49. data/lib/legion/extensions/github/runners/labels.rb +18 -11
  50. data/lib/legion/extensions/github/runners/organizations.rb +12 -10
  51. data/lib/legion/extensions/github/runners/pull_requests.rb +26 -16
  52. data/lib/legion/extensions/github/runners/releases.rb +89 -0
  53. data/lib/legion/extensions/github/runners/repositories.rb +19 -12
  54. data/lib/legion/extensions/github/runners/repository_webhooks.rb +76 -0
  55. data/lib/legion/extensions/github/runners/search.rb +13 -10
  56. data/lib/legion/extensions/github/runners/users.rb +14 -10
  57. data/lib/legion/extensions/github/version.rb +1 -1
  58. data/lib/legion/extensions/github.rb +23 -1
  59. metadata +63 -1
@@ -0,0 +1,76 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'legion/extensions/github/helpers/client'
4
+
5
+ module Legion
6
+ module Extensions
7
+ module Github
8
+ module Runners
9
+ module Deployments
10
+ include Legion::Extensions::Github::Helpers::Client
11
+
12
+ def list_deployments(owner:, repo:, environment: nil, ref: nil, per_page: 30, page: 1, **)
13
+ params = { environment: environment, ref: ref,
14
+ per_page: per_page, page: page }.compact
15
+ response = connection(owner: owner, repo: repo, **).get(
16
+ "/repos/#{owner}/#{repo}/deployments", params
17
+ )
18
+ { result: response.body }
19
+ end
20
+
21
+ def get_deployment(owner:, repo:, deployment_id:, **)
22
+ response = connection(owner: owner, repo: repo, **).get(
23
+ "/repos/#{owner}/#{repo}/deployments/#{deployment_id}"
24
+ )
25
+ { result: response.body }
26
+ end
27
+
28
+ def create_deployment(owner:, repo:, ref:, environment: 'production',
29
+ description: nil, auto_merge: true, required_contexts: nil, **)
30
+ payload = { ref: ref, environment: environment, description: description,
31
+ auto_merge: auto_merge, required_contexts: required_contexts }.compact
32
+ response = connection(owner: owner, repo: repo, **).post(
33
+ "/repos/#{owner}/#{repo}/deployments", payload
34
+ )
35
+ { result: response.body }
36
+ end
37
+
38
+ def delete_deployment(owner:, repo:, deployment_id:, **)
39
+ response = connection(owner: owner, repo: repo, **).delete(
40
+ "/repos/#{owner}/#{repo}/deployments/#{deployment_id}"
41
+ )
42
+ { result: response.status == 204 }
43
+ end
44
+
45
+ def list_deployment_statuses(owner:, repo:, deployment_id:, per_page: 30, page: 1, **)
46
+ params = { per_page: per_page, page: page }
47
+ response = connection(owner: owner, repo: repo, **).get(
48
+ "/repos/#{owner}/#{repo}/deployments/#{deployment_id}/statuses", params
49
+ )
50
+ { result: response.body }
51
+ end
52
+
53
+ def create_deployment_status(owner:, repo:, deployment_id:, state:,
54
+ description: nil, environment_url: nil, log_url: nil, **)
55
+ payload = { state: state, description: description,
56
+ environment_url: environment_url, log_url: log_url }.compact
57
+ response = connection(owner: owner, repo: repo, **).post(
58
+ "/repos/#{owner}/#{repo}/deployments/#{deployment_id}/statuses", payload
59
+ )
60
+ { result: response.body }
61
+ end
62
+
63
+ def get_deployment_status(owner:, repo:, deployment_id:, status_id:, **)
64
+ response = connection(owner: owner, repo: repo, **).get(
65
+ "/repos/#{owner}/#{repo}/deployments/#{deployment_id}/statuses/#{status_id}"
66
+ )
67
+ { result: response.body }
68
+ end
69
+
70
+ include Legion::Extensions::Helpers::Lex if Legion::Extensions.const_defined?(:Helpers, false) &&
71
+ Legion::Extensions::Helpers.const_defined?(:Lex, false)
72
+ end
73
+ end
74
+ end
75
+ end
76
+ end
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'legion/extensions/github/helpers/client'
4
+ require 'legion/extensions/github/helpers/cache'
4
5
 
5
6
  module Legion
6
7
  module Extensions
@@ -8,36 +9,40 @@ module Legion
8
9
  module Runners
9
10
  module Gists
10
11
  include Legion::Extensions::Github::Helpers::Client
12
+ include Legion::Extensions::Github::Helpers::Cache
11
13
 
12
14
  def list_gists(per_page: 30, page: 1, **)
13
- response = connection(**).get('/gists', per_page: per_page, page: page)
14
- { result: response.body }
15
+ cred = resolve_credential
16
+ fp = cred&.dig(:metadata, :credential_fingerprint) || 'anonymous'
17
+ { result: cached_get("github:user:gists:#{fp}:#{page}:#{per_page}") { connection(**).get('/gists', per_page: per_page, page: page).body } }
15
18
  end
16
19
 
17
20
  def get_gist(gist_id:, **)
18
- response = connection(**).get("/gists/#{gist_id}")
19
- { result: response.body }
21
+ { result: cached_get("github:gist:#{gist_id}") { connection(**).get("/gists/#{gist_id}").body } }
20
22
  end
21
23
 
22
24
  def create_gist(files:, description: nil, public: false, **)
23
25
  payload = { files: files, description: description, public: public }
24
26
  response = connection(**).post('/gists', payload)
27
+ cache_write("github:gist:#{response.body['id']}", response.body) if response.body['id']
25
28
  { result: response.body }
26
29
  end
27
30
 
28
31
  def update_gist(gist_id:, files: nil, description: nil, **)
29
32
  payload = { files: files, description: description }.compact
30
33
  response = connection(**).patch("/gists/#{gist_id}", payload)
34
+ cache_write("github:gist:#{gist_id}", response.body) if response.body['id']
31
35
  { result: response.body }
32
36
  end
33
37
 
34
38
  def delete_gist(gist_id:, **)
35
39
  response = connection(**).delete("/gists/#{gist_id}")
40
+ cache_invalidate("github:gist:#{gist_id}") if response.status == 204
36
41
  { result: response.status == 204 }
37
42
  end
38
43
 
39
- include Legion::Extensions::Helpers::Lex if Legion::Extensions.const_defined?(:Helpers) &&
40
- Legion::Extensions::Helpers.const_defined?(:Lex)
44
+ include Legion::Extensions::Helpers::Lex if Legion::Extensions.const_defined?(:Helpers, false) &&
45
+ Legion::Extensions::Helpers.const_defined?(:Lex, false)
41
46
  end
42
47
  end
43
48
  end
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'legion/extensions/github/helpers/client'
4
+ require 'legion/extensions/github/helpers/cache'
4
5
 
5
6
  module Legion
6
7
  module Extensions
@@ -8,43 +9,49 @@ module Legion
8
9
  module Runners
9
10
  module Issues
10
11
  include Legion::Extensions::Github::Helpers::Client
12
+ include Legion::Extensions::Github::Helpers::Cache
11
13
 
12
14
  def list_issues(owner:, repo:, state: 'open', per_page: 30, page: 1, **)
13
15
  params = { state: state, per_page: per_page, page: page }
14
- response = connection(**).get("/repos/#{owner}/#{repo}/issues", params)
15
- { result: response.body }
16
+ { result: cached_get("github:repo:#{owner}/#{repo}:issues:#{state}:#{page}:#{per_page}") do
17
+ connection(owner: owner, repo: repo, **).get("/repos/#{owner}/#{repo}/issues", params).body
18
+ end }
16
19
  end
17
20
 
18
21
  def get_issue(owner:, repo:, issue_number:, **)
19
- response = connection(**).get("/repos/#{owner}/#{repo}/issues/#{issue_number}")
20
- { result: response.body }
22
+ { result: cached_get("github:repo:#{owner}/#{repo}:issues:#{issue_number}") do
23
+ connection(owner: owner, repo: repo, **).get("/repos/#{owner}/#{repo}/issues/#{issue_number}").body
24
+ end }
21
25
  end
22
26
 
23
27
  def create_issue(owner:, repo:, title:, body: nil, labels: [], assignees: [], **)
24
28
  payload = { title: title, body: body, labels: labels, assignees: assignees }
25
- response = connection(**).post("/repos/#{owner}/#{repo}/issues", payload)
29
+ response = connection(owner: owner, repo: repo, **).post("/repos/#{owner}/#{repo}/issues", payload)
30
+ cache_write("github:repo:#{owner}/#{repo}:issues:#{response.body['number']}", response.body) if response.body['id']
26
31
  { result: response.body }
27
32
  end
28
33
 
29
34
  def update_issue(owner:, repo:, issue_number:, **opts)
30
35
  payload = opts.slice(:title, :body, :state, :labels, :assignees)
31
- response = connection(**opts).patch("/repos/#{owner}/#{repo}/issues/#{issue_number}", payload)
36
+ response = connection(owner: owner, repo: repo, **opts).patch("/repos/#{owner}/#{repo}/issues/#{issue_number}", payload)
37
+ cache_write("github:repo:#{owner}/#{repo}:issues:#{issue_number}", response.body) if response.body['id']
32
38
  { result: response.body }
33
39
  end
34
40
 
35
41
  def list_issue_comments(owner:, repo:, issue_number:, per_page: 30, page: 1, **)
36
42
  params = { per_page: per_page, page: page }
37
- response = connection(**).get("/repos/#{owner}/#{repo}/issues/#{issue_number}/comments", params)
38
- { result: response.body }
43
+ { result: cached_get("github:repo:#{owner}/#{repo}:issues:#{issue_number}:comments:#{page}:#{per_page}") do
44
+ connection(owner: owner, repo: repo, **).get("/repos/#{owner}/#{repo}/issues/#{issue_number}/comments", params).body
45
+ end }
39
46
  end
40
47
 
41
48
  def create_issue_comment(owner:, repo:, issue_number:, body:, **)
42
- response = connection(**).post("/repos/#{owner}/#{repo}/issues/#{issue_number}/comments", { body: body })
49
+ response = connection(owner: owner, repo: repo, **).post("/repos/#{owner}/#{repo}/issues/#{issue_number}/comments", { body: body })
43
50
  { result: response.body }
44
51
  end
45
52
 
46
- include Legion::Extensions::Helpers::Lex if Legion::Extensions.const_defined?(:Helpers) &&
47
- Legion::Extensions::Helpers.const_defined?(:Lex)
53
+ include Legion::Extensions::Helpers::Lex if Legion::Extensions.const_defined?(:Helpers, false) &&
54
+ Legion::Extensions::Helpers.const_defined?(:Lex, false)
48
55
  end
49
56
  end
50
57
  end
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'legion/extensions/github/helpers/client'
4
+ require 'legion/extensions/github/helpers/cache'
4
5
 
5
6
  module Legion
6
7
  module Extensions
@@ -8,47 +9,53 @@ module Legion
8
9
  module Runners
9
10
  module Labels
10
11
  include Legion::Extensions::Github::Helpers::Client
12
+ include Legion::Extensions::Github::Helpers::Cache
11
13
 
12
14
  def list_labels(owner:, repo:, per_page: 30, page: 1, **)
13
15
  params = { per_page: per_page, page: page }
14
- response = connection(**).get("/repos/#{owner}/#{repo}/labels", params)
15
- { result: response.body }
16
+ { result: cached_get("github:repo:#{owner}/#{repo}:labels:#{page}:#{per_page}") do
17
+ connection(owner: owner, repo: repo, **).get("/repos/#{owner}/#{repo}/labels", params).body
18
+ end }
16
19
  end
17
20
 
18
21
  def get_label(owner:, repo:, name:, **)
19
- response = connection(**).get("/repos/#{owner}/#{repo}/labels/#{name}")
20
- { result: response.body }
22
+ { result: cached_get("github:repo:#{owner}/#{repo}:labels:#{name}") do
23
+ connection(owner: owner, repo: repo, **).get("/repos/#{owner}/#{repo}/labels/#{name}").body
24
+ end }
21
25
  end
22
26
 
23
27
  def create_label(owner:, repo:, name:, color:, description: nil, **)
24
28
  payload = { name: name, color: color, description: description }.compact
25
- response = connection(**).post("/repos/#{owner}/#{repo}/labels", payload)
29
+ response = connection(owner: owner, repo: repo, **).post("/repos/#{owner}/#{repo}/labels", payload)
30
+ cache_write("github:repo:#{owner}/#{repo}:labels:#{name}", response.body) if response.body['id']
26
31
  { result: response.body }
27
32
  end
28
33
 
29
34
  def update_label(owner:, repo:, name:, new_name: nil, color: nil, description: nil, **)
30
35
  payload = { new_name: new_name, color: color, description: description }.compact
31
- response = connection(**).patch("/repos/#{owner}/#{repo}/labels/#{name}", payload)
36
+ response = connection(owner: owner, repo: repo, **).patch("/repos/#{owner}/#{repo}/labels/#{name}", payload)
37
+ cache_write("github:repo:#{owner}/#{repo}:labels:#{name}", response.body) if response.body['id']
32
38
  { result: response.body }
33
39
  end
34
40
 
35
41
  def delete_label(owner:, repo:, name:, **)
36
- response = connection(**).delete("/repos/#{owner}/#{repo}/labels/#{name}")
42
+ response = connection(owner: owner, repo: repo, **).delete("/repos/#{owner}/#{repo}/labels/#{name}")
43
+ cache_invalidate("github:repo:#{owner}/#{repo}:labels:#{name}") if response.status == 204
37
44
  { result: response.status == 204 }
38
45
  end
39
46
 
40
47
  def add_labels_to_issue(owner:, repo:, issue_number:, labels:, **)
41
- response = connection(**).post("/repos/#{owner}/#{repo}/issues/#{issue_number}/labels", { labels: labels })
48
+ response = connection(owner: owner, repo: repo, **).post("/repos/#{owner}/#{repo}/issues/#{issue_number}/labels", { labels: labels })
42
49
  { result: response.body }
43
50
  end
44
51
 
45
52
  def remove_label_from_issue(owner:, repo:, issue_number:, name:, **)
46
- response = connection(**).delete("/repos/#{owner}/#{repo}/issues/#{issue_number}/labels/#{name}")
53
+ response = connection(owner: owner, repo: repo, **).delete("/repos/#{owner}/#{repo}/issues/#{issue_number}/labels/#{name}")
47
54
  { result: response.status == 204 }
48
55
  end
49
56
 
50
- include Legion::Extensions::Helpers::Lex if Legion::Extensions.const_defined?(:Helpers) &&
51
- Legion::Extensions::Helpers.const_defined?(:Lex)
57
+ include Legion::Extensions::Helpers::Lex if Legion::Extensions.const_defined?(:Helpers, false) &&
58
+ Legion::Extensions::Helpers.const_defined?(:Lex, false)
52
59
  end
53
60
  end
54
61
  end
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'legion/extensions/github/helpers/client'
4
+ require 'legion/extensions/github/helpers/cache'
4
5
 
5
6
  module Legion
6
7
  module Extensions
@@ -8,30 +9,31 @@ module Legion
8
9
  module Runners
9
10
  module Organizations
10
11
  include Legion::Extensions::Github::Helpers::Client
12
+ include Legion::Extensions::Github::Helpers::Cache
11
13
 
12
14
  def list_user_orgs(username:, per_page: 30, page: 1, **)
13
- response = connection(**).get("/users/#{username}/orgs", per_page: per_page, page: page)
14
- { result: response.body }
15
+ { result: cached_get("github:user:#{username}:orgs:#{page}:#{per_page}") do
16
+ connection(**).get("/users/#{username}/orgs", per_page: per_page, page: page).body
17
+ end }
15
18
  end
16
19
 
17
20
  def get_org(org:, **)
18
- response = connection(**).get("/orgs/#{org}")
19
- { result: response.body }
21
+ { result: cached_get("github:org:#{org}") { connection(owner: org, **).get("/orgs/#{org}").body } }
20
22
  end
21
23
 
22
24
  def list_org_repos(org:, type: 'all', per_page: 30, page: 1, **)
23
25
  params = { type: type, per_page: per_page, page: page }
24
- response = connection(**).get("/orgs/#{org}/repos", params)
25
- { result: response.body }
26
+ { result: cached_get("github:org:#{org}:repos:#{type}:#{page}:#{per_page}") { connection(owner: org, **).get("/orgs/#{org}/repos", params).body } }
26
27
  end
27
28
 
28
29
  def list_org_members(org:, per_page: 30, page: 1, **)
29
- response = connection(**).get("/orgs/#{org}/members", per_page: per_page, page: page)
30
- { result: response.body }
30
+ { result: cached_get("github:org:#{org}:members:#{page}:#{per_page}") do
31
+ connection(owner: org, **).get("/orgs/#{org}/members", per_page: per_page, page: page).body
32
+ end }
31
33
  end
32
34
 
33
- include Legion::Extensions::Helpers::Lex if Legion::Extensions.const_defined?(:Helpers) &&
34
- Legion::Extensions::Helpers.const_defined?(:Lex)
35
+ include Legion::Extensions::Helpers::Lex if Legion::Extensions.const_defined?(:Helpers, false) &&
36
+ Legion::Extensions::Helpers.const_defined?(:Lex, false)
35
37
  end
36
38
  end
37
39
  end
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'legion/extensions/github/helpers/client'
4
+ require 'legion/extensions/github/helpers/cache'
4
5
 
5
6
  module Legion
6
7
  module Extensions
@@ -8,62 +9,71 @@ module Legion
8
9
  module Runners
9
10
  module PullRequests
10
11
  include Legion::Extensions::Github::Helpers::Client
12
+ include Legion::Extensions::Github::Helpers::Cache
11
13
 
12
14
  def list_pull_requests(owner:, repo:, state: 'open', per_page: 30, page: 1, **)
13
15
  params = { state: state, per_page: per_page, page: page }
14
- response = connection(**).get("/repos/#{owner}/#{repo}/pulls", params)
15
- { result: response.body }
16
+ { result: cached_get("github:repo:#{owner}/#{repo}:pulls:#{state}:#{page}:#{per_page}") do
17
+ connection(owner: owner, repo: repo, **).get("/repos/#{owner}/#{repo}/pulls", params).body
18
+ end }
16
19
  end
17
20
 
18
21
  def get_pull_request(owner:, repo:, pull_number:, **)
19
- response = connection(**).get("/repos/#{owner}/#{repo}/pulls/#{pull_number}")
20
- { result: response.body }
22
+ { result: cached_get("github:repo:#{owner}/#{repo}:pulls:#{pull_number}") do
23
+ connection(owner: owner, repo: repo, **).get("/repos/#{owner}/#{repo}/pulls/#{pull_number}").body
24
+ end }
21
25
  end
22
26
 
23
27
  def create_pull_request(owner:, repo:, title:, head:, base:, body: nil, draft: false, **)
24
28
  payload = { title: title, head: head, base: base, body: body, draft: draft }
25
- response = connection(**).post("/repos/#{owner}/#{repo}/pulls", payload)
29
+ response = connection(owner: owner, repo: repo, **).post("/repos/#{owner}/#{repo}/pulls", payload)
30
+ cache_write("github:repo:#{owner}/#{repo}:pulls:#{response.body['number']}", response.body) if response.body['id']
26
31
  { result: response.body }
27
32
  end
28
33
 
29
34
  def update_pull_request(owner:, repo:, pull_number:, **opts)
30
35
  payload = opts.slice(:title, :body, :state, :base)
31
- response = connection(**opts).patch("/repos/#{owner}/#{repo}/pulls/#{pull_number}", payload)
36
+ response = connection(owner: owner, repo: repo, **opts).patch("/repos/#{owner}/#{repo}/pulls/#{pull_number}", payload)
37
+ cache_write("github:repo:#{owner}/#{repo}:pulls:#{pull_number}", response.body) if response.body['id']
32
38
  { result: response.body }
33
39
  end
34
40
 
35
41
  def merge_pull_request(owner:, repo:, pull_number:, commit_title: nil, merge_method: 'merge', **)
36
42
  payload = { commit_title: commit_title, merge_method: merge_method }.compact
37
- response = connection(**).put("/repos/#{owner}/#{repo}/pulls/#{pull_number}/merge", payload)
43
+ response = connection(owner: owner, repo: repo, **).put("/repos/#{owner}/#{repo}/pulls/#{pull_number}/merge", payload)
44
+ cache_invalidate("github:repo:#{owner}/#{repo}:pulls:#{pull_number}")
38
45
  { result: response.body }
39
46
  end
40
47
 
41
48
  def list_pull_request_commits(owner:, repo:, pull_number:, per_page: 30, page: 1, **)
42
49
  params = { per_page: per_page, page: page }
43
- response = connection(**).get("/repos/#{owner}/#{repo}/pulls/#{pull_number}/commits", params)
44
- { result: response.body }
50
+ { result: cached_get("github:repo:#{owner}/#{repo}:pulls:#{pull_number}:commits:#{page}:#{per_page}") do
51
+ connection(owner: owner, repo: repo, **).get("/repos/#{owner}/#{repo}/pulls/#{pull_number}/commits", params).body
52
+ end }
45
53
  end
46
54
 
47
55
  def list_pull_request_files(owner:, repo:, pull_number:, per_page: 30, page: 1, **)
48
56
  params = { per_page: per_page, page: page }
49
- response = connection(**).get("/repos/#{owner}/#{repo}/pulls/#{pull_number}/files", params)
50
- { result: response.body }
57
+ { result: cached_get("github:repo:#{owner}/#{repo}:pulls:#{pull_number}:files:#{page}:#{per_page}") do
58
+ connection(owner: owner, repo: repo, **).get("/repos/#{owner}/#{repo}/pulls/#{pull_number}/files", params).body
59
+ end }
51
60
  end
52
61
 
53
62
  def list_pull_request_reviews(owner:, repo:, pull_number:, per_page: 30, page: 1, **)
54
63
  params = { per_page: per_page, page: page }
55
- response = connection(**).get("/repos/#{owner}/#{repo}/pulls/#{pull_number}/reviews", params)
56
- { result: response.body }
64
+ { result: cached_get("github:repo:#{owner}/#{repo}:pulls:#{pull_number}:reviews:#{page}:#{per_page}") do
65
+ connection(owner: owner, repo: repo, **).get("/repos/#{owner}/#{repo}/pulls/#{pull_number}/reviews", params).body
66
+ end }
57
67
  end
58
68
 
59
69
  def create_review(owner:, repo:, pull_number:, body:, comments: [], event: 'COMMENT', **)
60
70
  payload = { event: event, body: body, comments: comments }
61
- response = connection(**).post("/repos/#{owner}/#{repo}/pulls/#{pull_number}/reviews", payload)
71
+ response = connection(owner: owner, repo: repo, **).post("/repos/#{owner}/#{repo}/pulls/#{pull_number}/reviews", payload)
62
72
  { result: response.body }
63
73
  end
64
74
 
65
- include Legion::Extensions::Helpers::Lex if Legion::Extensions.const_defined?(:Helpers) &&
66
- Legion::Extensions::Helpers.const_defined?(:Lex)
75
+ include Legion::Extensions::Helpers::Lex if Legion::Extensions.const_defined?(:Helpers, false) &&
76
+ Legion::Extensions::Helpers.const_defined?(:Lex, false)
67
77
  end
68
78
  end
69
79
  end
@@ -0,0 +1,89 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'legion/extensions/github/helpers/client'
4
+
5
+ module Legion
6
+ module Extensions
7
+ module Github
8
+ module Runners
9
+ module Releases
10
+ include Legion::Extensions::Github::Helpers::Client
11
+
12
+ def list_releases(owner:, repo:, per_page: 30, page: 1, **)
13
+ response = connection(owner: owner, repo: repo, **).get(
14
+ "/repos/#{owner}/#{repo}/releases", per_page: per_page, page: page
15
+ )
16
+ { result: response.body }
17
+ end
18
+
19
+ def get_release(owner:, repo:, release_id:, **)
20
+ response = connection(owner: owner, repo: repo, **).get(
21
+ "/repos/#{owner}/#{repo}/releases/#{release_id}"
22
+ )
23
+ { result: response.body }
24
+ end
25
+
26
+ def get_latest_release(owner:, repo:, **)
27
+ response = connection(owner: owner, repo: repo, **).get(
28
+ "/repos/#{owner}/#{repo}/releases/latest"
29
+ )
30
+ { result: response.body }
31
+ end
32
+
33
+ def get_release_by_tag(owner:, repo:, tag:, **)
34
+ response = connection(owner: owner, repo: repo, **).get(
35
+ "/repos/#{owner}/#{repo}/releases/tags/#{tag}"
36
+ )
37
+ { result: response.body }
38
+ end
39
+
40
+ def create_release(owner:, repo:, tag_name:, name: nil, body: nil, # rubocop:disable Metrics/ParameterLists
41
+ target_commitish: nil, draft: false, prerelease: false,
42
+ generate_release_notes: false, **)
43
+ payload = { tag_name: tag_name, name: name, body: body,
44
+ target_commitish: target_commitish, draft: draft,
45
+ prerelease: prerelease,
46
+ generate_release_notes: generate_release_notes }.compact
47
+ response = connection(owner: owner, repo: repo, **).post(
48
+ "/repos/#{owner}/#{repo}/releases", payload
49
+ )
50
+ { result: response.body }
51
+ end
52
+
53
+ def update_release(owner:, repo:, release_id:, **opts)
54
+ payload = opts.slice(:tag_name, :name, :body, :draft, :prerelease, :target_commitish)
55
+ response = connection(owner: owner, repo: repo, **opts).patch(
56
+ "/repos/#{owner}/#{repo}/releases/#{release_id}", payload
57
+ )
58
+ { result: response.body }
59
+ end
60
+
61
+ def delete_release(owner:, repo:, release_id:, **)
62
+ response = connection(owner: owner, repo: repo, **).delete(
63
+ "/repos/#{owner}/#{repo}/releases/#{release_id}"
64
+ )
65
+ { result: response.status == 204 }
66
+ end
67
+
68
+ def list_release_assets(owner:, repo:, release_id:, per_page: 30, page: 1, **)
69
+ response = connection(owner: owner, repo: repo, **).get(
70
+ "/repos/#{owner}/#{repo}/releases/#{release_id}/assets",
71
+ per_page: per_page, page: page
72
+ )
73
+ { result: response.body }
74
+ end
75
+
76
+ def delete_release_asset(owner:, repo:, asset_id:, **)
77
+ response = connection(owner: owner, repo: repo, **).delete(
78
+ "/repos/#{owner}/#{repo}/releases/assets/#{asset_id}"
79
+ )
80
+ { result: response.status == 204 }
81
+ end
82
+
83
+ include Legion::Extensions::Helpers::Lex if Legion::Extensions.const_defined?(:Helpers, false) &&
84
+ Legion::Extensions::Helpers.const_defined?(:Lex, false)
85
+ end
86
+ end
87
+ end
88
+ end
89
+ end
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'legion/extensions/github/helpers/client'
4
+ require 'legion/extensions/github/helpers/cache'
4
5
 
5
6
  module Legion
6
7
  module Extensions
@@ -8,46 +9,52 @@ module Legion
8
9
  module Runners
9
10
  module Repositories
10
11
  include Legion::Extensions::Github::Helpers::Client
12
+ include Legion::Extensions::Github::Helpers::Cache
11
13
 
12
14
  def list_repos(username:, per_page: 30, page: 1, **)
13
- response = connection(**).get("/users/#{username}/repos", per_page: per_page, page: page)
14
- { result: response.body }
15
+ { result: cached_get("github:user:#{username}:repos:#{page}:#{per_page}") do
16
+ connection(**).get("/users/#{username}/repos", per_page: per_page, page: page).body
17
+ end }
15
18
  end
16
19
 
17
20
  def get_repo(owner:, repo:, **)
18
- response = connection(**).get("/repos/#{owner}/#{repo}")
19
- { result: response.body }
21
+ { result: cached_get("github:repo:#{owner}/#{repo}") { connection(owner: owner, repo: repo, **).get("/repos/#{owner}/#{repo}").body } }
20
22
  end
21
23
 
22
24
  def create_repo(name:, description: nil, private: false, **)
23
25
  body = { name: name, description: description, private: private }
24
26
  response = connection(**).post('/user/repos', body)
27
+ cache_write("github:repo:#{response.body['full_name']}", response.body) if response.body['id']
25
28
  { result: response.body }
26
29
  end
27
30
 
28
31
  def update_repo(owner:, repo:, **opts)
29
32
  body = opts.slice(:name, :description, :homepage, :private, :default_branch)
30
- response = connection(**opts).patch("/repos/#{owner}/#{repo}", body)
33
+ response = connection(owner: owner, repo: repo, **opts).patch("/repos/#{owner}/#{repo}", body)
34
+ cache_write("github:repo:#{owner}/#{repo}", response.body) if response.body['id']
31
35
  { result: response.body }
32
36
  end
33
37
 
34
38
  def delete_repo(owner:, repo:, **)
35
- response = connection(**).delete("/repos/#{owner}/#{repo}")
39
+ response = connection(owner: owner, repo: repo, **).delete("/repos/#{owner}/#{repo}")
40
+ cache_invalidate("github:repo:#{owner}/#{repo}") if response.status == 204
36
41
  { result: response.status == 204 }
37
42
  end
38
43
 
39
44
  def list_branches(owner:, repo:, per_page: 30, page: 1, **)
40
- response = connection(**).get("/repos/#{owner}/#{repo}/branches", per_page: per_page, page: page)
41
- { result: response.body }
45
+ { result: cached_get("github:repo:#{owner}/#{repo}:branches:#{page}:#{per_page}") do
46
+ connection(owner: owner, repo: repo, **).get("/repos/#{owner}/#{repo}/branches", per_page: per_page, page: page).body
47
+ end }
42
48
  end
43
49
 
44
50
  def list_tags(owner:, repo:, per_page: 30, page: 1, **)
45
- response = connection(**).get("/repos/#{owner}/#{repo}/tags", per_page: per_page, page: page)
46
- { result: response.body }
51
+ { result: cached_get("github:repo:#{owner}/#{repo}:tags:#{page}:#{per_page}") do
52
+ connection(owner: owner, repo: repo, **).get("/repos/#{owner}/#{repo}/tags", per_page: per_page, page: page).body
53
+ end }
47
54
  end
48
55
 
49
- include Legion::Extensions::Helpers::Lex if Legion::Extensions.const_defined?(:Helpers) &&
50
- Legion::Extensions::Helpers.const_defined?(:Lex)
56
+ include Legion::Extensions::Helpers::Lex if Legion::Extensions.const_defined?(:Helpers, false) &&
57
+ Legion::Extensions::Helpers.const_defined?(:Lex, false)
51
58
  end
52
59
  end
53
60
  end