lex-github 0.2.5 → 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 (56) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +50 -0
  3. data/CLAUDE.md +45 -19
  4. data/README.md +155 -83
  5. data/lex-github.gemspec +2 -0
  6. data/lib/legion/extensions/github/app/actor/token_refresh.rb +68 -0
  7. data/lib/legion/extensions/github/app/actor/webhook_poller.rb +65 -0
  8. data/lib/legion/extensions/github/app/hooks/setup.rb +19 -0
  9. data/lib/legion/extensions/github/app/hooks/webhook.rb +19 -0
  10. data/lib/legion/extensions/github/app/runners/auth.rb +48 -0
  11. data/lib/legion/extensions/github/app/runners/credential_store.rb +46 -0
  12. data/lib/legion/extensions/github/app/runners/installations.rb +56 -0
  13. data/lib/legion/extensions/github/app/runners/manifest.rb +65 -0
  14. data/lib/legion/extensions/github/app/runners/webhooks.rb +118 -0
  15. data/lib/legion/extensions/github/app/transport/exchanges/app.rb +17 -0
  16. data/lib/legion/extensions/github/app/transport/messages/event.rb +18 -0
  17. data/lib/legion/extensions/github/app/transport/queues/auth.rb +18 -0
  18. data/lib/legion/extensions/github/app/transport/queues/webhooks.rb +18 -0
  19. data/lib/legion/extensions/github/cli/app.rb +57 -0
  20. data/lib/legion/extensions/github/cli/auth.rb +99 -0
  21. data/lib/legion/extensions/github/client.rb +24 -0
  22. data/lib/legion/extensions/github/errors.rb +44 -0
  23. data/lib/legion/extensions/github/helpers/browser_auth.rb +106 -0
  24. data/lib/legion/extensions/github/helpers/cache.rb +99 -0
  25. data/lib/legion/extensions/github/helpers/callback_server.rb +89 -0
  26. data/lib/legion/extensions/github/helpers/client.rb +292 -2
  27. data/lib/legion/extensions/github/helpers/scope_registry.rb +91 -0
  28. data/lib/legion/extensions/github/helpers/token_cache.rb +86 -0
  29. data/lib/legion/extensions/github/middleware/credential_fallback.rb +76 -0
  30. data/lib/legion/extensions/github/middleware/rate_limit.rb +40 -0
  31. data/lib/legion/extensions/github/middleware/scope_probe.rb +37 -0
  32. data/lib/legion/extensions/github/oauth/actor/token_refresh.rb +76 -0
  33. data/lib/legion/extensions/github/oauth/hooks/callback.rb +19 -0
  34. data/lib/legion/extensions/github/oauth/runners/auth.rb +111 -0
  35. data/lib/legion/extensions/github/oauth/transport/exchanges/oauth.rb +17 -0
  36. data/lib/legion/extensions/github/oauth/transport/queues/auth.rb +18 -0
  37. data/lib/legion/extensions/github/runners/actions.rb +100 -0
  38. data/lib/legion/extensions/github/runners/branches.rb +5 -3
  39. data/lib/legion/extensions/github/runners/checks.rb +84 -0
  40. data/lib/legion/extensions/github/runners/comments.rb +13 -7
  41. data/lib/legion/extensions/github/runners/commits.rb +11 -6
  42. data/lib/legion/extensions/github/runners/contents.rb +3 -1
  43. data/lib/legion/extensions/github/runners/deployments.rb +76 -0
  44. data/lib/legion/extensions/github/runners/gists.rb +9 -4
  45. data/lib/legion/extensions/github/runners/issues.rb +16 -9
  46. data/lib/legion/extensions/github/runners/labels.rb +16 -9
  47. data/lib/legion/extensions/github/runners/organizations.rb +10 -8
  48. data/lib/legion/extensions/github/runners/pull_requests.rb +24 -14
  49. data/lib/legion/extensions/github/runners/releases.rb +89 -0
  50. data/lib/legion/extensions/github/runners/repositories.rb +17 -10
  51. data/lib/legion/extensions/github/runners/repository_webhooks.rb +76 -0
  52. data/lib/legion/extensions/github/runners/search.rb +11 -8
  53. data/lib/legion/extensions/github/runners/users.rb +12 -8
  54. data/lib/legion/extensions/github/version.rb +1 -1
  55. data/lib/legion/extensions/github.rb +22 -0
  56. metadata +63 -1
@@ -0,0 +1,84 @@
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 Checks
10
+ include Legion::Extensions::Github::Helpers::Client
11
+
12
+ def create_check_run(owner:, repo:, name:, head_sha:, status: nil, # rubocop:disable Metrics/ParameterLists
13
+ conclusion: nil, output: nil, details_url: nil, **)
14
+ payload = { name: name, head_sha: head_sha, status: status,
15
+ conclusion: conclusion, output: output, details_url: details_url }.compact
16
+ response = connection(owner: owner, repo: repo, **).post(
17
+ "/repos/#{owner}/#{repo}/check-runs", payload
18
+ )
19
+ { result: response.body }
20
+ end
21
+
22
+ def update_check_run(owner:, repo:, check_run_id:, **opts)
23
+ payload = opts.slice(:name, :status, :conclusion, :output, :details_url,
24
+ :started_at, :completed_at)
25
+ response = connection(owner: owner, repo: repo, **opts).patch(
26
+ "/repos/#{owner}/#{repo}/check-runs/#{check_run_id}", payload
27
+ )
28
+ { result: response.body }
29
+ end
30
+
31
+ def get_check_run(owner:, repo:, check_run_id:, **)
32
+ response = connection(owner: owner, repo: repo, **).get(
33
+ "/repos/#{owner}/#{repo}/check-runs/#{check_run_id}"
34
+ )
35
+ { result: response.body }
36
+ end
37
+
38
+ def list_check_runs_for_ref(owner:, repo:, ref:, check_name: nil, status: nil,
39
+ per_page: 30, page: 1, **)
40
+ params = { check_name: check_name, status: status,
41
+ per_page: per_page, page: page }.compact
42
+ response = connection(owner: owner, repo: repo, **).get(
43
+ "/repos/#{owner}/#{repo}/commits/#{ref}/check-runs", params
44
+ )
45
+ { result: response.body }
46
+ end
47
+
48
+ def list_check_suites_for_ref(owner:, repo:, ref:, per_page: 30, page: 1, **)
49
+ params = { per_page: per_page, page: page }
50
+ response = connection(owner: owner, repo: repo, **).get(
51
+ "/repos/#{owner}/#{repo}/commits/#{ref}/check-suites", params
52
+ )
53
+ { result: response.body }
54
+ end
55
+
56
+ def get_check_suite(owner:, repo:, check_suite_id:, **)
57
+ response = connection(owner: owner, repo: repo, **).get(
58
+ "/repos/#{owner}/#{repo}/check-suites/#{check_suite_id}"
59
+ )
60
+ { result: response.body }
61
+ end
62
+
63
+ def rerequest_check_suite(owner:, repo:, check_suite_id:, **)
64
+ response = connection(owner: owner, repo: repo, **).post(
65
+ "/repos/#{owner}/#{repo}/check-suites/#{check_suite_id}/rerequest"
66
+ )
67
+ { result: [201, 204].include?(response.status) }
68
+ end
69
+
70
+ def list_check_run_annotations(owner:, repo:, check_run_id:, per_page: 30, page: 1, **)
71
+ params = { per_page: per_page, page: page }
72
+ response = connection(owner: owner, repo: repo, **).get(
73
+ "/repos/#{owner}/#{repo}/check-runs/#{check_run_id}/annotations", params
74
+ )
75
+ { result: response.body }
76
+ end
77
+
78
+ include Legion::Extensions::Helpers::Lex if Legion::Extensions.const_defined?(:Helpers, false) &&
79
+ Legion::Extensions::Helpers.const_defined?(:Lex, false)
80
+ end
81
+ end
82
+ end
83
+ end
84
+ 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,35 @@ module Legion
8
9
  module Runners
9
10
  module Comments
10
11
  include Legion::Extensions::Github::Helpers::Client
12
+ include Legion::Extensions::Github::Helpers::Cache
11
13
 
12
14
  def list_comments(owner:, repo:, issue_number:, per_page: 30, page: 1, **)
13
15
  params = { per_page: per_page, page: page }
14
- response = connection(**).get("/repos/#{owner}/#{repo}/issues/#{issue_number}/comments", params)
15
- { result: response.body }
16
+ { result: cached_get("github:repo:#{owner}/#{repo}:issues:#{issue_number}:comments:#{page}:#{per_page}") do
17
+ connection(owner: owner, repo: repo, **).get("/repos/#{owner}/#{repo}/issues/#{issue_number}/comments", params).body
18
+ end }
16
19
  end
17
20
 
18
21
  def get_comment(owner:, repo:, comment_id:, **)
19
- response = connection(**).get("/repos/#{owner}/#{repo}/issues/comments/#{comment_id}")
20
- { result: response.body }
22
+ { result: cached_get("github:repo:#{owner}/#{repo}:comments:#{comment_id}") do
23
+ connection(owner: owner, repo: repo, **).get("/repos/#{owner}/#{repo}/issues/comments/#{comment_id}").body
24
+ end }
21
25
  end
22
26
 
23
27
  def create_comment(owner:, repo:, issue_number:, body:, **)
24
- response = connection(**).post("/repos/#{owner}/#{repo}/issues/#{issue_number}/comments", { body: body })
28
+ response = connection(owner: owner, repo: repo, **).post("/repos/#{owner}/#{repo}/issues/#{issue_number}/comments", { body: body })
25
29
  { result: response.body }
26
30
  end
27
31
 
28
32
  def update_comment(owner:, repo:, comment_id:, body:, **)
29
- response = connection(**).patch("/repos/#{owner}/#{repo}/issues/comments/#{comment_id}", { body: body })
33
+ response = connection(owner: owner, repo: repo, **).patch("/repos/#{owner}/#{repo}/issues/comments/#{comment_id}", { body: body })
34
+ cache_write("github:repo:#{owner}/#{repo}:comments:#{comment_id}", response.body) if response.body['id']
30
35
  { result: response.body }
31
36
  end
32
37
 
33
38
  def delete_comment(owner:, repo:, comment_id:, **)
34
- response = connection(**).delete("/repos/#{owner}/#{repo}/issues/comments/#{comment_id}")
39
+ response = connection(owner: owner, repo: repo, **).delete("/repos/#{owner}/#{repo}/issues/comments/#{comment_id}")
40
+ cache_invalidate("github:repo:#{owner}/#{repo}:comments:#{comment_id}") if response.status == 204
35
41
  { result: response.status == 204 }
36
42
  end
37
43
 
@@ -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,23 +9,27 @@ module Legion
8
9
  module Runners
9
10
  module Commits
10
11
  include Legion::Extensions::Github::Helpers::Client
12
+ include Legion::Extensions::Github::Helpers::Cache
11
13
 
12
14
  def list_commits(owner:, repo:, sha: nil, per_page: 30, page: 1, **)
13
15
  params = { per_page: per_page, page: page }
14
16
  params[:sha] = sha if sha
15
- response = connection(**).get("/repos/#{owner}/#{repo}/commits", params)
16
- { result: response.body }
17
+ { result: cached_get("github:repo:#{owner}/#{repo}:commits:#{sha}:#{page}:#{per_page}") do
18
+ connection(owner: owner, repo: repo, **).get("/repos/#{owner}/#{repo}/commits", params).body
19
+ end }
17
20
  end
18
21
 
19
22
  def get_commit(owner:, repo:, ref:, **)
20
- response = connection(**).get("/repos/#{owner}/#{repo}/commits/#{ref}")
21
- { result: response.body }
23
+ { result: cached_get("github:repo:#{owner}/#{repo}:commits:#{ref}") do
24
+ connection(owner: owner, repo: repo, **).get("/repos/#{owner}/#{repo}/commits/#{ref}").body
25
+ end }
22
26
  end
23
27
 
24
28
  def compare_commits(owner:, repo:, base:, head:, per_page: 30, page: 1, **)
25
29
  params = { per_page: per_page, page: page }
26
- response = connection(**).get("/repos/#{owner}/#{repo}/compare/#{base}...#{head}", params)
27
- { result: response.body }
30
+ { result: cached_get("github:repo:#{owner}/#{repo}:commits:compare:#{base}...#{head}:#{page}:#{per_page}") do
31
+ connection(owner: owner, repo: repo, **).get("/repos/#{owner}/#{repo}/compare/#{base}...#{head}", params).body
32
+ end }
28
33
  end
29
34
 
30
35
  include Legion::Extensions::Helpers::Lex if Legion::Extensions.const_defined?(:Helpers, false) &&
@@ -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,9 +9,10 @@ module Legion
8
9
  module Runners
9
10
  module Contents
10
11
  include Legion::Extensions::Github::Helpers::Client
12
+ include Legion::Extensions::Github::Helpers::Cache
11
13
 
12
14
  def commit_files(owner:, repo:, branch:, files:, message:, **)
13
- conn = connection(**)
15
+ conn = connection(owner: owner, repo: repo, **)
14
16
 
15
17
  ref = conn.get("/repos/#{owner}/#{repo}/git/ref/heads/#{branch}")
16
18
  commit_sha = ref.body.dig('object', 'sha')
@@ -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,31 +9,35 @@ 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
 
@@ -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,38 +9,44 @@ 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
 
@@ -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,42 +9,48 @@ 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
 
@@ -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,26 +9,27 @@ 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
35
  include Legion::Extensions::Helpers::Lex if Legion::Extensions.const_defined?(:Helpers, false) &&
@@ -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,57 +9,66 @@ 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